From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/eqexam/README.md | 72 + macros/latex/contrib/eqexam/aebrandom.def | 169 + macros/latex/contrib/eqexam/doc/eqexamman.pdf | Bin 0 -> 657946 bytes macros/latex/contrib/eqexam/doc/eqexamman.tex | 5146 ++++++++++ .../contrib/eqexam/doc/fortextbook/fortextbook.pdf | Bin 0 -> 577912 bytes macros/latex/contrib/eqexam/eqecus.opt | 12 + macros/latex/contrib/eqexam/eqexam.def | 1734 ++++ macros/latex/contrib/eqexam/eqexam.dtx | 9697 +++++++++++++++++++ macros/latex/contrib/eqexam/eqexam.ins | 63 + macros/latex/contrib/eqexam/examples/coorplane.eps | 9923 ++++++++++++++++++++ macros/latex/contrib/eqexam/examples/coorplane.pdf | Bin 0 -> 32512 bytes .../contrib/eqexam/examples/eqex_solnsonly.pdf | Bin 0 -> 24092 bytes .../contrib/eqexam/examples/eqex_solnsonly.tex | 121 + macros/latex/contrib/eqexam/examples/fig1.bb | 5 + macros/latex/contrib/eqexam/examples/fig1.eps | Bin 0 -> 831714 bytes macros/latex/contrib/eqexam/examples/fig1.jpg | Bin 0 -> 33479 bytes macros/latex/contrib/eqexam/examples/fig1.pdf | Bin 0 -> 12673 bytes .../contrib/eqexam/examples/flextended-opt.pdf | Bin 0 -> 28355 bytes .../contrib/eqexam/examples/flextended-opt.tex | 106 + macros/latex/contrib/eqexam/examples/graph.eps | 9158 ++++++++++++++++++ macros/latex/contrib/eqexam/examples/graph.pdf | Bin 0 -> 27764 bytes macros/latex/contrib/eqexam/examples/hw.cfg | 12 + macros/latex/contrib/eqexam/examples/hw.cfg.txt | 12 + macros/latex/contrib/eqexam/examples/hw01.pdf | Bin 0 -> 31305 bytes macros/latex/contrib/eqexam/examples/hw01.tex | 166 + macros/latex/contrib/eqexam/examples/hw02.pdf | Bin 0 -> 32852 bytes macros/latex/contrib/eqexam/examples/hw02.tex | 143 + macros/latex/contrib/eqexam/examples/hw03.pdf | Bin 0 -> 21745 bytes macros/latex/contrib/eqexam/examples/hw03.tex | 72 + macros/latex/contrib/eqexam/examples/markqs.pdf | Bin 0 -> 22192 bytes macros/latex/contrib/eqexam/examples/markqs.tex | 177 + macros/latex/contrib/eqexam/examples/quiz.cfg | 7 + macros/latex/contrib/eqexam/examples/quiz.cfg.txt | 7 + macros/latex/contrib/eqexam/examples/quiz01.tex | 126 + macros/latex/contrib/eqexam/examples/quiz02.pdf | Bin 0 -> 34997 bytes macros/latex/contrib/eqexam/examples/quiz02.tex | 146 + .../contrib/eqexam/examples/selectversion_tst.tex | 221 + macros/latex/contrib/eqexam/examples/test01.tex | 448 + macros/latex/contrib/eqexam/examples/test02.pdf | Bin 0 -> 216104 bytes macros/latex/contrib/eqexam/examples/test02.tex | 370 + macros/latex/contrib/eqexam/examples/test03.pdf | Bin 0 -> 256124 bytes macros/latex/contrib/eqexam/examples/test03.tex | 581 ++ .../contrib/eqexam/examples/test_matching.pdf | Bin 0 -> 18253 bytes .../contrib/eqexam/examples/test_matching.tex | 92 + .../latex/contrib/eqexam/examples/tex_survey.tex | 537 ++ .../latex/contrib/eqexam/examples/tex_survey_h.tex | 551 ++ macros/latex/contrib/eqexam/script/eqAttach.asp | 202 + 47 files changed, 40076 insertions(+) create mode 100644 macros/latex/contrib/eqexam/README.md create mode 100644 macros/latex/contrib/eqexam/aebrandom.def create mode 100644 macros/latex/contrib/eqexam/doc/eqexamman.pdf create mode 100644 macros/latex/contrib/eqexam/doc/eqexamman.tex create mode 100644 macros/latex/contrib/eqexam/doc/fortextbook/fortextbook.pdf create mode 100644 macros/latex/contrib/eqexam/eqecus.opt create mode 100644 macros/latex/contrib/eqexam/eqexam.def create mode 100644 macros/latex/contrib/eqexam/eqexam.dtx create mode 100644 macros/latex/contrib/eqexam/eqexam.ins create mode 100644 macros/latex/contrib/eqexam/examples/coorplane.eps create mode 100644 macros/latex/contrib/eqexam/examples/coorplane.pdf create mode 100644 macros/latex/contrib/eqexam/examples/eqex_solnsonly.pdf create mode 100644 macros/latex/contrib/eqexam/examples/eqex_solnsonly.tex create mode 100644 macros/latex/contrib/eqexam/examples/fig1.bb create mode 100644 macros/latex/contrib/eqexam/examples/fig1.eps create mode 100644 macros/latex/contrib/eqexam/examples/fig1.jpg create mode 100644 macros/latex/contrib/eqexam/examples/fig1.pdf create mode 100644 macros/latex/contrib/eqexam/examples/flextended-opt.pdf create mode 100644 macros/latex/contrib/eqexam/examples/flextended-opt.tex create mode 100644 macros/latex/contrib/eqexam/examples/graph.eps create mode 100644 macros/latex/contrib/eqexam/examples/graph.pdf create mode 100644 macros/latex/contrib/eqexam/examples/hw.cfg create mode 100644 macros/latex/contrib/eqexam/examples/hw.cfg.txt create mode 100644 macros/latex/contrib/eqexam/examples/hw01.pdf create mode 100644 macros/latex/contrib/eqexam/examples/hw01.tex create mode 100644 macros/latex/contrib/eqexam/examples/hw02.pdf create mode 100644 macros/latex/contrib/eqexam/examples/hw02.tex create mode 100644 macros/latex/contrib/eqexam/examples/hw03.pdf create mode 100644 macros/latex/contrib/eqexam/examples/hw03.tex create mode 100644 macros/latex/contrib/eqexam/examples/markqs.pdf create mode 100644 macros/latex/contrib/eqexam/examples/markqs.tex create mode 100644 macros/latex/contrib/eqexam/examples/quiz.cfg create mode 100644 macros/latex/contrib/eqexam/examples/quiz.cfg.txt create mode 100644 macros/latex/contrib/eqexam/examples/quiz01.tex create mode 100644 macros/latex/contrib/eqexam/examples/quiz02.pdf create mode 100644 macros/latex/contrib/eqexam/examples/quiz02.tex create mode 100644 macros/latex/contrib/eqexam/examples/selectversion_tst.tex create mode 100644 macros/latex/contrib/eqexam/examples/test01.tex create mode 100644 macros/latex/contrib/eqexam/examples/test02.pdf create mode 100644 macros/latex/contrib/eqexam/examples/test02.tex create mode 100644 macros/latex/contrib/eqexam/examples/test03.pdf create mode 100644 macros/latex/contrib/eqexam/examples/test03.tex create mode 100644 macros/latex/contrib/eqexam/examples/test_matching.pdf create mode 100644 macros/latex/contrib/eqexam/examples/test_matching.tex create mode 100644 macros/latex/contrib/eqexam/examples/tex_survey.tex create mode 100644 macros/latex/contrib/eqexam/examples/tex_survey_h.tex create mode 100644 macros/latex/contrib/eqexam/script/eqAttach.asp (limited to 'macros/latex/contrib/eqexam') diff --git a/macros/latex/contrib/eqexam/README.md b/macros/latex/contrib/eqexam/README.md new file mode 100644 index 0000000000..e9938167e5 --- /dev/null +++ b/macros/latex/contrib/eqexam/README.md @@ -0,0 +1,72 @@ +The eqexam Package +Dated: 2019-01-31 +Author: D. P. Story + +eqExam is a LaTeX package for writing exams, tests, quizzes, +homework assignments, etc. It is a stand alone package, yet is +tightly integrated with the AcroTeX eDucation Bundle (AeB). Highlights of +this package are as follows: + + 1. Can create exams (tests, quizzes, homework assignments) for + paper, with points in the left or right margins (or both), totals + for each page optionally shown at the bottom corner of each page. + Questions can be objective, fill-in, true false, or multiple + choice. + 2. Solutions can optionally be included in the source file, and + by changing options, can be displayed (for an answer key), in a + couple of different ways. A solutions only document can also be + generated. + 3. Can create multi-part exams, as I often do for final exams, these + multiple exams are meant to be graded individually. + 4. The one thing that distinguishes this package from the other + exam package is its support for PDF, and this is where AeB comes + in. When you have AeB installed, and you select any of + several options (pdf, links, online or email), a variety of + things can happen. For example, in the case of the online or + email options, white space for solutions is converted into + multi-line text field, spaces to fill in answers are converted to + text fields,multiple choice questions are converted into radio + button fields, etc. When the email option is used, a "Submit" + button is automatically created at the top of the first page of + the test. The student can take the test online (perhaps in a + testing lab) then submit responses to the instructor. The email + that is generated to the instructor attaches the FDF file of + form data, so the instructor gets a copy of all responses. + She/He can then open the file and view the responses of the + student. Get the latest AeB (AcroTeX eDucation Bundle, + web,exerquiz,etc) + 5. A major option, fortextbook, is designed to support (U.S.) textbook + authors. Documentation for this option is found in the doc/fortextbook + folder. See also the series of blogs at + http://www.acrotex.net/blog/?tag=fortextbook + +What's New (2019-01-31) Package uses aeb-comment, an older version of the comment +package. The newer version has some incompatibilities with eqexam. + +What's New (2018-12-13) Changes to support the mi-solns package + +What's New (2018-04-15) Minor bug fixes + +What's New (2018-02-19): Extended the vertical space fill types +and added \fillineol. Refer to the table of contents under Sections 10.11 +and 10.12. + +Sample files, previous distributed with eqexam are now available from + + http://www.acrotex.net/blog/?cat=107 +and + http://www.acrotex.net/blog/?tag=eqexam-package + +The home page for eqexam is + + http://www.math.uakron.edu/~dpstory/eqexam.html + +The home page for AeB is + + http://www.math.uakron.edu/~dpstory/webeq.html + +Comments and suggestions are always gratefully accepted and seriously +considered. + +D. P. Story + diff --git a/macros/latex/contrib/eqexam/aebrandom.def b/macros/latex/contrib/eqexam/aebrandom.def new file mode 100644 index 0000000000..66271ebd37 --- /dev/null +++ b/macros/latex/contrib/eqexam/aebrandom.def @@ -0,0 +1,169 @@ +%% +%% This is file `aebrandom.def', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% exerquiz.dtx (with options: `copyright,randomize') +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Exerquiz.sty package, %% +%% Copyright (C) 1999-2018 D. P. Story %% +%% dpstory@uakron.edu %% +%% %% +%% This program can redistributed and/or modified under %% +%% the terms of the LaTeX Project Public License %% +%% Distributed from CTAN archives in directory %% +%% macros/latex/base/lppl.txt; either version 1 of the %% +%% License, or (at your option) any later version. %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\ProvidesFile{aebrandom.def} + [2019/02/11 v8.2.9 % + Exerquiz support for randomization (dps)] +\@ifundefined{nextrandom}{\input{random.tex}}{} +\def\nextrandom{\begingroup + \ifnum\randomi<\@ne % then initialize with time + \global\randomi\time + \global\multiply\randomi388 \global\advance\randomi\year + \global\multiply\randomi31 \global\advance\randomi\day + \global\multiply\randomi97 \global\advance\randomi\month + \message{Randomizer initialized to \the\randomi.}% + \nextrandom \nextrandom \nextrandom + \xdef\InitSeedValue{\the\randomi}% + \fi + \count@ii\randomi + \divide\count@ii 127773 % modulus = multiplier * 127773 + 2836 + \count@\count@ii + \multiply\count@ii 127773 + \global\advance\randomi-\count@ii % random mod 127773 + \global\multiply\randomi 16807 + \multiply\count@ 2836 + \global\advance\randomi-\count@ + \ifnum\randomi<\z@ \global\advance\randomi 2147483647\relax\fi + \endgroup +} +\def\writeSeedToSolnFile{\writeT@ExSolns{\string\randomi=\the\randomi}} +\def\@ansChoices[#1]% +{% + \global\let\@tempholdSaveAns\@empty % 5/24 + \global\let\@tempholdSaveChoice\@empty % 5/24 + \global\let\bChoiceLabel\@empty % 5/24 + \ifeq@randomizeallChoices + \setkeys{bchoice}{#1,random=true}\else + \setkeys{bchoice}{#1}\fi + \global\eq@tabColCnt=0 + \ifeq@randomizeChoices\expandafter\@@bChoices + \else\expandafter\@@ansChoices\fi +} +\def\@@ansChoices{% + \ifnum\aeb@numCols=1 % list mode + \def\eq@next{\@layoutListAns}% + \else % tabular mode + \edef\eq@next{\noexpand\@layoutTabularAns{\bChoiceNumCols}}% + \fi + \eq@next +} +\newcount\aeb@numChoices +\newcount\aeb@ranChoice +\newtoks\aeb@hold\aeb@hold={} +\def\@@bChoices{\gdef\@temphold{}\gdef\@tempholdrandom{}% + \gdef\@tempholdfreeze{}\aeb@searchfortoken{\@getAns}% +} +\def\aeb@searchfortoken#1{% + \@ifnextchar\Ans{\advance\aeb@numChoices1\relax#1} + {\@ifnextchar\eFreeze{\expandafter\@getFreezeAns\@gobble} + {\@ifnextchar\par{\def\@@temp{\aeb@searchfortoken{#1}}% + \expandafter\@@temp\@gobble}{\@eChoices}}}% +} +\long\def\@getAns\Ans#1\eAns{% + \g@addto@macro\@temphold{{\Ans#1\eAns}}% + \aeb@searchfortoken{\@getAns}% +} +\def\@getFreezeAns{\aeb@searchfortoken{\@@getFreezeAns}} +\long\def\@@getFreezeAns\Ans#1\eAns{% + \g@addto@macro\@tempholdfreeze{\Ans#1\eAns}% + \aeb@searchfortoken{\@@getFreezeAns}% +} +\long\def\@eChoices#1\eChoices{% + \aeb@randomizeChoices{\the\aeb@numChoices}% +} +\def\aeb@randomizeChoices#1{% + \setrannum{\aeb@ranChoice}{1}{#1} + \count0=0 \aeb@hold=\expandafter{\@temphold}\def\@temphold{}% + \expandafter\@tfor\expandafter + \@temp\expandafter:\expandafter=\the\aeb@hold \do {% + \advance\count0by1 + \ifnum\count0=\aeb@ranChoice + \aeb@hold=\expandafter\expandafter\expandafter + {\expandafter\@tempholdrandom\@temp}% + \edef\@tempholdrandom{\the\aeb@hold}% + \else + \aeb@hold=\expandafter\expandafter\expandafter + {\expandafter\@temphold\expandafter{\@temp}}% + \edef\@temphold{\the\aeb@hold}% + \fi + }% + \aeb@numChoices=#1 + \advance\aeb@numChoices-1 + \ifnum\aeb@numChoices=0\relax + \def\aeb@next{\aeb@finishedRandomizing}\else + \def\aeb@next{\aeb@randomizeChoices{\the\aeb@numChoices}}\fi + \aeb@next +} +\def\aeb@finishedRandomizing{% + \aeb@hold=\expandafter\expandafter\expandafter + {\expandafter\@tempholdrandom\@tempholdfreeze}% + \gdef\@temphold{}\gdef\@tempholdrandom{}\gdef\@tempholdfreeze{}% + \edef\finished@Randomizing{% + \noexpand\@@ansChoices + \the\aeb@hold + \noexpand\eChoices}% + \finished@Randomizing +} +\def\saveRandomSeed{\PackageInfo{exerquiz} + {The command \string\saveRandomSeed\space + is deprecated.\MessageBreak Seed automatically saved}} +\@ifpackageloaded{ran_toks}{% + \let\inputRandomSeed\useLastAsSeed + \let\useRandomSeed\useThisSeed +}{% + \def\inputRandomSeed{\eq@readRandomData}% + \def\useRandomSeed#1{\saveseedfalse\randomi=#1}% +} +\def\InitSeedValue{\the\randomi} % dps +\@ifundefined{ifsaveseed}{\newif\ifsaveseed\saveseedtrue}{} % dps +\def\eq@writeRandomData +{% + \ifsaveseed + \@ifundefined{saveseedinfo}{\newwrite\saveseedinfo}{} + \immediate\openout \saveseedinfo \jobname_rt.sav + \let\verbatim@out\saveseedinfo + \def\eqrt@msgi{initializing seed value}% + \def\eqrt@msgii{last random number used}% + \uccode`c=`\%\uppercase{% + \immediate\write\verbatim@out + {\InitSeedValue\space c \eqrt@msgi}% + \immediate\write\verbatim@out + {\the\randomi\space c \eqrt@msgii}% + }\immediate\closeout\saveseedinfo + \fi +} +\AtEndDocument{\eq@writeRandomData} +\def\eq@readRandomData{\IfFileExists{\jobname_rt.sav}{% + \PackageInfo{exerquiz}{Inputting \jobname_rt.sav}% + \@ifundefined{readsavfile}{\newread\readsavfile}{}% + \openin\readsavfile=\jobname_rt.sav + \read\readsavfile to \InitSeedValue + \read\readsavfile to \eqlastRandomNum + \closein\readsavfile + \randomi=\eqlastRandomNum + \xdef\InitSeedValue{\the\randomi}% + \immediate\closeout\readsavfile +}{% + \PackageInfo{exerquiz}{\jobname_rt.sav cannot + be found, \MessageBreak + using the random initializer}% +}} +\endinput +%% +%% End of file `aebrandom.def'. diff --git a/macros/latex/contrib/eqexam/doc/eqexamman.pdf b/macros/latex/contrib/eqexam/doc/eqexamman.pdf new file mode 100644 index 0000000000..328c13ee1f Binary files /dev/null and b/macros/latex/contrib/eqexam/doc/eqexamman.pdf differ diff --git a/macros/latex/contrib/eqexam/doc/eqexamman.tex b/macros/latex/contrib/eqexam/doc/eqexamman.tex new file mode 100644 index 0000000000..749ddd0698 --- /dev/null +++ b/macros/latex/contrib/eqexam/doc/eqexamman.tex @@ -0,0 +1,5146 @@ +\documentclass{article} +%\usepackage{makeidx,showidx} +\usepackage[fleqn]{amsmath} +\usepackage{graphicx} +\usepackage[ + web={designv, + latextoc,forcolorpaper, + centertitlepage}, + eforms +]{aeb_pro} +\usepackage[bypasspkgpagestyle,nomarginwrite,usecustomdesign, + useclassmaketitle,flextended +]{eqexam} +%\usepackage[designv, +% latextoc,forcolorpaper, +% centertitlepage]{web} +%\usepackage{eforms} + +%\usepackage[nopoints,fortextbook,nomarginwrite,usecustomdesign]{eqexam} +%\usepackage{longtable,colortbl} +%\useFullWidthForPaper + +\usepackage{eqexaman} + +\usepackage{srcltx} + +\hfuzz=1pt + + +\def\AEBBook{\textsl{{Acro\!\TeX} eDucation System Tools: {\LaTeX} for interactive PDF documents}} +\def\AEBP{\textsf{AeB Pro}} + +\DeclareFontFamily{U}{wi}{} +\DeclareFontShape{U}{wi}{m}{n}{<-> wingding}{} +\DeclareFontFamily{U}{webd}{} +\DeclareFontShape{U}{webd}{m}{n}{<-> webdings}{} + +\font\zqacr=zqacr at 8pt + +\newcommand\Com[2][]{\texttt{#2}} +\newcommand\sCom[2][]{} +\newif\ifusebw \usebwfalse + +\setlength{\mathindent}{\leftmargini} + +\edef\amtIndent{\the\parindent} + +%\def\meta#1{\textit{$\langle$#1$\rangle$}} + +\makeatletter + +\let\ipkg\@gobble +%\def\numberline#1{{\setlength{\fboxsep}{0pt}\fbox{\hb@xt@\@tempdima{#1\hfil}}}} + +%\renewcommand*\l@section{\addvspace{2pt}\@dottedtocline{1}{1.5em}{2.5em}} +\renewcommand*\l@subsection{\addvspace{1pt}\@dottedtocline{2}{1.5em}{3em}} +\renewcommand*\l@subsubsection{\addvspace{1pt}\@dottedtocline{3}{4.5em}{1.2em}} + +%\renewcommand*\l@subsubsection{\addvspace{1pt}\@dottedtocline{3}{7.4em}{1.2em}} + +%\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}} +%\renewcommand*\l@subsection{\@dottedtocline{2}{4.8em}{3.4em}} +%\renewcommand*\l@subsubsection{\@dottedtocline{3}{8.2em}{1.2em}} +%\renewcommand*\l@subsubsection{\@dottedtocline{3}{7em}{1.2em}} + +\renewcommand{\paragraph} + {\@startsection{paragraph}{4}{0pt}{6pt}{-3pt} + {\normalfont\normalsize\bfseries}} +\renewcommand{\subparagraph} + {\@startsection{subparagraph}{5}{\parindent}{6pt}{-3pt}% + {\normalfont\normalsize\bfseries}} + +\newcommand{\exAeBBlogPDF}[2][\urlAcroTeXBlog/]{\par\ifdim\lastskip>0pt\relax\vskip-\lastskip\fi +\vskip\medskipamount\noindent\makebox[0pt][r]{% + \makebox[0pt][l]{\textcolor{blue}{\Pisymbol{webd}{254}}}% + \raisebox{-2pt}{\color{red}\href{#1?#2}{{\zqacr b\hspace{9.5pt}}}}\enspace}\ignorespaces} + +\newcommand{\exAeBBlogArticle}[2][\urlAcroTeXBlog/]{\par\ifdim\lastskip>0pt\relax\vskip-\lastskip\fi +\vskip\medskipamount\noindent\makebox[0pt][r]{\makebox[0pt][l]{\hspace{-1pt}\textcolor{blue}{\Pisymbol{webd}{254}}}% +\raisebox{.5pt}{\color{red}\href{#1?#2}{\ding{045}}\hspace{7.5pt}\enspace}}\ignorespaces} +\definePath{\urlAcroTeXBlog}{http://www.acrotex.net/blog} + +\renewcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont #1} +\newcommand{\aebDescriptionlabel}[1]{% + \setlength\dimen@{\amtIndent+\labelsep}% + {\hspace*{\dimen@}#1}} +\makeatother +\newenvironment{aebDescript} + {\begin{list}{}{\setlength{\labelwidth}{0pt}% + \setlength{\leftmargin}{\leftmargin}% + \setlength{\leftmargin}{\leftmargin+\amtIndent}% + \setlength\itemindent{-\leftmargin}% + \let\makelabel\aebDescriptionlabel + }}{\end{list}} + +\def\hardspace{{\fontfamily{cmtt}\selectfont\symbol{32}}} +\def\AcroBlog{{Acro\!\TeX} Blog} +\newlength{\aebdimen} +\def\anglemeta#1{$\langle\textit{\texttt{#1}}\rangle$} +\let\ameta\anglemeta +\def\meta#1{\textit{\texttt{#1}}} +\let\pkg\textsf +\let\env\texttt +\let\opt\texttt +\let\app\textsf +\def\lp{(}\def\rp{)} +\def\AEB{\textsf{AeB}} +\def\AcroTeX{Acro\!\TeX} +\def\HTML{HTML}\def\FDF{FDF} +\def\PDF{PDF}\def\URL{URL} +%\let\amtIndent\leftmargini +\def\bNH{\begin{NoHyper}}\def\eNH{\end{NoHyper}} +\def\nhnameref#1{\bNH\nameref{#1}\eNH} +\def\nhNameref#1{\bNH\Nameref{#1}\eNH} +\def\nhurl#1{\bNH\url{#1}\eNH} +\def\grayV#1{\textcolor{gray}{#1}} +\def\darg#1{\{#1\}} +\def\parboxValign{t} +\renewcommand*{\backrefalt}[4]{% + \ifcase #1\or + See page~#2.\else See pages~#2.\fi +} +\newenvironment{aebQuote} + {\list{}{\leftmargin\amtIndent}% + \item\relax}{\endlist} +\newcommand{\FmtMP}[2][0pt]{\mbox{}\marginpar{% + \raisebox{.5\baselineskip+#1}{% + \expandafter\parbox\expandafter[\parboxValign]% + {\marginparwidth}{\aebbkFmtMp#2}}}} +\def\aebbkFmtMp{\kern0pt\itshape\small + \ifusebw\color{gray}\else\color{blue}\fi + \raggedleft\hspace{0pt}} +\def\dps{$\mbox{$\mathfrak D$\kern-.3em\mbox{$\mathfrak P$}% + \kern-.6em \hbox{$\mathcal S$}}$} +\def\FitItIn{\eq@fititin} +\def\endredpoint{\FitItIn{{\large\ifusebw\color{black}\else\color{red}\fi$\blacktriangleleft$}}} + +\reversemarginpar + +%\makeindex + +\title[dps]{The \texorpdfstring{\textsf{eqexam} Package\\}{eqexam Package, } +part of the\texorpdfstring{\\}{ }\texorpdfstring{\AcroTeX}{AcroTeX} eDucation Bundle} +\author{D. P. Story} +\subject{% + A LaTeX package for creating Test, quizzes, both for paper and for + online use; supports writing problems sets for textbook authors.% +} +\keywords{LaTeX, hyperref, PDF, exercises, quizzes} +\university{{\AcroT} Software Development Team} +\email{dpstory@acrotex.net} +\version{5.1.4, 2019/01/31} % 2019/01/31 v5.1.4 +\copyrightyears{2005-\the\year} + +\renewcommand{\exsectitletext}{Solutions to exams in this manual} + + +\chngDocObjectTo{\newDO}{doc} +\begin{docassembly} +var titleOfManual="The eqexam Manual"; +var manualfilename="Manual_BG_Print_eqexam.pdf"; +var manualtemplate="Manual_BG_Brown.pdf"; // Blue, Green, Brown +var _pathToBlank="C:/Users/Public/Documents/ManualBGs/"+manualtemplate; +var doc; +var buildIt=false; +if ( buildIt ) { + console.println("Creating new " + manualfilename + " file."); + doc = \appopenDoc({cPath: _pathToBlank, bHidden: true}); + var _path=this.path; + var pos=_path.lastIndexOf("/"); + _path=_path.substring(0,pos)+"/"+manualfilename; + \docSaveAs\newDO ({ cPath: _path }); + doc.closeDoc(); + doc = \appopenDoc({cPath: manualfilename, oDoc:this, bHidden: true}); + f=doc.getField("ManualTitle"); + f.value=titleOfManual; + doc.flattenPages(); + \docSaveAs\newDO({ cPath: manualfilename }); + doc.closeDoc(); +} else { + console.println("Using the current "+manualfilename+" file."); +} +var _path=this.path; +var pos=_path.lastIndexOf("/"); +_path=_path.substring(0,pos)+"/"+manualfilename; +\addWatermarkFromFile({ + bOnTop:false, + bOnPrint:false, + cDIPath:_path +}); +\executeSave(); +\end{docassembly} + +\begin{document} + +\maketitle + +\tableofcontents + +\section{Forward} + +For the past several years (this year is \the\year), I've been writing a book +titled, +\begin{quote} +\AEBBook. +\end{quote} +The book~\cite{book:AEBB} covers {\AEB}, which includes the \pkg{eforms} +package, and {\AEBP} in \emph{great detail} and includes many examples to +illustrate concepts and techniques. Numerous new examples are available on +the CD-ROM that accompanies the book. + +During the time of the writing, each of the packages covered was examined, +bugs were fixed, and many new and major features were created. Any new +features developed in the course of writing the book are documented in the +book; however, they are \emph{not included in this documentation}. You can +either buy the yet-to-be-submitted book sometime in the future, or discover +the features by studying the DTX documentation of the program files. Sorry, +it took me three years to write the book, I don't want to spend another year +on this documentation. \verb!:-{)! + +\begin{flushright} +Dr. D. P. Story\\[3pt] +\today +\end{flushright} + +\section{Introduction} + +In my classroom work at The University of Akron, I've been using a +personal {\LaTeX} package, which is called \textsf{eqexam}, for creating +my in-class tests, quizzes, homework assignments, and review documents +(pre-tests/sample tests). In recent weeks---at the end of the Fall +Semester, 2004, and prior to the Spring Semester, 2005, I have filled the +mundane and boring days with work on \textsf{eqexam}, fixing and enhancing +it quite a bit. + +The \textsf{eqexam} package is a stand-alone for {\LaTeX}, but is also +tightly integrated with the {\cAcroEB}. \textsf{eqexam} will be +distributed by itself, as well as a part of the {\cAcroB}. The integration +with the {\AcroB} gives it many of the online features that users of the +Bundle are familiar with. + +\newtopic (Version 3.0 or later) The method of formatting an \textsf{eqexam} +document has changed, each \texttt{problem}/\texttt{problem*} environment +is now in a list environment, the \texttt{eqequestions} environment. This +environment is not normally used by the document author, but its +parameters may be redefined. The purpose of this reformatting, is to open +up \textsf{eqexam} for use by other packages. Textbook authors can now, I +hope, easily integrate \textsf{eqexam} into the custom book format +being used. + +\newtopic Let's have an overview of the package, with suggestions for +possible uses. +\begin{enumerate} + \item The first, and most obvious application of this package + is to create a \textcolor{blue}{pExam} or a + \textcolor{blue}{pQuiz}. (Here, the `\textcolor{blue}{p}' + prefix refers to \underline paper or \underline pulp; thus, we + can use \textsf{eqexam} to write paper Exams and/or pulp + Quizzes). You can write the questions and the solutions, and + publish (i.e., print the document on a printer) the exam/quiz + with no solutions---ready to be taken in class---, or {\LaTeX} + the source document with solutions listed after each question + to create an answer key, for your personal use, or for the use + by the class. + + \item So much for pulp. Now on to `\textcolor{blue}{e}' (for + electronic publication). In some of my classes, I put sample + questions (review tests) on the web as {\PDF} documents. In + this case, you can create a {\PDF} document without the + solutions, and give the class time to solve the problems; then + publish the document (in {\PDF} on the web) with solutions. + The solutions can appear immediately after the questions, or + can be accumulated at the end of the document. + + \item[] In the case where the solutions are at the end of the + document, you can add links from the question to the solution. + + \item[] Documents can be published with color (to enhance the + on screen appearance) or can be published in black and white, + meant to be printed. Or, you can do both: a screen + version and a paper version. + + \item By invoking the \texttt{online} option, the white space + left for hand-written answers to the questions become Acroform + multi-line text fields, multiple choice questions become radio + buttons, and fill-in questions also become text fields. The + student can bring up the exam, and take it at a computer (in a + CBT\footnote{Computer Based Testing.} lab). After the student + is finished, he/she can print out the exam, and submit it to + the instructor for traditional grading. + + \item Now, here is an exciting feature of the \textsf{eqexam} + package, that of email submittal! This feature is not too + useful for technical fields (i.e., mathematics related fields) + that require students to enter special symbols, but for some + academic disciplines (English, History, Sociology, Politics + and Government, etc.) this feature could be quite + exciting.\footnote{Of course, I am addressing now the some six + people worldwide in these fields that use {\LaTeX} and \PDF! + For you six, this feature is for you!} + + \item[] When you take the \texttt{email} option of + \textsf{eqexam}, as with the \texttt{online} option, the white + space left for hand-written answers to the questions become + Acroform multi-line text fields, multiple choice questions + become radio buttons, and fill-in questions also become text + fields. Additionally, a button is automatically provided to + submit by email the results of the test to the instructor. The + results arrive at the instructor's mailer as an {\FDF} + attachment. The instructor can open the {\FDF} and view in the + originating {\PDF} the responses given by the student. + + \item[] The instructor can print out the document and grade in + a traditional way, or if the instructor has + \textbf{Acrobat~Pro} or \textbf{Standard}, the instructor can + use mark-up annotations within the PDF, save a copy of the + students test to a class folder, and email a copy of the + students exam, marked up with grade.\footnote{Seems doubtful + that anyone at this time has the expertise to do this! But + it's available if anyone ever wants it.} + + \item[] If the exam is given for credit, it can be taken in a + secure lab. + + \item Perhaps a more reasonable application of this email + submission feature of \textsf{eqexam} is the building and + publication of surveys and questionnaires! Perhaps + teacher evaluations! The environments of \textsf{eqexam} can + be easily used to write surveys and questionnaires to + solicit the opinion of a target population. Responses are + emailed to the designated person, who can summarize them. + + \item[] By the way, speaking of summarizing results, a new + feature of \textbf{Acrobat Pro~7.0}, allows you to take a + folder of {\FDF} files, such as the ones created by email + submission, and extract all form fields and place results to a + comma-delimited file (\texttt{.csv}). This comma-delimited + file can be opened by a spreadsheet program and manipulated. + Cool. + + \item (08/05/11) Version 3.0 of \textsf{eqexam} has a major option, + \texttt{fortextbook},\footnote{The \texttt{fortextbook} option is briefly + described on page~\pageref*{fortextbook}.} designed to support (U.S.) + textbook authors. Documentation for this option is found in the + \texttt{doc/fortextbook} folder. See also the series of blogs at the + \ulSetLink{http://www.acrotex.net/blog/?tag=fortextbook}{{Acro\TeX} Blog}. + +\end{enumerate} + +%\subsection{What's New} +% +%\begin{enumerate} +% +% \item (Version 1.7) Added the ability to randomize items in a +% multiple choice/selection list. See \Nameref{s:random} and the +% \texttt{allowrandomize} option, as listed in \Nameref{eqoptions}. +% +% \item (Version 1.6) In this version, I've added the command +% \cs{thisterm} (see \Nameref{preamble}) and expanded the control of +% multiple versions. Now you can have up to $26$ versions of the same +% test! For details of this new multiple version scheme, see the +% discussion in \Nameref{mutiVerNew}. +% +% \item[] Also added are \cs{forproblem} and \cs{foritem}. See \mlNameref{solnSets}. +% +% \item (Version 1.4) Added a \texttt{manswers} environment for +% multiple choice questions where multiple selections are permitted. +% \textsf{Exerquiz} version 6.04 or greater is required with the +% \texttt{online} and \texttt{email} options. See the section +% \Nameref{multiSelect} for details. +% +% \item (Version 1.3) Added in the \cs{bChoices} and +% \cs{eChoices} pair for specifying multiple choice +% alternatives. See the brief discussion in +% the section \Nameref{multichoice}. +%\end{enumerate} + +\section{Required and Optional Packages} + +The following packages that are not part of the normal {\LaTeX} +distribution are \emph{required}: +\begin{enumerate} +\item \texttt{calc}: Used for calculation of the position of the + marginal points. + +\item \texttt{pifont}: Used when the \texttt{proofread} option is + used to indicate the correct answers to multiple choice questions. + +\item \texttt{aeb-comment}: Used to have optional content, useful for + developing exams for multiple sections of the same class.\footnote{\pkg{aeb-comment} + is an older version of the \pkg{comment} package by Victor Eijkhout; it is distributed + with the \pkg{acrotex} package.} + +\item \texttt{multicol}: Used to create questions in multi-column mode. + +\item \texttt{verbatim}: Used to write solutions to the hard drive. +\end{enumerate} + +\noindent Additionally, the following packages may be used +depending on the options chosen: +\begin{enumerate} +\item \texttt{web}: Used when the \texttt{pdf}, \texttt{links}, + \texttt{online} or the \texttt{email} option is taken. + +\item \texttt{exerquiz}: Used when the + \texttt{links}, \texttt{online} or the \texttt{email} option is + taken. +\end{enumerate} +Of course, \texttt{web} and \texttt{exerquiz}, in turn, input a +whole plethora of packages. Consult the documentation for the +\cAcroEB. + +\section{Installing \textsf{eqexam}} + +Create a folder in your \texttt{latex} search path named +\textsf{eqexam} and place the package files \texttt{eqexam.dtx}, +\texttt{eqexam.ins}, \texttt{eqexam.def} and any \texttt{.cfg} +files. (If you have an \texttt{acrotex} folder, you can place the +files there as well.) + +Next, \texttt{latex} \texttt{eqexam.ins} to create +\texttt{eqexam.sty} and \texttt{eqalone.def}. The other files +(\texttt{*.tex} and \texttt{*.pdf}) can be placed anywhere. + +The \textsf{eqexam} is a stand alone package that is tightly +integrated with the \cAcroB. The file \texttt{eqexam.def} comes +from the {\cAcroB} to provide the necessary support for many of +the commands and environments defined in \textsf{eqexam}. The file +\texttt{eqalone.def} are miscellaneous definitions that are needed +for the stand-alone version. When you choose one of the options +\texttt{links}, \texttt{online} or \texttt{email}, then +\textsf{Exerquiz} is included in the package files. When you use +one of these options you will need the most recent version of the +\cAcroEB, the one published concurrently with this package. + +\section{Demonstration files} + +\exAeBBlogPDF{cat=107} The original +\href{\urlAcroTeXBlog/?cat=107}{\pkg{eqexam} demonstration files} are posted +on the \href{\urlAcroTeXBlog/}{{Acro\TeX} Blog}. Throughout the manual, individual +files are references and a link is provided to that resource. The source file is attached +to all PDFs on the {Acro\TeX} Blog website. + +\exAeBBlogPDF{tag=eqexam-package} +Additional demonstration files developed after the original set are also available +from the {Acro\TeX} Blog. See the articles tagged as +\textit{\href{\urlAcroTeXBlog/?tag=eqexam-package}{eqexam-package}}. + +%http://www.acrotex.net/blog/?tag=eqexam-package + + +\section{Page Layout Considerations} + +With Version~3.0, you can design your own page layout scheme, perhaps to +conform to a book style. The following are some basics on formatting for +\textsf{eqexam}. + +The following two commands appear in \textsf{eqexam}, the first sets some basic +page parameters. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\newcommand{\eqeSetExamPageParams}{% + \setlength{\headheight}{12pt} + \setlength{\topmargin}{-.5in} + \setlength{\headsep}{20pt} + \setlength{\oddsidemargin}{0pt} + \setlength{\evensidemargin}{0pt} + \setlength{\marginparsep}{11pt} + \setlength{\marginparwidth}{35pt} + \setlength{\footskip}{11pt} +} +\end{Verbatim} +The second command calculates values for \cs{textwidth} and \cs{textheight} +based on the the settings of the first command. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\newcommand{\eqExamPageLayout}{% + \setlength\textwidth\paperwidth + \addtolength{\textwidth}{-2in} + \addtolength{\textwidth}{-\oddsidemargin} + \setlength\textheight{\paperheight} + \addtolength\textheight{-2in} + \addtolength\textheight{-\headheight} + \addtolength\textheight{-\headsep} + \addtolength\textheight{-\topmargin} + \addtolength\textheight{-\footskip} +} +\end{Verbatim} +When the package option \texttt{usecustomdesign} \textit{is not taken,} +then the two commands \cs{eqeSetExamPageParams} and \cs{eqExamPageLayout} +are executed immediately after the above definitions. These are the +original parameters used by \textsf{eqexam}, designed to yield a maximum +text body in which to typeset an exam. The margins are set at 1 inch, the +\cs{topmargin} is raised up, all to maximize space. + +Now, if the package option \texttt{usecustomdesign} is specified, the +commands \cs{eqeSet\-Exam\-Page\-Params} and \cs{eqExamPageLayout} are \emph{not +executed}, the package designer can either do a \cs{renewcommand} for +these two commands in the preamble with custom values inserted (and +execute \cs{eqeSetExamPageParams} and \cs{eqExamPageLayout}), or the +designer may use another package to set the page layout parameters (or +take the default of the class being used). In the latter case, +neither \cs{eqeSetExamPageParams} nor \cs{eqExamPageLayout} should be executed. + +\newtopic The following commands directly effect how the problems are +displayed within an \textsf{eqexam} environment. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\eqexammargin{\normalsize\normalfont\bfseries00.\ } +\end{Verbatim} +The command \cs{eqexammargin} is a convenient way of specifying the +\cs{labelwidth} as set by the \texttt{eqequestions} environment (see +below). The command uses \cs{settowidth} to set the \cs{eqemargin} length. +The \cs{eqemargin} may also be set directly with \cs{setlength}. +\cs{eqexammargin} can be executed anytime between exam environments (or +even between problems, though this is not a intuitive option). Normally it +is executed once for the entire document; but may be executed multiple +times to change margins. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\newcommand{\widthtpboxes}{35pt} +\end{Verbatim} +This command sets the width of the boxes that appear in the right margin +when one of more of the options \texttt{pointsonright}, +\texttt{pointsonboth}, \texttt{totalsonleft}, \texttt{totalsonright}, are +used. These boxes are used for exams, and not relevant for problem sets of +textbooks. Normally, this parameter is not redefined. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\newenvironment{eqequestions}{% + \begin{list}{}{% + \setlength{\labelwidth}{\eqemargin}% + \setlength{\topsep}{3pt}\setlength{\parsep}{0pt}% + \setlength{\itemindent}{0pt}\setlength{\itemsep}{3pt}% + \setlength{\leftmargin}{\labelwidth}% + \settowidth{\labelsep}{\ }% + }\item\relax}{\end{list}} +\end{Verbatim} +This environment is opened at the beginning of a \texttt{problem} +(\texttt{problem*}), and closed at the end of these environments. + +\section{Building an Exam} + +In this section, we outline the steps to create an exam using the +\textsf{eqexam} package. Consult the sample exams for additional +examples. + +\subsection{The Preamble}\label{preamble} + +Of course, we begin with the standard article class, and the +\textsf{eqexam} package: +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\documentclass{article} +\usepackage[!meta(options)]{eqexam} +\end{Verbatim} +\noindent The \meta{options} are discussed in +section~\ref{eqoptions}. Next comes a exam identification +information: +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\title[T1]{Test 1} +\subject[C1]{Calculus I} +\author{D. P. Story} +\keywords{Calculus I, Section 004} +\university{% + THE UNIVERSITY OF AKRON\\ + Mathematics and Computer Science +} +\date{\thisterm, \the\year} +\duedate{October 17, 2005} +\end{Verbatim} +\noindent The \cs{title}, \cs{subject}, \cs{author} and \cs{date} +are the same as is used in the \textsf{web} package. These are +used by the standard {\LaTeX} macro to create the heading line of +the first page of the exam, and are used in the running headers. + +The \cs{title}, \cs{subject} have optional first arguments, where +you can list a shorted version of the title or the subject. The +shortened versions, if present, are used in the running headers. + +The \cs{keywords} is used when you publish your exam in {\PDF} and +you use the \texttt{pdf} option (or \texttt{online}, \texttt{links}, +\texttt{email}). The value of the argument of \cs{keywords} appears +in the keywords field of the document info dialog. + +When you take the \texttt{coverpage} option, the value of +\cs{university} is used, along with some of the others on the +cover page. + +I've also defined a keyword of \cs{duedate}, this might be useful +when using \textsf{eqexam} to create homework assignments with a +due date, or just to record the date of the exam. The argument of \cs{duedate} fills the text macro +\cs{theduedate}. So that if you say \verb|\duedate{05/31/06}|, the macro +\cs{theduedate} will expand to `05/31/06'. + +\newtopic Beginning with version~1.6, \cs{thisterm} is defined. +The academic year of many American universities are divided into semesters +(or terms); Fall, Spring, and Summer. The command \cs{thisterm} takes the current +date and determines if it is the Fall, Spring or Summer Semester. For example, +if the date of the compile is October 17, 2005, then \verb!\thisterm, \the\year! +expands to `Fall, 2005'. This command is useful with the \cs{date} command. + +The command \cs{thisterm} can be redefined to conform to the terms +of the document author's university. See the definition in +\texttt{eqexam.dtx}, copy and modify it. + +\subsection{The \texttt{exam} Environment}\label{exam} + +An exam is contained within the \texttt{exam} environment. + +One of the things that I do in my courses, especially for the +final exam, is to have a two-part exam. Typically, the first part +is worth $100$ points and covers the new material not already +tested; the second part is usually a $50$ point review. I grade +these two parts separately and record them separately. Therefore, +an \textsf{eqexam} test may contain one or more \texttt{exam} +environments.\footnote{Remember, this was originally a personal +package, meant to suit my own needs.} + +\newtopic After the preamble, we then say +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{document} + +\maketitle + +\begin{exam}[Part I.]{Part1} + +\begin{instructions}[Part I.] +Solve each of the problems without error. If you make an error, +points will be subtracted from your total score. +\end{instructions} +... +... +... +\end{exam} + +\begin{exam}[Part II.]{Part2} + +\begin{instructions}[Part II.] +The following is a short review of previously mastered material. +\end{instructions} +... +... +... +\end{exam} +\end{document} +\end{Verbatim} +After the \verb+\begin{document}+ and standard \cs{maketitle}, we begin an +exam by opening an \texttt{exam} environment. + +\settowidth{\aebdimen}{\ttfamily\string\begin\darg{exam}[\meta{friendly\_name}]\darg{\meta{exam\_name}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\begin{exam}[!meta(friendly_name)]{!meta(exam_name)} +... +\end{exam} +\end{dCmd} +\noindent This environment has two arguments: the first optional, the second +required. The first argument is a user friendly name (used when the solutions +are listed at the end of the document when there are multiple \texttt{exam} +environments); the second required argument is the name of the of the exam, +\texttt{Part1} or \texttt{Part2}, for example. This argument is used to build +the names of the PDF Acroform field names. This argument should consist of +letters and numbers only. You can use the command \cs{autoExamName} for the +\meta{exam\_name}; this command will name each \texttt{exam} environment +\texttt{exam1}, \texttt{exam2}, \texttt{exam3}, etc. + +Following the opening of the exam, typically, the instructor would have +some instructions, this is the purpose of the \texttt{instructions} +environment. It has one optional argument, heading text for the +instructions; if this optional parameter is not provided, then the default +word is used, the default word is determined by \cs{defaultInstructions}, +its default definition is +\begin{Verbatim}[xleftmargin=\amtIndent] +\defaultInstructions{Instructions.} +\end{Verbatim} +Following this label, the total number of points for this part is +inserted, unless the \texttt{nosummarytotals} option is taken. + +\redpoint The optional argument of the \texttt{instructions} +environment has a color associated with it, and is visible when you +compile the document with the \texttt{forcolorpaper} option. This +color can be set by the command \cs{instructionsColor}; this command +takes a single argument, a named color: +\begin{Verbatim}[xleftmargin=\amtIndent] +\instructionsColor{blue} +\end{Verbatim} +\noindent The above is the default definition. + + +\newtopic At this point, you would insert your questions. Following the +listing of all the questions (and optionally, their solutions), you +finish up by closing out the \texttt{exam} environment. + +Repeat, if additional parts to the exam are desired. Finally, +finish off the document with \verb+\end{document}+. + +\redpoint You must \texttt{latex} your document \emph{three times} to be +sure all points have been properly calculated. + +\subsection{The \texttt{problem} and \texttt{problem*} Environments} + +All questions are posed using the \texttt{problem} and +\texttt{problem*} environments. The former is for a single +question, the latter is for a question with multiple parts. + +\subsubsection{\texttt{problem}}\label{problem} + +The \texttt{problem} encloses a single question; the question +itself may contain special constructs such as one or more fill-in +the blanks. + +The syntax for \texttt{problem} is +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont, + commandchars=!()] +\begin{problem}[!meta(num)|*!meta(num)|empty][h|H] +!anglemeta(Statement of question, which may contain special constructs) +... +... +\begin{solution}[!meta(vspace),nLines=!meta(n)] +... +... +\end{solution} +\end{problem} +\end{Verbatim} +\noindent The environment takes two optional arguments. The first +argument \meta{num} is the number of points for this problem, for +example, if we want to have a $5$ point question, we would begin the +environment like so, \verb+\begin{problem}[5]+; on the other hand, if we +say \verb+\begin{problem}+, the problem has no points associated with it. +If you specify points weight for a problem, the points appear in the +margins (when one of the option \texttt{pointsonleft}, +\texttt{pointsonright}, or \texttt{pointsonboth} is specified); if the +\texttt{*} form is specified (\meta{*num}), the point weight appears +``in-line,'' just after the problem number; thus, typesetting a problem +with the specification \verb!\begin{problem}[*5]! yields +\begin{quote} +\textbf{1.} (5 pts) \dots +\end{quote} +This is useful when the problems are put into a two-column format; the +problems in the right-hand column do not have the margin to hold the +points, in this case, we place the points ``in-line.'' + +\newtopic The \texttt{problem} is actually a redefined \texttt{exercise} +environment, as defined in \textsf{exerquiz}. The second parameter +is inherited from the \texttt{exercise} environment. The second +argument can optionally be an \texttt{h} or a \texttt{H}. + +Use \texttt{h} if you do not want the solution to appear at the +end of document (when you do not use the \texttt{nosolutions} or +the \texttt{solutionsafter} options); the solution, however, will +appear if the \texttt{solutionafter} option is specified. + +For the \texttt{H} argument, the solution will not appear at the +end of the document (just as in \texttt{h}), nor will it appear if you +specify the \texttt{solutionsafter} option. + +To make things work correctly, if you do not want to have points +for a question and want to hide the solution, use `\texttt{[]}' +(empty brackets with no spaces) for the first argument. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[][H] +($5$ Points Extra Credit) Solve this problem for extra credit. +\begin{solution} +This solution will not appear in all cases, unless the second +parameter is eliminated or is changed to h, in the latter case, +the solution appears just for \texttt{solutonsafter}. +\end{solution} +\end{problem} +\end{Verbatim} +\noindent Here, this problem has no points that will be added into +the total number of points for the test. + +The \texttt{solution} environment encloses the solutions. This environment is +optional. The environment takes at most two optional parameters, +\meta{vspace} and \texttt{nLines=\meta{n}}. The \meta{vspace} parameter is a +length that determines the amount of vertical space to leave for the student +to work the problem. The +\texttt{nLines=\meta{n}}\FmtMP{\texttt{nLines=\meta{n}} explained} +specification signals \pkg{eqexam} to leave \meta{n} lines of vertical space; +each line is \cs{wlVspace} in height. (For more information on \cs{wlVspace}, +read about the \texttt{linegap} key in Section~\ref{ss:VSFT}.) This vertical +space is \emph{created only} when the document author takes the +\texttt{nosolutions} or \texttt{vspacewithsolns} option. For example, +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[10] +Do this problem. +\begin{solution}[2in] +This is the solution. +\end{solution} +\end{problem} +\end{Verbatim} +This defines a $10$ point problem and leaves $2$ inches of vertical space +following the problem statement for the student to respond. The vertical +space is generated provided the \texttt{nosolutions} or \opt{vspacewithsolns} +option has been taken. + +Be aware that the solution environment searches for its optional +parameter, and will expand macros looking for a left bracket (\texttt{[}). +In documents where the optional parameter is not used; this can lead to +problems in compiling. For example, if you say, +\verb!\begin{solution} \textbf{My solution:}...!, the command \cs{textbf} +will be expanded prematurely and result in `My solution' not appearing in +bold. Similarly, if you write \verb!\begin{solution} \begin{equation}...! +can lead to compilation stopping. Suggested workarounds: +\begin{itemize} + \item Supply empty brackets: \verb!\begin{solution}[]! + \item Use \cs{relax}: \verb!\begin{solution}\relax\textbf{...}!. + The \cs{relax} should not be on the line by itself. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{solution}\relax % Not this +\textbf{...} +... +\end{Verbatim} +The above causes an unwanted newline. The next two examples show the +``correct'' method. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{solution}\relax\textbf{...} % correct +... +\end{Verbatim} +\noexpand The \cs{relax} appearing on the second line. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{solution} +\relax\textbf{...} % correct +... +\end{Verbatim} +\end{itemize} +If you have no need for the vertical space in your document and putting in +these workarounds is too much trouble, you can use a global solution. Use +\cs{noSolnOpt} to globally turn off the check for the option parameter by +the \texttt{solution} environment; \cs{ckSolnOpt} turns on parameter +checking (the default). To summarize: +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\ckSolnOpt % turn on checking for the optional argument (the default) +\noSolnOpt % turn off checking for the optional argument +\end{Verbatim} +Place either of these two commands between problems to turn off (or back on) the +parameter checking. + +\redpoint See \Nameref{eqoptions} for more details on +the two options \texttt{nosolutions} and \texttt{solutionsafter}. + +\paragraph*{Optional arguments of \env{solution} environment.} +The \env{solution} environment takes at most two optional arguments \meta{vspace} and \texttt{nLines=\meta{n}}. +If both are specified, by default the \meta{vspace} parameter is used. The command +\cs{usenLineDimen} changes the preference to the line specification; \cs{useVspaceDimen} switches +the preference back to the \meta{vspace} dimension. + +\subsubsection{\texttt{problem*}}\label{problemstar} + +This environment is used when you want to ask a multi-part +question, a series of related questions that are to be treated as +a group. + +The syntax is +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont, + commandchars=!()] +\begin{problem*}[!meta(num)|!anglemeta(num)ea|\auto|empty][\Do!anglemeta(do_num)] +Do each of the following problems, and be quick about it. +\begin{parts} + +\item[h|H] The first question. +\begin{solution}[!meta(vspace),nLines=!meta(n)] +This is the solution to the first problem. +\end{solution} + +\item[h|H] The second question. +\begin{solution}[!meta(vspace),nLines=!meta(n)] +This is the solution to the second problem. +\end{solution} + +\end{parts} +\end{problem*} +\end{Verbatim} +The \texttt{problem*} environment takes two optional parameters, +the first one takes one of four values: +\begin{aebDescript} + \item[\meta{num}] When the value of the first parameter is + a number, this represents the total number of points for this + multi-part question. Here, the instructor does not specify the + weight of each part. + + \item[\meta{*num}] The points appear ``in-line'' rather than + in the margin. + + \item[\anglemeta{num}\texttt{ea}] When you specify a number followed by + `\texttt{ea}' (which is short for \underbar{ea}ch). Thus, + `\texttt{[5ea]}' signifies that each part of this problem has + weight of $5$ points. + + \item[\texttt{*\anglemeta{num}ea}] The points appear ``in-line'' rather than + in the margin. + + \item[\cs{auto}] If the value of the first parameter is + \cs{auto}, then the total number of points is calculated + automatically from the points defined by the \cs{PTs} macro. + The \cs{PTs} would be placed following \cs{item} of each part + that is to be given points. For example: + + \item[*\cs{auto}] The points appear ``in-line'' rather than + in the margin. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem*}[\auto] +Do each of the following problems, and be quick about it. +\begin{parts} + +\item\PTs{3} The first question. +\begin{solution}[1.5in] +This is the solution to the first problem. +\end{solution} + +\item\PTs{4} The second question. +\begin{solution}[3in] +This is the solution to the second problem. +\end{solution} + +\end{parts} +\end{problem*} +\end{Verbatim} +This defines a $7$ point problem. + +\item[\texttt{empty}] You need not specify any points at all. In +this case do not include this first parameter, in which case, the +second parameter is not used, so don't include it either. + +\end{aebDescript} + +\noindent Now for a description of the second parameter the +\texttt{[\cs{Do}\anglemeta{do\_num}]} parameter. In my senior- or graduate-level +classes, I sometimes ask a questions with multiple parts. As part +of the instructions for that problem I write, ``Do exactly three +of the following five problems.'' These questions are usually +proof-type problems, and they can choose their best three to +grade. In this context, all parts of the problem must be of the same +weight; the weight of each is \anglemeta{num} of the \texttt{[\anglemeta{num}ea]}. + +This is what \texttt{[\cs{Do}\anglemeta{do\_num}]} does. When you specify +\texttt{\cs{Do}3}, then only the points of $3$ of the problems are +added into the exam total. This second parameter is only checked +if the first parameter is \texttt{[\anglemeta{num}ea]}. For example, +specifying +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem*}[5ea][\Do3] +\end{Verbatim} +creates a $15$ point question. This assumes there are $3$ or +more parts to this question. + +By the way, there are two macros that are defined when the \cs{Do} +is used, they are \cs{DoNum} and \cs{OutOfNum}; these expand to +the (English) word for the number of problems to do, and the +(English) word for the total number of problems. For example, if +there were five parts to the problem below,\dots +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem*}[5ea][\Do3] +Solve exactly \textit{\DoNum} of the following {\OutOfNum} +problems. .... +\end{problem*} +\end{Verbatim} +\noindent The instructions would read, ``Solve exactly +\textit{three} of the following five problems.'' These macros can +be easily redefined to reflect other languages. The numbers +themselves are contained in the two macros \cs{nDoNum} and +\cs{nOutOfNum}. + +\redpoint \texttt{parts} and \cs{item}: For a multi-part problem +(\texttt{problem*}), the actual problems are enclosed in a +\texttt{parts} environment, and each question is posed as an +\cs{item} of that \texttt{list} environment. The command \cs{item} +takes the \texttt{[h|H]} optional argument. As in the case of the +\texttt{problem} environment, \texttt{h} prevents the solution +from appearing at the end of the document (but it appears with +\texttt{solutionsafter}), and \texttt{H} removes the solution in +all cases. + +\paragraph{\texorpdfstring{\cs{leadinitem}}{\CMD{leadinitem}}} +When using the \texttt{problem*} environment, there is an introductory sentence +that sets up the multi-part problem set. For various reasons, some authors +have asked to be able to pose multi-part questions without the +introductory sentence. This is harder request than it sounds, but now +there is the \cs{leadinitem} command. Study the code below. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem*}[\auto] +\leadinitem\PTs{3} The first question. +\begin{solution}[1.5in] +This is the solution to the first problem. +\end{solution} + +\begin{parts} +\item\PTs{4} The second question. +\begin{solution}[3in] +This is the solution to the second problem. +\end{solution} +... +\end{parts} +\end{problem*} +\end{Verbatim} +There is no introductory sentence. The problem starts off with +\texttt{\cs{leadinitem}\cs{PTs\{3\}} The first question}; this problem +is stated outside of the \texttt{parts} environment. The rest of the parts +to this problem are listed, as usual, from within the \texttt{parts} environment. +Only one \cs{leadinitem} is allowed per \texttt{problem*} environment. + +\newtopic The results of this code is viewed as follows, when typeset. + +\bigskip +\noindent\hfill\begin{minipage}{\linewidth-2\leftmargini} +\noindent\llap{($10^{\text{pts}}$)\quad}\textbf{1.}\ (a)\ The first question.\\[3pt] +\phantom{\textbf{1.}\ }(b)\ The second question.\\[3pt] +\phantom{\textbf{1.}\ }\dots +\end{minipage} +\bigskip + +The general syntax for \cs{leadinitem} is the same as that of the \cs{item} command within the +\texttt{parts} environment; \verb!\leadinitem[h|H]!, \texttt{h} prevents the solution +from appearing at the end of the document (but it appears with +\texttt{solutionsafter} or with \texttt{answerkey}), and \texttt{H} removes the solution in +all cases. + +\paragraph{\texorpdfstring{\cs{tableadin}}{\CMD{tableadin}}} There is a +tabular version of the \cs{leadinitem} command just discussed. Consider the following code: +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\autotabOn +\begin{problem*}[\auto] +\tableadin +\begin{parts}[2} +\item\PTs{4} The first question. +\begin{solution}[1.5in] +This is the solution to the first problem. +\end{solution} +% +\item\PTs{4} The second question. +\begin{solution}[3in] +This is the solution to the second problem. +\end{solution} +... +\end{parts} +\end{problem*} +\end{Verbatim} +The results of this code is viewed as follows, when typeset. + +\bigskip +\noindent\hfill\begin{minipage}{\linewidth-2\leftmargini} +\noindent\llap{($10^{\text{pts}}$)\quad}\textbf{1.}\ (a)\ The first question.\qquad\hskip2\tabcolsep +(b)\ The second question.\\[3pt] +\phantom{\textbf{1.}\ }\dots +\end{minipage} +\bigskip + + +\subsubsection{Page Breaking} + +The \texttt{exam}, \texttt{problem} and \texttt{problem*} +environments use a (simple) page breaking algorithm to move a +problem (or the beginning of an exam) to the next page. + +If an \texttt{exam} environment begins at the lower third of the +page, it is moved to the next page. You can influence this page +break by using \cs{fvsizeskip} just before the beginning of the +\texttt{exam} environment, like so, +\begin{Verbatim}[xleftmargin=\amtIndent] +\fvsizeskip{.4} +\end{Verbatim} +\noindent \cs{fvsizeskip} takes a decimal number between $0$ and +$1$. In the example above, the environment will move to a new page +if it begins in the lower \texttt{.4\cs{textheight}} of the page. The +default value is $.3$. + +There is a similar algorithm for \texttt{problem} and +\texttt{problem} but is measured as a multiple of +\cs{baselineskip}. If you place +\begin{Verbatim}[xleftmargin=\amtIndent] +\nbaselineskip{8} +\end{Verbatim} +\noindent just before a problem that appears near the bottom of +the page, then it will be moved to the next page if it is within +\texttt{8\cs{baselineskip}} of the bottom. The default for this +command is $6$. + +\medskip\noindent +The following are strategies for fitting the maximum +number of questions on the minimum number of pages. +\begin{enumerate} + \item \textbf{Moving: }Rearrange the order of the questions, + if a problem can't fit entirely on a page, you can + exchange or move a shorter problem to that place, and move the longer + problem to another page. + + \item \textbf{Tweaking: }Modify the space defined by the + \texttt{solutions} environment to fit a problem on the page that + is below it. + + \item \textbf{Placing work on back: }Using the + \hyperref[onbackofpage]{\cs{OnBackOfPage}} command, + page~\pageref{onbackofpage}, you can direct the student to + answer the question on the back of another page, and thus, + little space is needed to follow that + question. + + \item \textbf{Working on separate sheets: }Of course, for some + types of exams, the exam just contains the questions, and the + students answer the questions on separate sheets of paper. For + this, you can use the \texttt{nospacetowork} option. +\end{enumerate} + + +\subsection{Fill-in Questions} + +In this section we cover the various fill-in constructs. + +\subsubsection{Short Fill-in Questions} +For a question requiring one or more short fill-in responses, +\textsf{eqexam} has the \cs{fillin} command, the syntax is +\settowidth{\aebdimen}{\ttfamily\string\fillin[u|b]\darg{\meta{width}}\darg{\meta{answer}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\fillin[u|b]{!meta(width)}{!meta(answer)} +\end{dCmd} +The first optional parameter determines whether the fill-in is +underlined `\texttt{[u]}' or not `\texttt{[b]}', the default it to +underline the fill-in. The second is the amount of horizontal +space you want to leave for the student to write in the response. +The third argument is the correct answer. This correct answer +will appear when you compile the document with the +\texttt{answerkey} option. + +\redpoint An example of \cs{fillin}. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[5] +It is well known that \fillin{1in}{Newton} and \fillin{1in}{Leibniz} +are jointly credited as the founders of modern calculus. +\begin{solution} +It is well known that \underbar{Newton} and \underbar{Leibniz} +are jointly credited as the founders of modern calculus. +\end{solution} +\end{problem} +\end{Verbatim} + +\redpoint When you choose the \texttt{online} or \texttt{email} +option, \cs{fillin} generates a text field. + +When the \texttt{usexkv} option, and if the \textsf{xkeyval} package is available on the +system, \textsf{eqexam} extends the capability and control of \cs{fillin}. +See \begin{NoHyper}\Nameref{extendfillin}\end{NoHyper}. + +\subsubsection{True/False Questions} + +True and false questions are, of course, just a special case of +fill-in. A special command is available for true/false: +\settowidth{\aebdimen}{\ttfamily\string\TF[\meta{width}]\darg{\meta{answer}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\TF[!meta(width)]{!meta(answer)} +\end{dCmd} +\indent The required parameter, \meta{answer}, is the correct answer (e.g., +`T' or `F'). The macro creates an underlined blank space the width of which +is \meta{wide}. When the \meta{width} is \emph{not specified}, +\cs{defaultTFwidth} (default \texttt{30pt}) is used (and this value can be redefined). + +The \cs{TF} command behaves differently from the generic +\cs{fillin} command. Suppose you want to create a multi-part question +(using \texttt{problem*}) consisting entirely of true/false +questions. When an \cs{item} leads off with the \cs{TF} there are two possible +formatting options: This one: + +\begingroup\parskip6pt\parindent30pt + +\def\Item#1{\par\hangindent\parindent\indent\llap{#1\enspace}\ignorespaces}% +\parbox{4in}{\noindent + \Item{(a)}\underbar{\hspace{30pt}} Isaac Newton is considered to be one of + the founders of Calculus.} + +\medskip\noindent or this one:\medskip + + +\def\Item#1{\par\hangindent\parindent\indent\llap{#1\enspace}\ignorespaces} +\leavevmode\parbox{4in}{\Item{(a)}\underbar{\hspace{30pt}} Isaac Newton is considered to be one of + the founders of \hspace*{30pt} Calculus.} + +\endgroup + +\newtopic The first alignment is the default. To get the second +alignment, you need to set the value of \cs{fillinWidth} to the +common width value of the \cs{TF} fields. For example: +\begin{Verbatim}[xleftmargin=\amtIndent] +\fillinWidth\defaultTFwidth +\end{Verbatim} +\noindent When \cs{fillinWidth} is set to a positive length (the +common width of the \cs{TF} field), the second alignment above is +created. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem*}[3ea] +\textit{True} or \textit{False}. + +\fillinWidth\defaultTFwidth + +\begin{parts} + + \item \TF{T} It is well known that Isaac Newton and + Gottfried Leibniz are jointly credited as the founders + of modern calculus. + ... + \item ... + ... +\end{parts} +\end{problem*} +\end{Verbatim} + +\redpoint \textbf{Important:} The example above demonstrates the +correct placement of \cs{fillinWidth}, just outside the +\texttt{parts} environment, before it has the time to set up +the paragraph shape of the environment. + +The change is only local to that \texttt{parts} environment. +The \cs{fillinWidth} command goes outside a \texttt{parts} +environment, and can cause strange results if executed within a +\texttt{parts} environment. Setting it to a \meta{width} value +other than the common width of the \cs{TF} fields will also create +bad formatting. + +\redpoint Just use \cs{fillinWidth} as illustrated in the above +example. + +\redpoint When you choose the \texttt{online} or \texttt{email} +option, \cs{TF} generates a text field. + +\subsubsection{Long Fill-in Questions} + +There is no special command for a longer response question, just +leave enough vertical white space for the student to respond, for +example, +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[5] +Do this problem +\begin{solution}[1.5in] +That's how you do it! +\end{solution} +\end{problem} +\end{Verbatim} +\noindent The above example leaves $1.5$ inches of vertical space to do the +work. + +\redpoint When you choose the \texttt{online} or \texttt{email} +option, this vertical space is changed into a multi-line text +field. + +\subsection{Multiple Choice}\label{multichoice} + +For multiple choice questions, we use the \texttt{answers} +environment. If the \texttt{online} or \texttt{email} option is +taken, the choices are made into radio button fields so that +\emph{only one alternative} can be chosen. When multiple selections +are permitted, the \texttt{manswers} environment can be used, see +\Nameref{multiSelect}. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem*}[\auto] Answer each of the following. +\begin{parts} %\sqLinks + \item\PTs{5} In what year did Columbus sail the ocean blue? + \begin{answers}{4} + \Ans0 1490 &\Ans0 1491\\ + \Ans1 1492 &\Ans0 1493 + \end{answers} + \item\PTs{6} In what year did Columbus sail the ocean blue? + \begin{answers}{1} + \Ans0 1490 + \Ans0 1491 + \Ans1 1492 + \Ans0 1493 + \end{answers} +\end{parts} +\end{problem*} +\end{Verbatim} +\noindent \textbf{Note:} No solutions are given for this problem. + +\redpoint Because the labels and values of the alternatives are +based on the alphabet, the number of alternatives is restricted to +twenty-six. + +The \texttt{answers} environment is borrowed from \texttt{exerquiz} and +operates the same way. The one required argument is the number of columns +to be used in displaying the alternative answers. If the number of columns +is $1$, a \texttt{list} environment is used, otherwise a \texttt{tabular} +environment is used. + +In the first item in the example above, we specify $6$ columns, +and must use tabular notation (separate columns with +`\texttt{\&}') and end rows with `\verb+\\+'. The second item in +the example above uses $1$ column, the tabular notation is not +needed, or used. + +The \cs{Ans} macro is used to designate which alternative is the +correct answer ($1$ for correct, $0$ for not correct). + +\subsubsection{Using \texorpdfstring{\cs{bChoices}/\cs{eChoices}} +{\CMD{bChoices}/\CMD{eChoices}}} +Beginning with Version 1.3, an alternate style of specifying the +alternatives is defined. A new pair of commands are defined: \cs{bChoices} +and \cs{eChoices}. These two enclose the alternatives like so: + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{exam}{Exam1} +\begin{instructions} +Select the ``best'' answer and darken the corresponding oval on +your scantron sheet. +\end{instructions} +\begin{problem}[5] In what year did Columbus sail the ocean blue? + \begin{answers}{3} + \bChoices + \Ans0 1490\eAns + \Ans0 1491\eAns + \Ans1 1492\eAns + \Ans0 1493\eAns + \eChoices + \end{answers} +\end{problem} +\begin{problem}[5] In what year did Columbus sail the ocean blue? + \begin{answers}{1} + \bChoices + \Ans0 1490\eAns + \Ans0 1491\eAns + \Ans1 1492\eAns + \Ans0 1493\eAns + \eChoices + \end{answers} +\end{problem} +\end{exam} +\end{Verbatim} +\noindent Notice that the set of alternatives are the same, and +are specified in exactly the same way; the first question, +however, is a tabular environment with $6$ columns (the argument +of $6$ of the \texttt{answers} environment), the second question +is a list environment (since the argument \texttt{answers} +environment is $1$). Notice also that `\texttt{\&}' and +`\verb!\\!' are not used, and that each alternative is terminated +by \cs{eAns}. + +The \cs{bChoices} and \cs{eChoices} are creatures of the \textsf{exerquiz} +package, and are fully documented in the reference for the +\ulSetLink{http://www.math.uakron.edu/~dpstory/acrotex/aeb_man.pdf}{\cAcroB}. + + +\subsubsection{\texorpdfstring{\cs{sqForms} versus \cs{sqLinks}} +{\CMD{sqForms} versus \CMD{sqLinks}}} + +There are two styles of multiple choice: (1) enumerate the +alternatives using letters; (2) enumerate the alternatives using +boxes (that the student would check or fill-in). The default is (1), +but you can change the default to (2) by using the \texttt{useforms} +option. This styles can be locally changed by specifying the +\cs{sqLinks} or \cs{sqForms} commands. In the above example, the +\cs{sqLinks} command is commented out, but shows the correct +position for it to change to style (1), which I am calling +``links''. Within a multi-part, multiple choice set of questions, +you can change one item to ``links'' and the next to ``forms.'' +Changes are local as long as you place the commands, \cs{sqLinks} or +\cs{sqForms} within an environment (\texttt{parts}, +\texttt{problem}, or \texttt{problem*}). + +\subsubsection{Using Circles for Multiple Choice}\label{allowcirc4mc} + +Then the package option \texttt{allowcirc4mc} is used, the font standard +{\LaTeX} font \texttt{lcircle10} is loaded at which point \textsf{eqexam} +can use it to create circles, instead of rectangles, to indicate the parts +in a multiple choice (MC) question. To use circles in a multiple choice +question, execute the command, +\begin{Verbatim}[xleftmargin=\amtIndent] +\useCircForMC +\end{Verbatim} +prior to the MC question. + +\goodbreak + +To return to the use of rectangles, execute the command, +\begin{Verbatim}[xleftmargin=\amtIndent] +\useRectForMC +\end{Verbatim} +prior to the MC question. + +Both commands have a local context. If expanded inside a group, the +definition going into the group will hold on exit from the group. + +\subsubsection{Using \texorpdfstring{\cs{proofingsymbol}}{\CMD{proofingsymbol}} +and friends} + +By default, a check mark (\ding{52}) is used to indicate which of the +alternatives in a MC problem is correct; however, there are other +``proofing symbols'' that can be used. Below are two additional suggested +proofing symbols. + +\makeatletter +\font\eqe@lcir=lcircle10 at 10pt +\bgroup +\setbox0=\hbox{\eqe@lcir h} +\xdef\eqe@cirDiam{\the\wd0} +\@tempdima=.5\wd0 +\xdef\eqe@cirRadius{\the\@tempdima} +\egroup +\def\circGlyph#1#2{\hbox{\smash{\raisebox{\eqe@cirRadius}% + {\makebox[\eqe@cirDiam]{\llap{\rlap{\eqe@lcir#1}% + \hskip#2\relax}}}}}} +\makeatother + +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\useCheckForProof (!normalfont Check !ding(52), the default) +\useCrossForProof (!normalfont Cross !ding(56), alternative to check) +\useCircForProof (!normalfont Circle !circGlyph(x)(1pt), appropriate with )\useCircForMC +\end{Verbatim} +All of these user friendly commands are based on the \cs{proofingsymbol} +command. For example, the definitions of \cs{useCheckForProof} and +\cs{useCrossForProof} are, +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\newcommand{\useCheckForProof}{\symbolchoice{check}% + \proofingsymbol{\ding{52}}} +\newcommand{\useCrossForProof}{\symbolchoice{cross}% + \proofingsymbol{\raisebox{-1pt} + {\rlap{\kern-1pt\Large\ding{56}}}}} +\end{Verbatim} +Both definitions use the \textsf{pifont} package to create the symbols. +Note that some adjustment of size and position is used for the cross +symbol. + +The command \cs{symbolchoice} is defined in the \textsf{eforms} package +and does nothing in \textsf{eqexam} unless either \texttt{online} or +\texttt{email} options are taken. From the \textsf{eforms} manual, +possible values for \cs{symbolchoice} are \texttt{check}, \texttt{circle}, +\texttt{cross}, \texttt{square}, \texttt{diamond}, and \texttt{star}. The +\cs{proofingsymbol} command is for marking the multiple choices when +either the \texttt{answerkey} or \texttt{vspace\-with\-solns} option is +taken. The choice of \cs{proofingsymbol} is `{\LaTeX}ed' into the +document. The \cs{proofingsymbol} may be used to create other proofing +symbols, as desired. + +\newtopic\textbf{Summary.} Currently, there only two geometric shapes used +for multiple choice, rectangles (the default) and circles. To Shift +between these two types, use \cs{useRectForMC} and \cs{useCircForMC}, +respectively. Accompanying the choice for geometric shape for MC is the +symbol used to make the choice/correct answer. When the \texttt{answerkey} or +\texttt{vspace\-with\-solns} option is used, the correct answer is marked +using a symbol, current choices are \cs{useCheckForProof}, +\cs{useCrossForProof} and \cs{useCircForProof} (used with +\cs{useCircForMC}). + +When the \texttt{vspace\-with\-solns} is used, solutions are written to +the back of the document and markup up as they are with the +\texttt{answerkey} option. To get the answers in the solutions section to +have the same choices, you must write to the solutions file using +\cs{writeToSolnFile}. Below is an example. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\useCircForMC\useCircForProof +\writeToSolnFile{\protect\useCircForMC\protect\useCircForProof} +\begin{problem}[5] In what year did Columbus sail the ocean blue? + \begin{answers}{3} + \bChoices + \Ans0 1490\eAns + \Ans0 1491\eAns + \Ans1 1492\eAns + \Ans0 1493\eAns + \eChoices + \end{answers} +\end{problem} +\end{Verbatim} +Any multiple choice question that follows will also draw circles for +multiple choice questions, and mark them with a filled circle. +To shift back to the default, expand the following commands prior the next +question. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\useRectForMC\useCheckForProof +\writeToSolnFile{\protect\useRectForMC\protect\useCheckForProof} +... +\end{Verbatim} + +\subsection{Multiple Selection}\label{multiSelect} + +When writing a multiple choice question for which more than one +alternative is permitted, use the \texttt{manswers} environment +(\underbar multiple \underbar{answers}). The distinction between the +\texttt{answers} and \texttt{manswers} environments is lost when +publishing to paper, but becomes important with the \texttt{online} +and \texttt{email} options. + +Use the \texttt{manswers} environment in the same way you use +\texttt{answers}, except code in more than one correct answer. For +example, +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[5] +Which of the following are primary colors? +\begin{manswers}{6} % specify tabular with 6 columns + \bChoices + \Ans1 Blue\eAns + \Ans0 Green\eAns + \Ans1 Yellow\eAns + \Ans0 Orange\eAns + \Ans1 Red\eAns + \eChoices +\end{manswers} +\begin{solution} +Yes, red, blue and yellow are primary colors. +\end{solution} +\end{problem} +\end{Verbatim} +\noindent You can use the \cs{bChoices}/\cs{eChoices} pair to specify the +alternatives, or you can use the standard tabular notation. As with the +\texttt{answers} environment an argument of \texttt1 specifies a list +environment. See \Nameref{multichoice} for more examples on the use of the +\cs{bChoices}/\cs{eChoices} pair. + +\subsection{Randomizing Choices}\label{s:random} + +Beginning with version~1.7 of \textsf{eqexam}, the choices of a +multiple choice/selection question can be randomized. The \texttt{random.tex} +macro file by Donald Arseneau is used for this purpose. + +\newtopic The randomization is only allowed if the \texttt{allowrandomize} +option of \textsf{eqexam} is used; otherwise, no randomization +can occur. + +The randomization is only defined for choices listed between the +pair \cs{bChoices} and \cs{eChoices}. The +\cs{bChoices} command now takes two optional key-value arguments: +\begin{itemize} + \item \texttt{nCols=\anglemeta{num}}: The number of columns to create, as described. + You can also use the old style by specifying just + \anglemeta{num}. Thus, \cs{bChoices[nCols=2]} and \cs{bChoices[2]} + are equivalent. + \item \texttt{random=\anglemeta{\upshape true|false}}: Specify this option if you want the choices + to be randomized. You can use the key word \texttt{random} instead of + \texttt{random=true}. For example, the following commands all will randomize the + choices, \cs{bChoices[random]} or \cs{bChoices[nCols=2,random]} or + \cs{bChoices[2,random=true]}. The default is to not randomize the + choices. +\end{itemize} + +\newtopic The following is an example of the \texttt{random} option of \cs{bChoices}. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[5] +Try to guess the correct answer. + \begin{answers}{3} + \bChoices[nCols=2,random] + \Ans0 1 a choice\eAns + \Ans1\label{eq} 2 another choice\eAns + \Ans0 3 still another choice\eAns + \Ans0 4 another\eAns + \Ans0 5 incoming\eAns + \Ans0 6 more choices\eAns + \Ans0 7 another still\eAns + \Ans0 8 too many\eAns + \Ans0 9 choices\eAns + \eFreeze + \Ans0 10 None of these\eAns + \eChoices + \end{answers} +\end{problem} +\end{Verbatim} + +\newtopic Note the presence of the command \cs{eFreeze}. Any of +the items listed after \cs{eFreeze} are not randomized, and are +placed at the end of the list. So, for the example above, the first +nine items will be randomized, whereas, the last item (None of +these) will placed at the end of the list. + +\newtopic Additionally, there are five other commands that support the +randomization feature. + +\begin{Verbatim}[xleftmargin=\amtIndent] +\saveRandomSeed +\inputRandomSeed +\end{Verbatim} + +\newtopic A pseudo-random sequence of numbers requires an initial seed +value. The \texttt{random.tex} macro file creates, by default, a +seed value based on the data and time (the number of minutes since +midnight); consequently, after every minute, the random sequence +will change. By setting the value of the count register \cs{randomi}, as in +\texttt{\string\randomi=24}, +the document author can also set the initial seed of the pseudo-random +sequence. + +The command \cs{saveRandomSeed} will write the last seed used in the +source file to an auxiliary file (\cs{jobname\_ran.sav}), while the +command \cs{inputRandomSeed} inputs the seed stored in the +\cs{jobname\_ran.sav} back into the beginning of the source file. +These two commands should be placed in the preamble. + +By invoking both of these commands, a new pseudo-random sequence will be generated +each time the source file is latexed. + +Assuming a \cs{jobname\_ran.sav} has already been created, by +invoking the command \cs{inputRandomSeed} only (and not +\cs{saveRandomSeed}), the seed already saved will be used for every +subsequent compiling of the source document. Using the same seed is +necessary in two situations: +\begin{enumerate} + \item When the document contains one or more \cs{label} commands, using the same + seed gives you the same sequence every time you latex the document. This will + give the auxiliary files a chance to come up to date so that any referencing of the label + will be accurate. + + \item When creating an exam with randomization that has several + versions, which later you publish the solutions to, it is + important that the randomization for the document is the same as + that for the solution document. By using \cs{inputRandomSeed} (and + not \cs{saveRandomSeed}), you should get the same sequence for the + solution document (unless you modify the source file, adding or + removing questions that have randomization). +\end{enumerate} + +\newtopic\textbf{Things to look for:} If \textsf{eqexam} is not rearranging the order +of the choices as you expect it to, it could be that +\textsf{eqexam} is reading an old \texttt{.sav} file. Either delete that file +in your source folder, or comment out \cs{inputRandomSeed} in your document. + +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\useRandomSeed{!meta(num)} +\end{Verbatim} + +You may have several sections of the same class take the exam with the +questions rearranged for each. Save the seed value used by +\textsf{eqexam} to randomize the choices (open the \texttt{.sav} +and copy and paste line you see into your document, for example, it +could read \cs{randomi=132088850}. Then use \cs{useRandomSeed} to +use that seed value for that class, for example +\begin{Verbatim}[xleftmargin=\amtIndent] +\useRandomSeed{132088850} % 11:00 class +% \useRandomSeed{634952429} % 12:30 class +\end{Verbatim} +Of course comment out \cs{inputRandomSeed}. + +\begin{Verbatim}[xleftmargin=\amtIndent] +\turnOnRandomize +\obeyLocalRandomize +\end{Verbatim} + +The command \cs{turnOnRandomize} overrides all local settings of \cs{bChoices} +and causes all choice lists to be randomized. While \cs{obeyLocalRandomize} +returns control to the local settings. For example, +\begin{Verbatim}[xleftmargin=\amtIndent] +\turnOnRandomize +... +\bChoices + \Ans...\eAns + \Ans...\eAns + ... +\eChoices +\end{Verbatim} +will cause the choice list to be randomized, even though the +\texttt{random} option was not specified. Whereas, in this code +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\turnOnRandomize +... +\obeyLocalRandomize +,,, +\bChoices + \Ans...\eAns + \Ans...\eAns + ... +\eChoices +\end{Verbatim} +the choices will not be randomized, because the \texttt{random} +option was not specified; or they will be randomized if the +\texttt{random} option is used. + +\newtopic\textcolor{red}{Limitations:} There are natural limitations on the use +of \cs{bChoices} and \cs{eChoices} and consequently, there are +limitations on the randomization. The content between \cs{Ans} and +\cs{eAns} cannot have any verbatim text. This is usually not a +problem for mathematical content, but could be a limitation for +computer science where questions about syntax may be posed. I have +in mind a work-around, but haven't pursued the problem as of yet. + +\subsection{Labeling Choices} + +The \cs{bChoices} command has a \texttt{label} key, +\verb~\bChoices[label=~\texttt{\anglemeta{label}]}, used to specify a (unique) label for the +current set of choices. When a label is specified, \textsf{eqexam} creates +commands that save the label of each correct answers (for multiple +choice/multiple selection problems), and saves the answer text for each +correct answer. These can be read back into the document using some +user-interface commands: \cs{useSavedAlts}, \cs{useSavedAns}, +\cs{useSavedAltsAns}, and \cs{useSavedNumAns}. + +%\handpoint The demo file for this feature is named \texttt{test03.tex}.\medskip + +\exAeBBlogPDF{p=1206} The demo file for this feature is named +\texttt{test03.tex}, download +\texttt{\href{\urlAcroTeXBlog/?p=1206}{test03.pdf}} from the {\AcroBlog} +website. The source file is attached to the PDF. + + +\settowidth{\aebdimen}{\ttfamily\string\useSavedAltsAns[\meta{num}]\darg{\meta{label}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\useSavedAlts[!meta(num)]{!meta(label)} +\useSavedAns[!meta(num)]{!meta(label)} +\useSavedAltsAns[!meta(num)]{!meta(label)} +\useSavedNumAns{!meta(label)} +\end{dCmd} +\noindent The optional argument is useful \emph{only if} the \cs{bChoices} appears in a +\texttt{manswers} environment where there are more than one selectable answer. The required +parameter is the value of the \texttt{label} key. +\begin{description}\def\NH{\hspace{-\labelsep}} + \item\NH\cs{useSavedAlts\darg{\meta{label}}} expands to the + \meta{label} of the correct answer(s). For example + \cs{useSavedAlts\darg{\meta{label}}} might expand to (c); if there + are multiple answers, it might expand to (a), (c), a + comma-delimited list of labels of the (correct) answers. For + multiple selection, \cs{useSavedAlts[2]\darg{\meta{label}}} might + expand to (c), the label of the second correct answer. + + \item\NH\cs{useSavedAns\darg{\meta{label}}} expands to the \emph{text} + of the correct answer(s). As an example, + \cs{useSavedAns\darg{\meta{label}}} might expand to $ y = x^3 $; if + there are multiple answers, it might expand to $ y = x^3 $, $ y = + -x^3 $, a comma-delimited list of the text of the (correct) + answers. For multiple selection, + \cs{useSavedAns[2]\darg{\meta{label}}} might expand to $ y = -x^3 + $, the text of the second correct answer. + + \item\NH\cs{useSavedAltsAns\darg{\meta{label}}} combines the two + previous commands. Again, for example, + \cs{useSavedAltsAns\darg{\meta{label}}} might expand to (c) $ y = + x^3 $. When there are multiple answers, it expands to a comma + delimited of labels and text. As with the other two commands, the + optional argument can be used to pick off a particular choice. + \item \NH\cs{useSavedNumAns\darg{\meta{label}}} is the number of + correct answers in the current list of choices. +\end{description} + +\subsection{Gizmos and Gadgets} + +I have a couple of crazy gizmos that you can use. + +\subsubsection{The \texttt{workarea} Environment} + +For a mathematics test, we often pose +a question that needs to be worked out. Vertical space is created +by the \texttt{solutions} environment, and appears when the +\texttt{nosolutions} or \texttt{vspacewithsolns} option is used; however, often we want to +mark up this vertical space with additional instructions, a +diagram or a figure. The problem is how can the author write over +the provided white space. For this, \textsf{eqexam} provides the +\texttt{workarea} environment. The syntax is: +%\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\settowidth{\aebdimen}{\ttfamily\anglemeta{Material that will overwrite the solutions vertical space}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\begin{workarea}[!meta(width)]{!meta(depth)} +... +!anglemeta(Material that will overwrite the solutions vertical space) +... +\end{workarea} +\end{dCmd} +This environment is placed immediately \emph{after} the \texttt{solutions} +environment, and the value of its parameter should be the same as the +optional parameter at the beginning the \texttt{solutions} environment +(\cs{begin\darg{solutions}[\meta{depth}]}). The optional \meta{width} +parameter is the width of the work area, which is \cs{linewidth} by default. +The required \meta{depth} parameter is the depth of the work area and it +should match the optional parameter of the \texttt{solutions} environment, +directly above it. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[3] +This is a question. + +\begin{solution}[2in] +This is the solution, let's hope it's correct, or I would be +embarrassed to no end. +\end{solution} + +\begin{workarea}{2in} +\textit{Hint}: Think long and hard before answering. +\par\vfill\hfill\setlength{\fboxsep}{2mm} +\fbox{Answer:\fillin[n]{1in}{The correct answer.}} +\end{workarea} +\end{problem} +\end{Verbatim} +\noindent When the \texttt{nosolutions} option is taken, the +\texttt{solutions} leaves $2$~inches of white space. The +\texttt{workarea} environment that follows also specifies +$2$~inches, and the content of this environment will overlap the +white space. (The student would then work around the written +material.) Here, we give a hint, and leave an answer box (a +fill-in) for the student to insert his/her answer. + +When the \texttt{nosolutions} is not specified, the vertical space +is not provided, and the \texttt{workarea} does nothing. If +\texttt{solutionsafter} is specified, that space is replaced by +the provided solution. + +\subsubsection{The \texorpdfstring{\cs{placeAtxy}}{\textbackslash placeAtxy} Command} + +The \cs{placeAtxy} command is another device that I've used to +place a block of text or a graphic on top of the vertical space +created by the \texttt{solutions} environment when the +\texttt{nosolutions} or \texttt{vspacewithsolns} option is in effect. +\settowidth{\aebdimen}{\ttfamily\string\placeAtxy\darg{\meta{x\_dim}}\darg{\meta{y\_dim}}\darg{\meta{content}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\placeAtxy{!meta(x_dim)}{!meta(y_dim)}{!meta(content)} +\end{dCmd} +\noindent The first two arguments are the $x$ and $y$ coordinates +(with dimensions) of where the \meta{content} is to be placed. +If this command is placed below the \texttt{solutions} +environment, then the origin is the lower left corner of the +solutions box. + +The following example, places the frame box \framebox{Place a +graph here} (roughly) one inch up and one inch shifted to the +right, measured from the bottom left corner of the \texttt{solutions} +environment (when the \texttt{nosolutions} option is in effect). +As with \texttt{workarea}, \cs{placeAtxy} does nothing if the +\texttt{nosolutions} option has not been taken. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[3] +This is a question. +\begin{solution}[2in] +This is the solution, let's hope it's correct, or I would be +embarrassed to no end. +\end{solution} +\placeAtxy{1in}{1in}{\framebox{Place a graph here}} +\end{problem} +\end{Verbatim} +\noindent The \cs{placeAtxy} command can also be used in +combination with the \texttt{workarea} environment. + +% +% Fixed with version 1.3. 02/07/05 +% +% \redpoint With this release of \textsf{eqexam}, the +% \texttt{splitsolution} environment does not obey the `\texttt{h}' +% or `\texttt{H}' options. These options were discussed in section +% on the \hyperref[problem]{\texttt{problem} environment}, on +% page~\hyperref[problem]{\pageref*{problem}}. + +\subsubsection{The \texttt{splitsolution} Environment} + +I developed this environment to solve a problem with the +\texttt{online} and \texttt{email} options. The white space +created by the \texttt{solution} environment is converted into +text fields (\PDF{} form fields). If the \texttt{workarea} +environment or the \cs{placeAtxy} command is used to place content +on the white space, the student will be in the position of having +to type on top of this content. (See the demo file +\texttt{\href{\urlAcroTeXBlog/?p=1198}{test01.pdf}}\marginpar{\mbox{\makebox[0pt][l]{\textcolor{blue}{\Pisymbol{webd}{254}}}\raisebox{-2pt}{\color{red}{{\zqacr +b\hspace{9.5pt}}}}}} for an illustration of this.) + + +Therefore, it was necessary to have a way to separate the space +reserved for the text field, and the additional content you might +want to appear in this white space area. The +\texttt{splitsolution} environment is my solution to this problem. + +As of 2012/12/10, a new syntax has been implemented for the +\texttt{splitsolution} and \texttt{panel} environments. Below is a +side-by-side comparison of the new syntax and the old. + +\settowidth{\aebdimen}{\small\ttfamily\string\begin\darg{splitsolution}[\meta{width}][\meta{depth}]} +\newtopic\begin{minipage}{\aebdimen+2\fboxsep+2\fboxrule} +\begin{Verbatim}[commandchars=!(),fontsize=\small,frame=single] +(!normalsize!normalfont!bfseries New Syntax) +\begin{splitsolution}[!meta(width)][!meta(depth)] +\begin{panel}[l|r] +... +\end{panel} +\begin{solution} +... +\end{solution} +\end{splitsolution} +\end{Verbatim} +\end{minipage}\quad +\begin{minipage}{.45\linewidth} +\begin{Verbatim}[commandchars=!(),fontsize=\small] +(!normalsize!normalfont!bfseries Old Syntax) +\begin{splitsolution}{!meta(depth)} +\begin{panel}[l|r]{!meta(width)} +... +\end{panel} +\begin{solution} +... +\end{solution} +\end{splitsolution} +\end{Verbatim} +\end{minipage} +\newtopic There has not been any feedback to this feature, so I am confident that +this change has little impact on users. Both \meta{width} and +\meta{height} are optional arguments for the new syntax of +\texttt{splitsolution}. If there are no optional arguments, the default +values of \cs{panelwidth} and \cs{panelheight}; these are automatically +measured. If only one optional parameter is given, it is interpreted as +\meta{height} (and the \meta{width} is taken to be \cs{panelwidth}). The +default value of the optional parameter for the \texttt{panel} environment +is now \texttt{r} rather than \texttt{l}. + +\redpoint Consider the following example. +\begin{Verbatim}[numbers=left,xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[7] +This is a question worth $7$ points. +\begin{splitsolution} +\begin{panel}\relax +\includegraphics[scale=.2]{fig1} +\end{panel} +\begin{solution} +This a really good solution. I hope this solution is correct or I +will be totally embarrassed to no end. Even if it is wrong, maybe +the students will appreciate my tremendous effort. You can see +from the figure that the solution is obvious. +\end{solution} +\end{splitsolution} +\end{problem} +\end{Verbatim} +Note the use of \cs{relax} in line~(4). The first object in the panel +environment is a command. To prevent the command from expanding +prematurely, place a \cs{relax} as above. This will give you the default +parameter of \texttt{r} and prevent expansion. The use of \cs{relax} is +only needed when there is a command immediately following the opening of +the \texttt{panel} environment; otherwise, just \verb!\begin{panel}! should +work correctly. The optional argument can always be specified, +\verb!\begin{panel}[r]!; this too would prevent the premature expansion of +any command that immediately follows. + +The \texttt{panel} environment takes its contents and writes it verbatim +to a \textsf{CUT} file, then inputs it back in (at the end of the \texttt{panel} +environment), and places its contents in the box \cs{eqpanelbox} where it +takes it measurements of \cs{panelwidth} and \cs{panelheight} (the total +height). + +The \texttt{splitsolution} environment \emph{must} enclose two +other environments: The \texttt{panel} and the \texttt{solutions} +environments, \emph{in that order}. + +The \texttt{panel} environment comes first and takes optional argument. +The optional parameter has takes a value of `\texttt{r}' (the default) or +`\texttt{l}'. The \texttt{r} (resp., \texttt{l}) option means the panel is +to appear on the right (resp., left) of the solution (or vertical white +space). + +After the \texttt{panel} environment comes the \texttt{solutions} +environment. The optional parameter of this environment need not +be specified, as it gets its value from the \texttt{split\-solution} +parameter. + +There is a small gap of \texttt{3pt} (the default) inserted between the +panel and the solution. The value of this gap is contained in the +\cs{panelgap} command, +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\panelgap{3pt} +\end{Verbatim} +which can be redefined. + +\redpoint The depth (the default is \cs{panelheight}) that you specify as +the parameter of the \texttt{splitsolution} environment needs to be large +enough to accommodate your typeset solution; otherwise, the solution will +overlap the next problem. This is because, unlike the solutions inside a +\texttt{solution} environment (but not in a \texttt{splitsolution} +environment) are typeset in a \texttt{minipage} with a specified depth. + +To extend the height of the solution, use the following method. +\begin{Verbatim}[xleftmargin=\amtIndent] +\begin{splitsolution}[\panelheight+1in] +... +\end{splitsolution} +\end{Verbatim} +This sets the total height to be the natural height of the panel plus 1 inch. + +\section{\textsf{eqexam} Options}\label{eqoptions} + +The options documented here are entered as optional arguments of the eqexam package: +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\usepackage[!meta(optionals)]{eqexam} +\end{Verbatim} +The optional arguments can also be introduced through \texttt{exambuilder.cfg}, the configuration file. +Create a text file with the name of \texttt{exambuilder.cfg} +and create the line shown below. +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\ExecuteOptionsX{!meta(optionals)} +\end{Verbatim} +Place \texttt{exambuilder.cfg} in the folder of the source file and not on the {\LaTeX} +search path. + +\redpoint The \textsf{eqexam} package has numerous options, some +inherited from \textsf{web}, some from \textsf{exerquiz}, and a +number of new ones. +\begin{description} + \item[\texttt{forpaper}] Take this option when you want to create + a black and white paper version of your test. + + \item[\texttt{forcolorpaper}] Take this option + when you want to have a nice colorful paper version, + or are publishing on the web in {\PDF}. See \Nameref{customColor}. + + \item[\texttt{nosolutions}] This is the normal option taken when + you are printing a test for distribution to a class of + students. When this option is taken, vertical space is + generated by the \texttt{solutions} environment based on + the value of its optional parameter. This leaves room for + the student to solve/answer the question. + + \item[\texttt{nohiddensolutions}] If you use the \texttt{h} + optional parameter for \texttt{problem} or \cs{item}, the + solution will not be listed (at the end of the document) + \emph{when you do not specify} \texttt{nosolutions}; but + solutions will be typeset for the \texttt{solutionsafter} option. + This option will override this feature. + + \item[\texttt{noHiddensolutions}] Normally, when you use the + \texttt{H} optional parameter for \texttt{problem} or \cs{item}, the + solution will not be listed when you use the \texttt{nosolutions} or + \texttt{so\-lu\-tions\-af\-ter} options for \textsf{eqexam}. This option will + override this feature. + + \item[\texttt{solutionsafter}] Causes solutions to appear + following the statement of the problem. + + When the \texttt{solutionsafter} is in effect, the word + \textit{Solution:} is typeset at the beginning of the solutions. + The command \cs{renameSolnAfterTo} can be used for conveniently + changing the \texttt{solutionsafter} label, for example, executing + the command \verb!\renameSolnAfterTo{\textbf{Proof:}}! prior to a + \texttt{solution} environment changes the label to + \textbf{Proof:}; \verb!\renameSolnAfterTo{}! produces no + label. These changes will be local to the group in which they are + made, or global of there they are not made in a group. + + The command \cs{resetSolnAfterToDefault} sets the label text back to + the default. The default label is \verb!\textit{Solution}:!. + + \item[\texttt{preview}] The bounding boxes are shown when this + option is taken, provided the \texttt{online} or \texttt{email} + option is chosen. See the description of these two options + below. + + \item[\texttt{proofing}] Using this option will cause the + correct answer for multiple choice questions to be marked with + a check mark; the correct answers for fill-in questions + (\cs{fillin} or \cs{TF}) are also shown.\medskip + + The \texttt{answerkey} option, described below, + executes the \texttt{proofing} and \texttt{solutions\-after} + options. + +\end{description} + +\redpoint The following options are unique to the \textsf{eqexam} package. + +\begin{description} +\item[\texttt{pointsonleft}] The points for the problem are displayed in + the left margin. + +\item[\texttt{pointsonright}] The points for the problem are on the left + margin. + +\item[\texttt{pointsonboth}] Points are displayed in both margins. + +\item[\texttt{nopoints}] Causes points not to be displayed, or + calculated. Useful for writing documents that do not have points, + such as a questionnaire. + +\item[\texttt{totalsonleft}] The totals for each page can be + displayed at the bottom left corner of each page using this option. + +\item[\texttt{totalsonright}] The totals for each page can be + displayed at the bottom right corner of each page using this + option. + +\item[\texttt{nototals}] Use this option if you don't want any + totals at the bottom of the page. + +\item[\texttt{noparttotals}] When multiple \texttt{exam} environments appear on + the same page, they are separated by a horizontal rule. The page total + for the closing \texttt{exam} environment is inserted into the margin on + the same line as the horizontal rule. This option turns off the insertion + of the page total for the closing \texttt{exam} environment.\medskip + + There are two commands that can be used for local control of + this feature, they are \cs{eoeTotalOff} and \cs{eoeTotalOn}. + When an \texttt{exam} ends near the bottom of one page, the + new exam will begin on the next page, this results in the + horizontal rule being generated with the end of exam totals, + and the totals at the bottom as well. If these two numbers are + the same, then you can turn off the end of exam total using + \cs{eoeTotalOff}. Use this command just above + \verb+\end{exam}+ and the changes will be local to that exam + part. + +\item[\texttt{parttotalsonright}] Place the part totals in the right + margin, this is the default. + +\item[\texttt{parttotalsonleft}] Place the part totals in the left + margin. + +\item[\texttt{nosummarytotals}] When you use the + \texttt{instructions} environment, the total points for + \texttt{exam} are displayed following the instruction heading. + Using this option turns off this feature. + +\item[\texttt{noseparationrule}] When the document has multiple + \texttt{exam} environments, a separation rule is placed between + them. This option turns off that feature. + + The design of the separation rule may be modified by the document author + by redefining \cs{separationrule}, its definition is given below: +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand{\separationrule}{\makebox[\linewidth]% +{\centering\rule{.67\linewidth}{.4pt}}} +\end{Verbatim} + +\item[\texttt{coverpage}] Some instructors like to have a cover + page for their exams, use this option to create a cover page. Use + the \cs{eqexcoverpagedesign} command to design your own cover page. + +\item[\texttt{coverpagesumry}] is a companion to the \texttt{coverpage} option, + \texttt{coverpagesumry} takes one of three values: \texttt{bypages}, \texttt{byparts}, \texttt{none}. + +\begin{description} + \item[\texttt{coverpagesumry=bypages}] If \texttt{bypages} is chosen, an ``Exam Record'' + appears on the cover page. See the left-hand figure in + Figure~\ref{fig:ExamRecord}. A page total appears on each line. Note + ``Page~3,'' in the figure; the total there is ``$37\,\text{pts}\ + (12\,\text{pts}+25\,\text{pts})$.'' This means that there are 37 + points on page~3; on this page the first \texttt{exam} environment + ended and a second \texttt{exam} environment begins, there are 12 + points on page~3 from the first \texttt{exam} environment, and 25 + points on that page from the second \texttt{exam} environment. + +\begin{figure}[htb] +\begin{center} +\includegraphics[width=.4\linewidth]{bypages}\quad +\includegraphics[width=.4\linewidth]{byparts} +\caption{Exam Record}\label{fig:ExamRecord} +\end{center} +\end{figure} + + \item [\texttt{coverpagesumry=byparts}] If \texttt{byparts} is chosen, an + ``Exam Record'' appears on the cover page that lists the number of + points per part. (Each exam environment is considered here a + ``part.'') See the right-hand figure in + Figure~\ref{fig:ExamRecord}. + + \item [\texttt{coverpagesumry=none}] If this option is chosen (the default), no + ``Exam Record'' is generated. If the key \texttt{coverpagesumry} does not + appear in the option list of \textsf{eqexam}, no ``Exam Record'' is written. + + \end{description} + + See \Nameref{examrecord} for more details on this topic. + +\item[\texttt{nospacetowork}] When the \texttt{nosolutions} option + is taken, the \texttt{solutions} + environment leaves vertical space in which to respond to the + question. Use this option to override this behavior.\medskip + + The command \cs{SpaceToWork} causes the white space to be + created again, and the \cs{NoSpaceToWork} turns it off again. + Use these two commands to turn on and off the creation of + vertical spaces in different parts of your exam. + +\item[\texttt{answerkey}] This is a convenience option equivalent + to \texttt{proofing} and \texttt{solutionsafter}. Useful for + creating an ``answer key'' with answers and solutions displayed. + +\item[\texttt{solutionsonly}] Using this option, it is possible to obtain +a typeset document consisting of only the solutions to \textsf{eqexam} document. +See \Nameref{solutionsonly} for further details. + +\item[\texttt{vspacewithsolns}] An unusual feature requested by a user + for homework assignments. This option is a combination of + \texttt{nosolutions} (where vertical space is left by the + \texttt{solutions} environment to respond to the question), but + the solutions are written the \cs{jobname.sol} and input back in + at the end of the document. + + This option is incompatible with \texttt{answerkey}, + \texttt{nosolutions}, and \texttt{solutionsafter}, so when + \texttt{vspacewithsolns} is used, it ``cancels'' these other + options. + + The command \cs{showAllAnsAtEnd} is inserted at the top of the + \cs{jobname.sol} file and when \cs{jobname.sol} are input back + in, the command \cs{showAllAnsAtEnd} is executed. The definition + of \cs{showAllAnsAtEnd} is +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand{\showAllAnsAtEnd}{% + \makeAnsEnvForSolnsAtEnd + \answerkeytrue\eq@proofingtrue + \eq@solutionsaftertrue\vspacewithsolnstrue + \displayworkareafalse\withsoldoctrue +} +\end{Verbatim} +Basically, this turns on all the switches that correspond to the +\texttt{answerkey} option. This command may be redefined to suite your +purposes. + +\handpoint When this option is taken, the switch \cs{ifvspacewithsolns} +may be used to bring in alternate content. + +See \Nameref{vspacewithsolns} for further details. + +\item[\texttt{ftbsolns}] An alias for \texttt{vspacewithsolns}. + +\item[\texttt{useforms}] Multiple choice questions have two forms, + (1) the choices are labeled using letters (a), (b), (c), etc.; or + (2) using a rectangular fill box. The default is~(1). The + \texttt{useforms} switches the default to~(2). You can use the + commands \cs{sqLinks} and \cs{sqForms} to change back and forth + between these two types within the exam document. Using one of + these commands outside a \texttt{problem} environment will + globally change the default, from within, it will only change the + default locally. + +\item[\texttt{flextended}] When this option is taken, additional code is + input to support filler lines, refer to Section~\ref{ss:VSFT} for + details; in particular, read \Nameref{sss:flxtnd}. + +\item[\texttt{myconfig}] If this option is taken, \textsf{eqexam} + looks for the configuration file \texttt{eqexam.cfg}. This + configuration file is input at the end of the package, and can be used + to redefine, for language localization purposes, any of the (text) + macros described in this manual. See the section \Nameref{custom} for + a partial listing of macros that can be redefined and placed in + \texttt{eqexam.cfg}.\medskip + +\item[\texttt{myconfigi}\dots\texttt{myconfigvi}] Six additional + options for inputting a configuration file. If you take one of + these options, \textsf{eqexam} inputs the corresponding + configuration file \texttt{eqexami.cfg}\dots\texttt{eqexamvi.cfg}. + +\item[\texttt{cfg}] Syntax: \texttt{cfg=\anglemeta{basename}}. If this option is taken, +\textsf{eqexam} looks for a file named \texttt{\anglemeta{basename}.cfg} and is input. + + For one of my recent classes, I wrote many + standard handouts documents: first day handout, assignment documents, + homework assignments, review documents, test documents, and + in-class notes. Each document-type had its own \textsf{eqexam} + format (configuration file, \texttt{eqexami.cfg}\dots\texttt{eqexamiv.cfg}. + It got confusing to keep track of all these configuration files. At which point + I decided to add a \emph{named} configuration scheme. If you use the key \texttt{cfg} + in the option list \texttt{cfg=firstday}, \textsf{eqexam} will look for a file + named \texttt{firstday.cfg} + +\item[\texttt{obeylocalversions}] An option put in to give greater control over + versions. Perhaps you have a \textsf{eqexam} file that has questions + with multiple versions. You would like to pick and choose the versions + to be used. In this case, using \texttt{obeylocalversions} will cause + \textsf{eqexam} to obey any \cs{selectVersion} commands embedded in + the document. + +\item[\texttt{allowrandomize}] Use this option to randomize + the multiple choice/selection questions. See \Nameref{s:random} for details. + +\item[\texttt{showgrayletters}] When \texttt{showgrayletters} is used, multiple choice +questions will have a gray capital letter +\texttt{A}, \texttt{B}, \texttt{C}, etc. underneath it. This letter +can then be referred to in the text or the solution using the \cs{REF} command. + +See \Nameref{showgraylettersOpt} for more information. + + \item[\texttt{usexkv}] When this option is used, and the document + author has the \textsf{xkeyval} package on his/her system, there is a + re-definition of the \cs{fillin} command. For more information, + see \Nameref{extendfillin}. + + \item[\texttt{allowcirc4mc}] Allows to use of circles (created by + the \texttt{lcircle10} font) for multiple choice questions. See + \Nameref{allowcirc4mc} for details. + + +\end{description} + +\redpoint The next option concerns a major new feature, available +in \textsf{eqexam}, version 3.0 or later. + +\begin{description} + \item[\texttt{fortextbook}]\label{fortextbook} This option is designed support + textbook authors. See \mlNameref{ftbop} for a greater explanation. +\end{description} + +\redpoint The next two apply to files that have several versions in them, +these were defined for use by the \textsf{AeB Exam Builder} +utility,\footnote{\url{http://www.acrotex.net/builders/}} but they are +available to the document author. + +\begin{description} + \item[\texttt{max}] The value of \texttt{max}, \texttt{max=\anglemeta{N}}, + is a positive integer. The value of \texttt{max} is the + number of versions for this document. This option executes + \cs{numVersions\darg{\anglemeta{N}}} at the end of the package. + + \item[\texttt{rendition}] This is a key-value pair. + \texttt{rendition=\anglemeta{alpha}}, where \anglemeta{alpha} letter corresponding to + the version that is to be typeset. At the end of the package, the + command \cs{forVersion\darg{\anglemeta{alpha}}} is executed. + +\end{description} + +\redpoint The next four options require the {\cAcroB}, and all of +its required packages, such as \textsf{hyperref}, their use +implies you are going to publish the document as a {\PDF}. + +\begin{description} + +\item[\texttt{pdf}] This option doesn't do much, it brings in the + \textsf{web} package, which in turn, places the values of the + keywords (\cs{title}, \cs{author}, \cs{subject}, etc.) into the + Document Description dialog of the {\PDF}. + +\item[\texttt{links}] This option brings in both \texttt{web} and + \texttt{exerquiz}. When you do not use a solutions option + (\texttt{nosolutions} and \texttt{solutionafter}), the solutions + appear at the end of the document. When the \texttt{links} option + is used, links from the questions to the solutions are created. + Unless you use a ``paper option'' (\texttt{forpaper} and + \texttt{forcolorpaper}), each solution is on a different page, + making a document with a lot of pages. When you also specify a + paper option, the solutions are separated by a \cs{medskip}. + +\item[\texttt{online}] The \texttt{online} option implies the + previous two options, but does more. When this option is taken, + and the \texttt{nosolutions} option is specified, {\PDF} forms are + created: multiple choice questions become radio button fields; + fill-in questions become text fields, and the vertical space + created by the \texttt{solutions} environment become multi-line + text fields.\medskip + + This may be a useful option for an exam taken in a + CBT\footnote{Computer Based Testing} lab, where the students + can type in their responses and when finished, print the + document to a lab printer to hand in. + +\item[\texttt{email}] This option implies the \texttt{online} + option, in addition, adds a submit button to the upper left corner + of the first page of the exam. The student can take the test in a + CBT lab, then submit the results to the instructor via email. + +\end{description} +\noindent See the section \Nameref{email} for additional details +of these last two options. + +\redpoint When any one of the four options above are taken, a +driver needs to be specified as well, the choices are\dots + +\begin{description} + +\item[\texttt{dvips}] For users of \textsf{dvips}, the + dvi-to-postscript converter. + +% \item[\texttt{pdftex}] For users of \textsf{pdftex} application. + +% \item[\texttt{dvipdfm}] For users of \textsf{dvipdfm} application. + +\item[\texttt{dvipsone}] For users of the + {Y\!{\footnotesize\&}\!Y\TeX} System, such as myself. + +%\item[\texttt{textures}] For \textsf{textures} users. (This +% option is totally untested.) +\end{description} +The drivers \app{pdftex}, \app{luatex}, and \app{xetex} are automatically detected and need not +be specified as a driver option. + +The driver names are passed on to \pkg{hyperref} and to +\pkg{eforms}\footnote{A component of \AcroB.} for the proper creation of +links and form fields. + +\subsection{Configuration Files} + +The \textsf{eqexam} looks for two configuration files, they are +\texttt{web.cfg} and \texttt{eqexam.cfg}. + +The first one \texttt{web.cfg} may be already present on your hard +drive if you use the {\AcroB}. Typically, desired default driver +option is placed in here, for example, \texttt{web.cfg} might +contain the single line, +\begin{Verbatim}[xleftmargin=\amtIndent] +\ExecuteOptions{dvips} +\end{Verbatim} +\noindent for users of the \textsf{dvips} application for +converting \texttt{.dvi} files to \texttt{.ps} file. The drivers +supported by \textsf{eqexam} are listed in the previous section. + +The second configuration file, \texttt{eqexam.cfg}, is input at +the end of the package, provided the document author takes the +\texttt{myconfig} option. Use this file to redefine some of the +commands described in \Nameref{custom}, and elsewhere, to +customize \textsf{eqexam}. An obvious use for this is to have a +language customization of the package, input through +\texttt{eqexam.cfg}. + +If you place \texttt{eqexam.cfg} in the {\LaTeX} search path, +these customization will be global to all documents that specify +the \texttt{myconfig} option. If is is placed in the source +document folder (which is not in the {\LaTeX} search path) the +changes are local to all documents developed in that folder. + +\subsection{The \texttt{solutionsonly} Option}\label{solutionsonly} + +With this option, it is possible to obtain a listing of only the solutions +in an \textsf{eqexam} source file. A possible application of this feature +is if you publish homework or practice test questions, you can later +publish the solutions to them. + +%\handpoint The demo file for this option is \texttt{eqex\_solnsonly.tex}, where you +%will find detailed instructions for how to do this. See also the file +%\texttt{text03.tex}, which demos both the \texttt{solutionsonly} option and the +%\texttt{vspacewithsolns} option. + +\exAeBBlogPDF{p=1227} The demo file for this option is +\texttt{\href{\urlAcroTeXBlog/?p=1227}{eqex\_solnsonly.pdf}}, available from +the {\AcroBlog} website. The source file is attached to the PDF. Within the +source file, you will find detailed instructions for how to create a +solutions-only file. + + +\subsection{The \texttt{vspacewithsolns} Option}\label{vspacewithsolns} + +With option is a combination of \texttt{nosolutions} (where vertical +spaces are left for extended response questions, and multiple choice and +fill-in the blank are left, well, blank) and compiling the document +with no options at all, in this case the solutions appear at the end of +the document. + +To summarize, when \texttt{vspacewithsolns} is used, the test section is +left blank for the student to fill in, but at the end of the document are +the solutions. I've recently used this option to compile an old test (from +a previous semester) and publish it on the web. The student can try +solving the old test, with the solutions at the end of the +document.\footnote{Another option is to first publish your old exam with +the \texttt{nosolutions} option, then, after a suitable time, publish the same document +with the \texttt{solutionsonly} option.} + +\newtopic An alias for this option is the option \texttt{ftbsolns}. + +\exAeBBlogPDF{p=1220} The demo file for this feature is named +\texttt{\href{\urlAcroTeXBlog/?p=1220}{hw02.pdf}}. See also the file +\texttt{\href{\urlAcroTeXBlog/?p=1206}{test03.pdf}}, which demos both the +\texttt{solutionsonly} option and the \texttt{vspacewithsolns} option. + +\subsection{The \texttt{fortextbook} Option and \textsf{fortextbook} Package}\label{ftbop} + +This option is designed for authors of textbooks. The \texttt{fortextbook} +option defines the \texttt{probset} environment---used to create problems +sets in the textbook---as a re-purposing of the \texttt{exam} +environment. When the text is compiled with the \texttt{studented} option +(student edition), only odd-numbered solutions/answers are written to the +end of the document; when the \texttt{instred} option (instructor edition) is +used, all solutions/answers are written to the end of the document, there +are options for annotating the book with the answers in the margins or +following the questions (instructor edition). + +Documentation for this option is found in the \texttt{doc/fortextbook} +folder. See the file \texttt{fortextbook.pdf} and its source file +\texttt{fortextbook.ltx}. + +To use the \texttt{fortextbook} option, a whole panoply of options are needed, +\begin{Verbatim}[xleftmargin=\amtIndent] +\usepackage[% + fortextbook,ftbsolns,usecustomdesign, + forcolorpaper,noseparationrule,usexkv +]{eqexam} +\end{Verbatim} +Accompanying the \textsf{eqexam} is a simple wrapper package called +\texttt{fortextbook}, which basically calls \textsf{eqexam} with all the above +options. So, the textbook author needs only to specify, + +\begin{Verbatim}[xleftmargin=\amtIndent] +\usepackage{fortextbook} +\end{Verbatim} +The documentation for this option is quite extensive and is +available in the separate document \texttt{fortextbook.pdf}. This +document is a short ``textbook'' that illustrates and documents +the features of this option. + +See the \textbf{\ulSetLink{http://www.acrotex.net/blog}{Acro\TeX{} +Blog}} for several articles on the \texttt{fortextbook} option, +beginning with the first article +\textsl{\ulSetLink{http://www.acrotex.net/blog/?p=604}{The +\texttt{fortextbook} option, Part 1, The Instructor Edition}}. A +listing of all articles of the +\ulSetLink{http://www.math.uakron.edu/~dpstory/eqexam.html}{\textsf{eqexam} +package} may be obtained by following +\ulSetLink{http://www.acrotex.net/blog/?tag=eqexam-package}{this +link}. + +The full series of articles on the \texttt{fortextbook} option may be found under the +\ulSetLink{http://www.acrotex.net/blog/?tag=fortextbook}{fortextbook tag} at the blog site. + + + +\section{The \texttt{online} and \texttt{email} Options}\label{email} + +When you use the \texttt{online} option, all fields created by the +\cs{fillin} command, and this includes \cs{TF}, are converted into +text fields, and the white space created by the \texttt{solutions} +environment is converted to a multi-line text field. The fields +manifest themselves when the document is viewed within the Adobe +Reader, or any other {\PDF} viewer that supports form fields. + +This may be a useful option to the few people out there who are +not in a technical field that requires specialized symbols to +respond to a question. An exam created by the \texttt{online} +option can be filled out online, printed, and submitted to the +course instructor, perhaps within a lab setting. + +There are other applications, such as creating a course survey, or +a questionnaire of some type the students can fill out and submit. +The \texttt{email} option may be more appropriate for these +applications. + +\subsection{The \texttt{email} Option} + +When you pass the \texttt{email} option to \textsf{eqexam}, this +does everything the \texttt{online} option does, in addition, it +creates a ``Submit'' button that appears in the top-left margin of +the exam (it does not appear on the cover page), and is placed +there by the \cs{maketitle} command, that normally goes just after +the opening of the document environment, \verb+\begin{document}+. + +The forms button is all setup to submit to the server-side script, +\textsf{eqAttach.asp}, an active server page using +\textsf{vbscript} as its scripting language. This script, when +properly installed and functional, receives the form data +generated by the document and attaches it to an email, which it +sends off to the designated destination. Before discussing how to +install and use \textsf{eqAttach.asp}, let me cover some commands +that controls this button as well as options for changing what is +sent to the server-side script. + +When you take the \texttt{email} option, you need to supply a +minimum of two pieces of information: the path to the server-side +script \textsf{eqAttach.asp} and the email address of the person +the results are to be sent. The command \cs{SubmitInfo} is used to +supply this info, for example, +\begin{Verbatim}[xleftmargin=\amtIndent] +\SubmitInfo{http://localhost/scripts}{dpstory@uakron.edu} +\end{Verbatim} +This command takes two arguments, the first is the URL to the +server-side folder that contains \textsf{eqAttach.asp}, the second +argument is the email address of the recipient of the email. (You +can have multiple recipients by separating the address by an +comma.) + +After the student submits the responses to the questions, an email +is sent to the recipient (the instructor, perhaps). When the +recipient receives the email, s/he can save the {\FDF} attached file +(containing the student responses) to a folder on the local hard +drive. At least for a Windows machine when you open the {\FDF}, the +{\PDF} will be fetched and the student data will be populated into +the form fields. + +Once this is done, the instructor can either save the populated +file to the hard drive for later processing (the Acrobat +application needed for this step) or print it to a printer for +grading by hand. + +If the instructor has Acrobat, s/he can use the markup capability +of Acrobat to grade the electronic version of the test, and return +the electronic version, with markup, to the student. + +Below is the subject and message body of a ``typical'' submittal for the +student ``John Q. Student''. + +\begin{flushleft} +Message Subject: +\begin{Verbatim}[xleftmargin=\amtIndent] +Exam Results: Test 1 of U. S. History +\end{Verbatim} +\end{flushleft} + +\begin{flushleft} +Message Body: +\begin{Verbatim}[xleftmargin=\amtIndent] +Exam Information: + Course Name: U. S. History + Exam: Test 1 + Student: John Q. Student + TimeOfQuiz: 1/19/2005 12:07:56 PM +\end{Verbatim} +The {\FDF} is attached. +\end{flushleft} + + +\noindent The following commands can be used to modify the email message. + +\redpoint\cs{EmailCourseName} is used to specify the name of the +course. The default value for this is \cs{websubject}, obtained +from the \cs{subject} macro used in the preamble; however, if you +want a different name in the email, perhaps with more information +included, you can redefine the value using this macro. +\begin{Verbatim}[xleftmargin=\amtIndent] +\EmailCourseName{\websubject} % the default +\end{Verbatim} + +\noindent\textbf{\color{red}Important:} When you use {\TeX} +formatting in the subject, such as +\begin{Verbatim}[xleftmargin=\amtIndent] +\subject{\bfseries Calculus 1} +\end{Verbatim} +and you are using the \texttt{email} option, it will +be necessary to use \cs{EmailCourseName} to redefine the subject, e.g., +\verb+\EmailCourseName{Calculus 1}+, to avoid possible {\TeX} compile +errors, or to prevent {\TeX} primitives being a part of your +email! + +\redpoint\cs{EmailExamName} is used to specify the exam name of +the course. The default value for this is \cs{webtitle}, obtained +from the \cs{title} macro used in the preamble; however, if you +want a different name in the email, perhaps with more information +included, you can redefine the value using this macro. +\begin{Verbatim}[xleftmargin=\amtIndent] +\EmailExamName{\webtitle} % the default +\end{Verbatim} + +\noindent\textbf{\color{red}Important:} If you use some {\TeX} +formatting in the title, such as +\begin{Verbatim}[xleftmargin=\amtIndent] +\title{\bfseries Test 1} +\end{Verbatim} +and you are using the \texttt{email} option, it will be necessary +to use \cs{EmailExamName} to redefine the title, e.g., +\verb+\EmailExamName{Test 1}+, to avoid possible {\TeX} compile +errors, or to prevent {\TeX} primitives being a part of your +email! + +\redpoint\cs{EmailSubject} The document author might want a custom +subject in the email, instead of the standard one. By using this +macro, he can design his own email subject. +\begin{Verbatim}[xleftmargin=\amtIndent] +\EmailSubject{} % the default +\end{Verbatim} +\noindent In this case \textsf{eqAttach.asp} inserts the standard one. +\begin{Verbatim}[xleftmargin=\amtIndent] +Exam Results: \webtitle of \websubject +\end{Verbatim} +\noindent The email would read ``\texttt{Exam Results: Test 1 of +Calculus I}'', for example. + +To change the email subject we would put the following command in +the preamble: +\begin{Verbatim}[xleftmargin=\amtIndent] +\EmailSubject{Another Set of Cool Results} +\end{Verbatim} + +\redpoint \cs{ServerRetnMsg} The server script +(\textsf{eqAttach.asp}) returns a message acknowledging the +receipt of the data, this command allows the document author to +customize the return message. The default definition is: +\begin{Verbatim}[xleftmargin=\amtIndent] +\ServerRetnMsg{} +\end{Verbatim} +\noindent In this case \textsf{eqAttach.asp} inserts the standard +one, ``Exam results successfully sent to your instructor!''. + +To change the return message to something more meaningful, put +this command in the preamble, for example, +\begin{Verbatim}[xleftmargin=\amtIndent] +\ServerRetnMsg{Your responses to the \\TeX Survey have been + received, thank you!} +\end{Verbatim} + +\redpoint\cs{SubmitButtonLabel} is the label that appears on the +submit button. +\begin{Verbatim}[xleftmargin=\amtIndent] +\SubmitButtonLabel{Submit} % the default +\end{Verbatim} + + +\subsubsection{Installing \textsf{eqAttach.asp}} + +On the server side, in order for \textsf{eqAttach.asp} to run +correctly, Microsoft Internet Information Server (IIS), version +4.0 or greater, is needed. The script \textsf{eqAttach.asp} needs +to be placed where ASP scripts have execute permissions. + +The \textsf{eqAttach.asp} uses the \textsl{Acrobat FDF +Toolkit}\footnote{Currently located at the +\href{http://partners.adobe.com/public/developer/acrobat/devcenter.html} +{Acrobat Family Developer Center}.}, version 6.0. Follow the +directions for installation contained in the accompanying +documentation. + +Install \textsf{eqAttach.asp} in a folder (perhaps called +\texttt{Scripts}) designated to execute scripts. If you don't +have such a folder, then the following steps explain how to +create a virtual directory through IIS that points to this folder. + +\begin{enumerate} +\item Create a new folder on the system (\texttt{Scripts}, for +example). Its recommended location is inside the \texttt{Inetpub} +folder. + +\item Place \textsf{eqAttach.asp} in this newly created folder. + +\item In the MMC snap-in for IIS, create a virtual directory by +right-clicking on the Default Web Site and selecting \texttt{New > +Virtual Directory}. + +\item Type ``Scripts'' (or whatever the name of the folder you +created in~Step~1) as the alias for the virtual directory, and +then link it to the physical directory you created in Step~1. + +\item Make sure that ``Script execution'' privileges are enabled. +If not, enable them. +\end{enumerate} + + +\subsubsection{Setting up and Modifying the Script} + +On the server side, in order for \textsf{eqAttach.asp} to run +correctly, Microsoft Internet Information Server (IIS), version +4.0 or greater, is needed. The script \textsf{eqAttach.asp} should +be placed where ASP scripts have execute permissions. There are +two methods of sending e-mail: +\begin{enumerate} + \item \texttt{CDONTS}: This method (which is commented out by + default) can be used on an NT server. Uncomment if you want to + use CDONTS, and comment out the CDOSYS code lines that follow. + \item \texttt{CDOSYS}: This can be run on a Win2000 or WinXP + server. +\end{enumerate} + +The script needs to be modified appropriate to your server, in +particular, search down in \texttt{eqAttach.asp} for the +configuration line +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +eqMail.Configuration.Fields.Item + ("http://schemas.microsoft.com/cdo/configuration/smtpserver") + = "mySMTP" +\end{Verbatim} +\noindent replace \texttt{mySMTP} with your SMTP server. + +\subsubsection{Some Options} + +The default behavior of \textsf{eqAttach.asp} is to return a +message to the document that indicates the receipt of the data, +this message is``Exam results successfully sent to your +instructor!'' The message, as explained earlier, can be changed +using the \cs{ServerRetnMsg}, like so +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\ServerRetnMsg{Your TeX survey results have been received, thank you.} +\end{Verbatim} +\noindent Now, if for whatever reason you don't want this +confirmation message to return to the document for display in +alert box, you can sent the \texttt{silent} as part of the query +string. For example, if +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\SubmitInfo{http://myWebSite/scripts/eqAttach.asp?silent\#FDF} + {myname@mymailprovider} +\end{Verbatim} +\noindent placed in the preamble of your document specifies the +path to the script, silent mode, and the email address of the +recipient of the form data. + +\medskip\noindent +Another other feature of \textsf{eqAttach.asp} that can be changed +through the query string is the \texttt{/F} key-value pair of the +\texttt{FDF} sent out in email. The value of this key is the path +to the document that sent the \texttt{FDF}, it may be a url (an +address on the Internet) or it could be a file specification of a +local hard drive. If you specify \texttt{nopath} in the query +string, like so +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\SubmitInfo{http://myWebSite/scripts/eqAttach.asp?nopath\#FDF} + {myname@mymailprovider} +\end{Verbatim} +\noindent then \textsf{eqAttach.asp} strips out the file path and +leaves only the file name. + +\redpoint This is what I did with the \texttt{tex\_survey.tex} +source file. I placed \texttt{tex\_survey.pdf} in a \texttt{LaTeX +Survey} folder on my desktop. As the emails came in, I saved the +\textsf{FDF} attachments to this folder. By (double) clicking on +the \textsf{FDF}, \texttt{tex\_survey.pdf}, which is in the same +folder, opened and the form data populated the fields from whence +they were sent. It worked well for me. + +If you don't use the \texttt{nopath} option, when you click +on an \texttt{FDF} file you've received by email, your browser +opens and the PDF on the Internet is brought into the +browser and the form data populates the form fields, \dots at least on +a Windows machine. \texttt{:-)} + +\subsubsection{References} + +The following links were used as a reference in the development of the +\texttt{Email.asp} script. +\begin{itemize} + \item CDOSYS: + \begin{itemize} + \item \href{http://invisionportal.com/show_tutorial.asp?TutorialID=160}{Invision Portal} Tutorial: CDOSYS email tutorial + \item \href{http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_imessage_interface.asp} + {MSDN}: CDO for Windows 2000. The IMessage Interface. (Use MIE to view this page.) + \item \href{http://www.asp101.com/articles/john/cdosmtprelay/default.asp}{ASP 101} Sending Email Via an External SMTP Server Using CDO + \end{itemize} + \item CDONTS + \begin{itemize} + \item \href{http://www.juicystudio.com/tutorial/asp/cdonts.html}{Juicy Studio} The ASP CDONTS Component + \item \href{http://www.devasp.com/Samples/mail.asp}{DevASP} Sending Mail from ASP with CDONTS.NewMail Object + \end{itemize} +\end{itemize} + +\section{Bells, Whistles and other Customizations} + +\subsection{Customizations}\label{custom} + +We enumerate some commands for changing the default design of \textsf{eqexam}. + +\subsubsection{Course Info Commands}\label{courseInfo} + +\textsf{eqexam} has several commands for the student to provide some identification +information. + +\redpoint \cs{eqexamName}. This command defines the macro +\cs{eq@ExamName} that creates the underlined space for the student +to enter his/her name, and also defines the text box form field, +in the case the \texttt{online} or \texttt{email} options are +taken. There are two (design) parameters for \cs{eqexamName} +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\eqexamName[!meta(eforms_opts)]{!meta(width)} +\end{Verbatim} +\noindent The first optional parameter can be used to modify the +appearance of the text field, see the \href{eformman.pdf}{eForms} +documentation for details. The second parameter is the width of +the field. The default definition is +\begin{Verbatim}[xleftmargin=\amtIndent] +\eqexamName[\Ff\FfRequired]{2.25in} +\end{Verbatim} +\noindent Here, the text field that will be generated (when +\texttt{online} or \texttt{email} is specified) will be a required +field. The total width of the space provided is $2.25$ inches. + +The command \cs{examNameLabel} controls the label to be used for +this name field. It takes one parameter, the label +to be used for the name field; the default definition is +\verb+\examNameLabel{Name:}+. + +\redpoint \cs{eqSID}. This command defines the macro \cs{eq@SID} +that creates the underlined space for the student to enter his/her +student Identification number (SID), and also defines the text box +form field, in the case the \texttt{online} or \texttt{email} +options are taken. There are two (design) parameters for +\cs{eqSID} +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\newcommand\eqSID[!meta(eforms_opts)]{!meta(width)} +\end{Verbatim} +\noindent The first optional parameter can be used to modify the +appearance of the text field, see the \href{eformman.pdf}{eForms} +documentation for details. The second parameter is the width of +the field. The default definition is +\begin{Verbatim}[xleftmargin=\amtIndent] +\eqSID[\Ff\FfRequired]{2.25in} +\end{Verbatim} +\noindent Here, the text field that will be generated (when +\texttt{online} or \texttt{email} is specified) will be a required +field. The total width of the space provided is $2.25$ inches. + +The command \cs{examSIDLabel} controls the label used for this SID field. +It takes one parameter, the label to be used for the name field; the +default is \verb+\examSIDLabel{SID:}+. + +\redpoint \cs{eqEmail}. This command defines the macro +\cs{eq@Email} that creates the underlined space for the student to +enter his/her student email address, and also defines the text box +form field, in the case the \texttt{online} or \texttt{email} +options are taken. There are two (design) parameters for +\cs{eqEmail} +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\newcommand\eqEmail[!meta(eforms_opts)]{!meta(width)} +\end{Verbatim} +\noindent The first optional parameter can be used to modify the +appearance of the text field, see the \href{eformman.pdf}{eForms} +documentation for details. The second parameter is the width of +the field. The default definition is +\begin{Verbatim}[xleftmargin=\amtIndent,] +\eqEmail{2.25in} +\end{Verbatim} +\noindent Here, the text field that will be generated (when +\texttt{online} or \texttt{email} is specified). The total width +of the space provided is $2.25$ inches. + + +The command \cs{examEmailLabel} controls the label to be used for +this email field. It takes one parameter, the +label to be used for the name field; the default definition is +\verb+\examEmailLabel{Email:}+. + + +\subsubsection{Changing the Title and Cover Page} + +\redpoint \cs{maketitle}. The main heading that appears at the top +of the first page of the exam is created by the {\LaTeX} +(redefined) command \cs{maketitle}. The \cs{maketitle} has some +code to place the email button in the top margin, followed by the +expansion of the command \cs{maketitledesign}, whose definition is +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\newcommand\maketitledesign +{% + \makebox[\textwidth]{\normalsize + \shortstack[l]{\strut\websubject\\\@date}\hfill + \shortstack[c]{\webtitle\\\strut\@altTitle}\hfill + \shortstack[l]{\strut\eq@ExamName\\\webauthor}}% +} +\end{Verbatim} +This command can be redefined using \cs{renewcommand} to suite your needs, for example, +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\makeatletter +\renewcommand\maketitledesign +{% + \makebox[\textwidth]{\normalsize + \shortstack[l]{\strut\websubject\\\webauthor, \@date}\hfill + \shortstack[l]{\webtitle\\\strut\@altTitle}\hfill + \shortstack[l]{\strut\eq@ExamName\\\eq@SID}}% +} +\makeatother +\end{Verbatim} +\noindent This code adds in a field for the student to enter +his/her student Id, here we enclose the code in a +\cs{makeatletter}/\cs{makeatother} because this redefinition +occurs in the preamble, and the code has an `\texttt{@}' in it. + +Command elements that are appropriate to the redefinition are \cs{maketitledesign} are\dots +\begin{description} + \item[\cs{websubject}] This is the course name, as determined by the \cs{subject} command. + \item[\cs{webtitle}] This is the exam name as determined by the \cs{title} command. + \item[\cs{altTitle}] An additional text field that is placed below \cs{webtitle}. + \item[\cs{@date}] This is the date as determined by the \cs{date} command. + \item[\cs{eq@ExamName}] This is the name field for the student to enter his/her name, as defined + by default or redefined by \cs{eqexamName}, see \Nameref{courseInfo}. + \item[\cs{eq@SID}] This is the student ID field for the student to enter his/her ID, as + defined by default, or redefined by the command \cs{eqSID}, see \Nameref{courseInfo}. + \item[\cs{eq@Email}] This is the student email field for the student to enter an email address, as + defined by default, or redefined by \cs{eqEmail}, see \Nameref{courseInfo}. + \item[\cs{theduedate}] This is a text macro defined by the \cs{duedate} command. For example, setting + \verb+\duedate{03/10/05}+ defines \cs{theduedate} so that it expands to \texttt{03/10/05}. May + be useful when redefining \cs{maketitledesign} for a homework assignment page. +\end{description} + +\redpoint \cs{eqexcoverpagedesign}. When the \texttt{coverpage} option is +taken, a default cover page appears unless it is redefined. The +\textsf{eqexam} package provides \cs{eqexcoverpagedesign} to design your +own cover page. The default cover page uses the + +\begin{description} + \item[\cs{websubject}] This is the course name, as determined by the \cs{subject} command. + \item[\cs{webtitle}] This is the exam name as determined by the \cs{title} command + \item[\cs{webuniversity}] This is the value set by the \cs{university} command, given + in the preamble. + \item[\cs{@date}] This is the date as determined by the \cs{date} command. + \item[\cs{eq@ExamName}] This is the name field for the student to enter his/her name, as defined + by default or redefined by \cs{eqexamName}, see \Nameref{courseInfo}. + \item[\cs{eq@SID}] This is the student ID field for the student to enter his/her ID, as + defined by default, or redefined by the command \cs{eqSID}, see \Nameref{courseInfo}. + \item[\cs{eq@Email}] This is the student email field for the student to enter his/her email address, as + defined by default, or redefined by \cs{eqEmail}, see \mlNameref{courseInfo}. +\end{description} +Copy the definition of \cs{eqexcoverpagedesign} from +\textsf{eqexam.dtx} and modify as desired. Place the new +definition in the preamble (enclosed between +\cs{makeatletter} and \cs{makeatother}) or in a custom style file. No +special support for this design is offered, because a cover page +can be designed in so many different ways. + +\newtopic Another command associated with the \texttt{coverpage} option,is the +\cs{place\-Cover\-Page\-Logo}, a simple command used to insert a logo on the cover page. +The logo can be used to cover the score in the next page if the +instructor places the score under the logo. Example of usage +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\placeCoverPageLogo{5in}{-1.5in}{\includegraphics{nwfsc_logo}} +\end{Verbatim} +Working from the upper left corner, the first parameter is the amount to move to logo +to the right, the second parameter is the amount to move the logo vertically. The +Third parameter is the content; perhaps an \cs{includegraphics} command. + + +\subsubsection{Changing the Running Headers} + +There are two running headers, one header for the exam itself, and +another when the solutions are shown at the end of the document. + +\redpoint Running Header for Exam. The commands \cs{lheadeqe}, +\cs{cheadeqe} and \cs{rheadeqe} are used for defining the left, right, and +center running headers. \textbf{Note:} these commands have been recently +renamed, originally they were named \cs{lhead}, \cs{chead} and \cs{rhead}, +but this conflicts with the \textsf{fancyhdr} package. If +\textsf{fancyhdr} has not been loaded by the time \textsf{eqexam} is +loaded, the eqexam definitions for \cs{lhead}, \cs{chead} and \cs{rhead} +still hold. Generally, it is recommended that the new command be used, +\cs{lheadeqe}, \cs{cheadeqe} and \cs{rheadeqe}. + +\begin{enumerate} +\item \begin{Verbatim}[commandchars=!()] +\lheadeqe{!meta(text)} +\end{Verbatim} +Changes the left header text of the running header. This command defines an +internal macro \cs{eq@lhead} that actually contains the text. The default is +\begin{Verbatim}[xleftmargin=\amtIndent] +\lheadeqe{\shortwebsubject/\shortwebtitle} +\end{Verbatim} + +\item \begin{Verbatim}[commandchars=!()] +\cheadeqe{!meta(text)} +\end{Verbatim} +Changes the center header text of the running header. +This command defines an internal macro \cs{eq@chead} that actually +contains the text. The default is +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\cheadeqe{-- Page \arabic{page}\space of \nPagesOnExam\space--} +\end{Verbatim} + +\item \begin{Verbatim}[commandchars=!()] +\rheadeqe{!meta(text)} +\end{Verbatim} +\noindent Changes the right header text of the running header. +This command defines an internal macro \cs{eq@rhead} that actually +contains the text. +\item[]The default is \verb+\rhead{\eq@ExamName}+. +\end{enumerate} +If you want to redesign the layout of the running +header, here is the macro that the above components fill. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\newcommand\runExamHeader{\eq@lhead\hfill\eq@chead\hfill\eq@rhead} +\end{Verbatim} + +\redpoint Running Header for Solutions. The components of the +running header for the solutions pages occur, as above, on the left, center +and right of each header are defined by the commands \cs{lheadSol}, +\cs{cheadSol} and \cs{rheadSol}. + +\begin{enumerate} +\item \begin{Verbatim}[commandchars=!()] +\lheadSol{!meta(text)} +\end{Verbatim} +\noindent Changes the left header text of the running header. This +command defines an +internal macro \cs{eq@lheadSol} that actually contains the text. The default is +\begin{Verbatim}[xleftmargin=\amtIndent] +\lheadSol{\shortwebsubject/\shortwebtitle} +\end{Verbatim} + + +\item \begin{Verbatim}[commandchars=!()] +\cheadSol{!meta(text)} +\end{Verbatim} +\noindent Changes the center header text of the running header. +This command defines an internal macro \cs{eq@cheadSol} that +actually contains the text. The default is +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\cheadSol{-- Page \arabic{page}\space of \nPagesOnExam\space--} +\end{Verbatim} + +\item \begin{Verbatim}[commandchars=!()] +\rheadSol{!meta(text)} +\end{Verbatim} +\noindent Changes the right header text of the running header. +This command defines an internal macro \cs{eq@rheadSol} that +actually contains the text. The default definition is +\verb+\rheadSol{SOLUTIONS}+. +\end{enumerate} +\noindent If you want to redesign the layout of the running +header, here is the macro that the above components fill. +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\runExamHeaderSol + {\eq@lheadSol\hfill\eq@cheadSol\hfill\eq@rheadSol} +\end{Verbatim} + +\subsubsection{Changing the Running Footers} + +The default set up of \textsf{eqexam} is to use no running footers; +actually, that's not quite right. \textsf{eqexam} places the command +\cs{settotalsbox} in the footer; this command is the one that places the +totals boxes, when requested. + +\newtopic\textsf{eqexam} defines three commands for the footer, +\settowidth{\aebdimen}{\ttfamily\string\lfooteqe\darg{\meta{text}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\lfooteqe{!meta(text)} +\cfooteqe{!meta(text)} +\rfooteqe{!meta(text)} +\end{dCmd} +\noindent where the \meta{text} is placed at the left, center, and +right of the running footer. The default for each is empty text. These +three comprise the definition of \cs{runExamFooter} +\begin{dCmd}{\linewidth} +\newcommand{\runExamFooter}{\eq@lfoot\hfill\eq@cfoot\hfill\eq@rfoot} +\end{dCmd} +\noindent The \cs{settotalsbox} and \cs{runExamFooter} then appear in the definition +of \cs{@oddfoot} in the definition of the \texttt{eqExamheadings} page style. +\begin{Verbatim}[xleftmargin=\amtIndent] +\renewcommand{\@oddfoot}{\settotalsbox\runExamFooter} +\end{Verbatim} +When doing any re-definition of the running footers at the \cs{@oddfoot} command, +be sure to include \cs{settotalsbox} on the \emph{left side of the running footer}; otherwise, +you will not have a totals box when you request one. + + +\subsubsection{Exam Strings} + +In this section we list a new commands that contain information about the exam. + +\settowidth{\aebdimen}{\ttfamily\string\nPagesOnExam} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\nPagesOnExam +\end{dCmd} +\noindent The command \cs{nPagesOnExam} expands to the total number of pages in the exam. + +\settowidth{\aebdimen}{\ttfamily\string\nQuesInExam\darg{\meta{exam\_name}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\nQuesInExam[!meta(exam_name)] +\end{dCmd} +\noindent \cs{nQuesInExam} expands to the total number of questions in the +exam. The command takes an optional argument, the \meta{exam\_name} +(this is the name given the exam as the required argument of the +\texttt{exam} environment). If the argument is not given, the name of the +current exam is used (when executed within an \texttt{exam} environment). +If \cs{nQuesInExam} appears outside an \texttt{exam} environment, the value of +the optional argument needs to be specified. + +\newtopic There are several commands are useful for documents that have several +\textsf{eqexam} environments, these are +\settowidth{\aebdimen}{\ttfamily\string\percentForPart\darg{\meta{exam\_name}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\theGrandTotal +\totalForPart{!meta(exam_name)} +\percentForPart{!meta(exam_name)} +\end{dCmd} +\noindent The first command sums the point totals for each of the +\texttt{exam} environments. The latter two, each taking one argument, the +name associated with the \texttt{exam}, reports the points for that +\texttt{exam} environment and the percent of the total for that +\texttt{exam} environment. + +\newtopic Below is a recent example taken from a final exam that I constructed for my class. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small] +\begin{eqComments}[Final Exam:] (\theGrandTotal\space points) The +final exam has two parts: + \textbf{Part I} (\totalForPart{InstrQuestions} points or + \percentForPart{InstrQuestions} of the total points) consists of + questions written by the instructor; + \textbf{Part II} (\totalForPart{GenEd} points or + \percentForPart{GenEd} of the total points) consists of + questions provided by the Department of Mathematics. +\end{eqComments} +\end{Verbatim} + +%\promoteNewPageHere{10pt} + +\handpoint The calculation of \cs{percentForPart} is done in one of two ways: +\begin{enumerate} + \item If the \textsf{fp} package is loaded, ``floating point + arithmetic'' is used and results are rounded to the number of + decimal points determined by \cs{nPctDecPts}, the default + definition of which is \verb!\newcommand{\nPctDecPts}{1}!. This command may be redefined + to another nonnegative integer value. +\item Otherwise---if the \textsf{fp} package is \emph{not + loaded}---\TeX's count registers are used, the percentage rounded + to the nearest integer. +\end{enumerate} + +\newtopic The calculations are made when the \cs{maketitle} command is +expanded. If, for whatever reason, you are not using \cs{maketitle}, you +can place the command that does the calculations, +\cs{EQEcalculateAllTotals}, just after \verb!\begin{document}!, and before +the first use of \cs{theGrandTotal} and \cs{percentForPart}. + +\settowidth{\aebdimen}{\ttfamily\string\firstPageOfExam\darg{\meta{exam\_name}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\firstPageOfExam{!meta(exam_name)} +\lastPageOfExam{!meta(exam_name)} +\end{dCmd} +\noindent These two commands expand the page numbers of the beginning and the ending +of the exam environment, respectively, with name \meta{exam\_name}. + +\subsubsection{Localization of Strings} + +% Added 01/10/06 +% \examNameLabel +% \ptsLabel, \ptsLabel +% \eachLabel +% \pointsLabel, \pointLabel +% \defaultInstructions + +In this section we list various macros that expand to text +appearing on an \textsf{eqexam} document. The default text is in +English. These commands can be redefined to other English +language phrases, or to other languages, and placed in the preamble of your document, +or in one of the \texttt{.cfg} files. + +\begin{itemize} +% Added 01/10/06 +\item\cs{examNameLabel}: On each page of the exam, there is a place +for the student to enter her/his name. \cs{examNameLabel} can be +used to define the name label, the default is +\begin{Verbatim}[xleftmargin=\amtIndent] +\examNameLabel{Name:} +\end{Verbatim} +\item \cs{examAnsKeyLabel}: When the \texttt{answerkey} option is in + effect, the line in which the student enters her/his name (labeled by + \cs{examNameLabel}) is filled by the value of the text macro + \cs{examAnsKeyLabel}. The default definition is +\begin{Verbatim}[xleftmargin=\amtIndent] +\examAnsKeyLabel{Answer Key} +\end{Verbatim} +Thus, when the \texttt{answerkey} +option is used, the name field appears as follows: +\begin{flushleft} +\underbar{\makebox[2.5in][l]{Answer Key}} +\end{flushleft} + +\item\cs{ptLabel} and \cs{ptsLabel}: Labels for indicating the points of a problem, the first is +the singular form of the second. The default is +\begin{Verbatim}[xleftmargin=\amtIndent] +\ptLabel{pt} % singular form +\ptsLabel{pts} % plural form +\end{Verbatim} +\item\cs{eachLabel}: Label for indicating the common point value of each of several parts +of the same problem. +\begin{Verbatim}[xleftmargin=\amtIndent] +\eachLabel{ea.} +\end{Verbatim} +\item\cs{pointLabel} and \cs{pointsLabel}: The word for `points' used in the \texttt{instructions} environment + that lists the number of points in this exam. The default is +\begin{Verbatim}[xleftmargin=\amtIndent] +\pointLabel{point} % singular form +\pointsLabel{points} % plural form +\end{Verbatim} +The \cs{pointsLabel} command defines \cs{eq@pointsLabel}, which, +in turn, is used in the \cs{summaryTotalsTxt}, the definition of +which follows: +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand{\summaryTotalsTxt} + {($\summaryPointTotal\,\text{\eqpointsLabel}$)} +\end{Verbatim} +\item\cs{defaultInstructions}: The \texttt{instructions} environment has a default heading. +The command \cs{defaultInstructions} allows you to change this heading. The default is +\begin{Verbatim}[xleftmargin=\amtIndent] +\defaultInstructions{Instructions.} +\end{Verbatim} +\end{itemize} + +\newtopic See \Nameref{ptTotalsBoxes} as well as the section \mlNameref{courseInfo} for +additional details on these and commands useful for laying out the +standard text of an \textsf{eqexam} document. + +\subsubsection{Customization of Color}\label{customColor} + +When the \texttt{forcolorpaper} option is used, various elements---such as +section titles, instruction headers, color for fill-in problems, and so on---have default colors. In +this section we list the color controls, along with their default definitions. + +\begin{Verbatim}[numbers=left,xleftmargin=\amtIndent,fontsize=\fontsize{10}{14}\selectfont] +\proofingsymbolColor{red} +\instructionsColor{blue} +\eqCommentsColor{blue} +\eqCommentsColorBody{black} +\universityColor{blue} +\titleColor{black} +\authorColor{black} +\subjectColor{blue} +\linkcolor{blue} +\nolinkcolor{blue} +\fillinColor{red} +\forceNoColor +\end{Verbatim} + +\noindent\textbf{Description of Color Commands:} +\begin{enumerate} + \item The color of the proofing symbol, it appear for multiple + choice questions with the \texttt{answerkey} option in effect. + \item The color of the header text for the \texttt{instructions} environment. + The header is the text that appears in the optional argument. + \item The color for the header text for the \texttt{eqComments} environment. + The header is the text that appears in the optional argument. + \item The color for the body of the text for the \texttt{eqComments} environment. + \item The color of the university, visible only when the \texttt{coverpage} option is taken. + \item The color of the title, visible only when the \texttt{coverpage} option is taken. + \item The color of the author, visible only when the \texttt{coverpage} option is taken. + \item The color of the subject, visible only when the \texttt{coverpage} option is taken. + \item The color applied to a link, applies only when \textsf{hyperref} is included through one of the PDF options, + \texttt{links}, \texttt{online}, or \texttt{email}. + \item The color applied to a link that has been turned off, applies + only when \textsf{hyperref} is included through one of the PDF options, + \texttt{links}, \texttt{online}, or \texttt{email}. + \item The color of the a fill-in (including a True/False question) + when one of the options \texttt{answerkey}, + \texttt{vspacewithsolns}, or \texttt{solutionsonly} is + taken. + \item This convenience command forces all the above colors to black. Useful when you want to use the + \texttt{showgrayletters}. This produces a black and white document, with gray letters. (If you use the + \texttt{forpaper} option, the gray letters appear black.) +\end{enumerate} + + +\subsection{Creating Multiple Versions of Exam} + +Unfortunately, I teach multiple sections of the same course, and +am faced with the problem of writing different exams for the same +course each administered to a different section. + +Typically, I only have a need for two variations on the test; however, +further extensions can be made, if needed (See \Nameref{mutiVerNew}) + +\subsubsection{The Original Version Scheme}\label{mutiVerOrig} + +The \textsf{eqexam} package defines a boolean switch, +\cs{ifVersionA} for this purpose. The two sections of the same +course are ``Version A'' and ``Version B''. The default is that +you are preparing an exam for ``Version A''. + +The command \cs{forVersion} sets the version: \verb+\forVersion A+ +sets version to ``Version A'', and \verb+\forVersion B+ set the +version to ``Version B''. (The argument of the \cs{forVersion} command is case +insensitive, so you also type in \verb+\forVersion b+.) + +For small variations in text, there is the \cs{ifAB} macro, +\settowidth{\aebdimen}{\ttfamily\string\ifAB\darg{\anglemeta{Version A text}}% +\darg{\anglemeta{Version B text}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\ifAB{!anglemeta(Version A text)}{!anglemeta(Version B text)} +\end{dCmd} +\noindent for example, one could say, +\begin{Verbatim}[xleftmargin=\amtIndent] +\begin{problem}[2] +Compute $\frac{d}{dx}\ifAB{x^2}{x^3}$. +\end{problem} +\end{Verbatim} +\noindent For longer variations, the \texttt{comments} package is +used to create comment environments that are included or excluded. +The two environments are \texttt{verA} and \texttt{verB}. +\begin{Verbatim}[xleftmargin=\amtIndent] +\begin{problem}[2] +Compute $\frac{d}{dx}\ifAB{x^2}{x^3}$. + +\begin{solution}[1in] +We use standard techniques: +\begin{verA} +$$ + \frac{d}{dx} x^2 = 2x +$$ +\end{verA} +\begin{verB} +$$ + \frac{d}{dx} x^3 = 3x^2 +$$ +\end{verB} +\end{solution} +\end{problem} +\end{Verbatim} + +There are several convenience macros for referring to the exams +generated by the two variations. + +Usually, an exam, test, homework assignment has a number associate +with it, e.g. ``Exam 1'', ``Test 2'', ``Assignment~\#12'', etc\@. +This number should be defined using the \cs{examNum} macro. +\settowidth{\aebdimen}{\ttfamily\string\examNum\darg{\meta{num}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\examNum{!meta(num)} +\end{dCmd} +where \meta{num} is the number to be associated +with the exam (test, assignment) under construction. + +This command \emph{must appear before} \cs{title} in the +preamble. The command \cs{examNum} takes its argument and defines +another macro \cs{nExam}, which has no arguments, but expands to +\meta{num}. + +The \textsf{eqexam} package defines two commands \cs{Exam} and +\cs{sExam} to automatically enter the test information for the +current version. In the preamble, you can say, +\begin{Verbatim}[xleftmargin=\amtIndent] +\title[\sExam]{\Exam} +\end{Verbatim} +\noindent \cs{Exam} is the long version of the test name, and takes as its +argument the exam number. \cs{sExam} is the short version, having no +argument. Both \cs{Exam} and \cs{sExam} use the value determined by +\cs{examNum}, described above. + +The text of \cs{Exam} and \cs{sExam} are generated by the four +commands, +\begin{enumerate} +\item \cs{VersionAtext\darg{\meta{text}}} This is the text for the long +version of the exam name for ``Version A''. The default text is +\begin{Verbatim}[xleftmargin=\amtIndent] +\VersionAtext{Exam~\nExam--Version A} +\end{Verbatim} + +\item \cs{VersionBtext\darg{\meta{text}}} This is the text for the long +version of the exam name for ``Version B''. The default text is +\begin{Verbatim}[xleftmargin=\amtIndent] +\VersionAtext{Exam~\nExam--Version B} +\end{Verbatim} + +\item \cs{shortVersionAtext\darg{\meta{text}}} This is the text for the +short version of the exam name for ``Version A''. The default text +is +\begin{Verbatim}[xleftmargin=\amtIndent] +\VersionAtext{Exam~\nExam A} +\end{Verbatim} + +\item \cs{shortVersionBtext\darg{\meta{text}}} This is the text for the +short version of the exam name for ``Version B''. The default text +is +\begin{Verbatim}[xleftmargin=\amtIndent] +\VersionAtext{Exam~\nExam B} +\end{Verbatim} +\end{enumerate} + +\redpoint All the above commands, +\textbf{\textcolor{blue}1}--\textbf{\textcolor{blue}4}, need to +appear before \cs{title} in the preamble.\medskip + +\noindent Below is a ``typical'' example of how to correctly +redefine all the version text. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\documentclass{article} +\usepackage{amsmath} +\usepackage[forpaper,pointsonleft,noparttotals,nosolutions]{eqexam} + +\examNum{1} +\forVersion{B} +\VersionAtext{Test~\nExam--003} +\VersionBtext{Test~\nExam--007} +\shortVersionAtext{T{\nExam}s3} +\shortVersionBtext{T{\nExam}s7} + +\title[\sExam]{\Exam} +\author{D. P. Story} +\subject[C2]{Calculus II} +\date{Spring \the\year} +\keywords{Test \nExam, Section \ifAB{003}{007}} +\end{Verbatim} + + +\subsubsection{New Version Control}\label{mutiVerNew} + +In this section we introduce a new set of commands that supersede +the commands defined above. Those commands were limited to only +two versions. The ones below can handle up to $26$ versions. + +The steps for creating a multiple version \textsf{eqexam} document are as follows. +\settowidth{\aebdimen}{\ttfamily\string\numVersions\darg{\meta{num}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\numVersions{!meta(num)} +\end{dCmd} +\noindent In the preamble, declare the number of versions for this document + using \cs{numVersions}, e.g., \verb|\numVersions{3}|. +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\longTitleText + {!anglemeta(Text_1)} + {!anglemeta(Text_2)} + ... + {!anglemeta(Text_n)} +\endlongTitleText +\end{Verbatim} +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\shortTitleText + {!anglemeta(Text_1)} + {!anglemeta(Text_2)} + ... + {!anglemeta(Text_n)} +\endshortTitleText +\end{Verbatim} +\textbf{Note:} If there are more titles than what are declared, the rest +of the titles are absorbed (gobbled). If there are fewer titles than declared, a +{\LaTeX} package error is generated, and ``fake'' titles are +generated. + + +\newtopic Next, state the long and short titles for the document, +one for each of the declared number of versions given earlier in \cs{numVersions}. +For example, we can use the value \cs{nExam} in our titles. Usage: +\begin{Verbatim}[xleftmargin=\amtIndent] +\longTitleText + {Test~\nExam--Version A} + {Test~\nExam--Version B} + {Test~\nExam--Make Up} +\endlongTitleText +\shortTitleText + {T\nExam A} + {T\nExam B} + {T\nExam MU} +\endshortTitleText +\end{Verbatim} +These two commands give values to \cs{Exam} and \cs{sExam}. If +\verb!\forVersion{a}! is executed, \cs{Exam} expands to the text \verb|Test~\nExam--Version A| and +\cs{sExam} expands to \verb|T\nExam A|, using the example above. The value of \cs{nExam} +is determined by the \cs{examNum} command, as described above. + +\newtopic Next is the command that does all the work. It creates alternate +text macros for each of the versions declared using \cs{numVersions}. The syntax is +\settowidth{\aebdimen}{\ttfamily\string\forVersion\darg{\meta{letter}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\forVersion{!meta(letter)} +\end{dCmd} +For example, assuming \verb|\numVersions{3}|, \verb|\forVersion{a}| (or \verb|\forVersion{A}|) defines $3$ text commands \cs{vA}, \cs{vB} and +\cs{vC}, each taking one argument, the text you want to display: +\begin{Verbatim}[xleftmargin=\amtIndent] + Name the \vA{place}\vB{date}\vC{year} of the signing + of the Magna Carta. +\end{Verbatim} +\noindent Since \verb|forVersion{a}| was declared, only the \cs{vA} text +is displayed, the others are gobbled up. But wait, time out, the \cs{forVersion} +does more than that! It also creates a series of comment environments +\verb|\begin{verA}/\end{verA}|, \verb|\begin{verB}/\end{verB}|, \verb|\begin{verC}/\end{verC}|, etc., +where only the version for which this compile applies will be typeset, +the others are commented out. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\numVersions{3} +\forVersion{b} +... +\begin{document} +... +Solve the equation for $\vA{x}\vB{y}\vC{z}$: +\[ +\begin{verA} + 2x + 4 = 7 +\end{verA} +\begin{verB} + 5y + 2 = 4 +\end{verB} +\begin{verC} + 3z - 2 = 2 +\end{verC} +\] +\end{Verbatim} + +\noindent Here is a final example of the multiple version scheme, taken from the preamble of one of +my Calculus tests. + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\documentclass{article} +\usepackage{amsmath,graphicx} +\usepackage[forpaper,pointsonleft,nototals,nosolutions]{eqexam} +%\usepackage[forpaper,pointsonleft,nototals,answerkey]{eqexam} + +\numVersions{3} +\forVersion{a} +\examNum{1} +\longTitleText + {Test \nExam--Version A} + {Test \nExam--Version B} + {Test \nExam--Make Up} +\endlongTitleText +\shortTitleText + {T\nExam A} + {T\nExam B} + {T\nExam MU} +\endshortTitleText + +\subject[C3]{Calculus III} +\title[\sExam]{\Exam} +\author{Dr.\ D. P. Story} +\university +{% + THE UNIVERSITY OF AKRON\\ + Department of Theoretical and Applied Mathematics +} +\date{\thisterm\space\the\year} % Fall 2005 +\duedate{09/26/05} % actual date of the test +% If you convert to pdf using a pdf (links, online, email) +% option, this will appear in the keywords field of the +% document info dialog. +\keywords{\Exam, administered \theduedate} +\end{Verbatim} + +\newtopic There is one additional command that can be used to locally control +which version that is typeset in the document. +\settowidth{\aebdimen}{\ttfamily\string\selectVersion\darg{\meta{num}}% +\darg{\meta{total\_versions}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\selectVersion{!meta(num)}{!meta(total_versions)} +\end{dCmd} +You can place the \cs{selectVersion} command in front of a question or a part of a question +that has multiple versions. Through this command you can select which version to typeset, +provided the option \texttt{obeylocalversions} is set. For example, +\begin{Verbatim}[xleftmargin=\amtIndent] +\selectVersion{3}{4} +\begin{problem}[10] +... +\end{problem} +\end{Verbatim} +\noindent The \cs{selectVersion} command says there are four variations on the next question +and the document author wants to use the third one (that would correspond to C, in the +\cs{forVersion} command). Again, the \texttt{obeylocalversions} must be taken for +\textsf{eqexam} to obey this command. + +\newtopic \textbf{Recommendation:} Each problem should +have the command \cs{selectVersion} in front of it, even for parts. +Suppose the document author says \verb!\numVersions{5}!, but some +problems don't have five versions, what do you do? If there is a +\cs{selectVersion} in front of a problem with multiple versions, the +\cs{selectVersion} will partially expand to determine if it is +needed. It is needed if the version specified by \cs{forVersion}, is +greater than the number of versions for the problem. In this case, +\cs{selectVersion} performs modular arithmetic to compute which +version is to be used. For example, if \verb!\forVersion{E}! has +been declared in the preamble, but a problem has only three +variations, the \textsf{eqexam} will use variation B; if +\verb!\forVersion{D}! was declared, version A is +used, and so on. + + +\subsection{The Point and Totals Boxes}\label{ptTotalsBoxes} + +There are two types of points boxes, but only one type of totals +box. All the commands listed below can be redefined for language +localizations, for example. + +\redpoint Points that appear in the left margin (the +\texttt{pointsonleft} or \texttt{pointsonboth} options). There are two text macros +that are used, +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\leftmarginPtsTxt[1]{(\small$#1^{\text{pts}}$)} +\end{Verbatim} +\noindent when the total points for that problem are shown, and the other +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\leftmarginPtsEaTxt[1] + {(\small$#1_{\text{ea.}}^{\text{pts}}$)} +\end{Verbatim} +\noindent when the author indicates that each sub-part of a problem +is weighted the same, (when the author begins a \texttt{problem*} +environment with \verb+\begin{problem*}[3ea]+, for example). + +\redpoint Points that appear in the right margin (options +\texttt{pointsonright} or \texttt{pointsonboth}). These points appear +in the bottom half of a box, the text for that box is determined by the +following definition. +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\marginpointsboxtext[2]{\small$#1\,\text{pts}$} +\end{Verbatim} +\noindent By the way, the purpose of the upper part of the box is +for the instructor to enter the number of points a student +received for that problem. + +\redpoint Points specified by the \cs{PTs} command. This text is +defined by \cs{itemPTsTxt} as follows. See the paragraphs on +\Nameref{problemstar} for a discussion of the use of \cs{PTs}. +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\itemPTsTxt[1]{($#1$ pts)} +\end{Verbatim} + +\redpoint \textbf{The totals box.} When you specify either option +\texttt{totalsonleft} or \texttt{totalsonright}, you get a page totals +box appearing in the lower left or right bottom corner. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small] +\newcommand\totalsboxtext{\small$\theeqpointsthispage\,\text{pts}$} +\end{Verbatim} +where \texttt{eqpointsthispage} is a counter whose value +at the end of each page \emph{should} be the page total. For tests +that have multiple \texttt{exam} environments, if one exam part +ends on a page, and another begins on the same page, this number +(\texttt{eqpointsthispage}) is the total on the page from the +beginning of the new exam part. In this case, at the end of the +exam part, there should also appear a remaining total for that +part on that page. + +The totals boxes are located in the lower right corner +(\texttt{totalsonright}) or in the lower left corner +(\texttt{totalsonleft}). Vertical placement of these boxes is controled +by the length \cs{eqevtranstotbox}, its default value is +\texttt{0pt}. To raise the boxes \texttt{6pt}, for example, +execute \verb!\setlength{\eqevtranstotbox}{6pt}!; the box may be lowered +by using a negative length. + +\redpoint \textbf{Summary Totals.} When you use the \texttt{instructions} +environment to give initial instructions for an exam, the total +points appears automatically in the text, unless you specify the +\texttt{nosummarytotals} option. This text is defined by +\cs{summaryTotalsTxt}, whose definition follows: +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\newcommand\summaryTotalsTxt{($\summaryPointTotal\,\text{points}$)} +\end{Verbatim} +\noindent where \cs{summaryPointTotal} is a macro that expands to +the total for this \texttt{exam} environment. + +\subsection{The \texttt{eqComments} Environment} + +In addition to the \texttt{instructions} environment, as explained +in the section~\ref*{exam}, entitled \Nameref{exam}, should you want to insert +additional instructions from within the body or the exam, use the +\cs{eqComments} environment. The \cs{eqComments} environment has +one optional argument, a formatted heading for the comments you +want to make. For example, +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{eqComments}[Proofs.] +Solve each of the problems~5--8 on a separate sheet of paper, +do not write on the back of the paper. Follow the instructions +provided for each problem. Use your little gray cells. +\end{eqComments} +\end{Verbatim} +\noindent Such instructions must go between problems, of course, +not within the body of either a \texttt{problem} or a +\texttt{problem*} environment. + +\redpoint The optional argument has a color associated with it, and +is visible when you compile the document with the +\texttt{forcolorpaper} option. \cs{eqCommentsColor} colors the text that may appear +in the optional argument of the environment; \cs{eqCommentsColorBody} colors the body +of the text. Each take a single named color argument. +\begin{Verbatim}[xleftmargin=\amtIndent] +\eqCommentsColor{blue} +\eqCommentsColorBody{black} +\end{Verbatim} +The above are the default definition. + +\subsection{The \texorpdfstring{\protect\cs{OnBackOfPage}}{\textbackslash OnBackOfPage} Command}\label{onbackofpage} + +In order to reduce the number of pages needed for an exam, I often +cheat by asking the student to work on the back of one of the test +pages. +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\bopText{on the back of page~\boPage} +\newcommand\bopCoverPageText{(the cover page)} +\newcommand\OnBackOfPage[1][\bopText]{% +\end{Verbatim} + +For this, I use the \cs{OnBackOfPage} command +\settowidth{\aebdimen}{\ttfamily\string\OnBackOfPage[\meta{text}]} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\OnBackOfPage[!meta(text)] +\end{dCmd} +\noindent The optional argument allows you to enter variational +text, text that varies from the default text. The default text is +contained in \cs{bopText} macro, its definition is +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\bopText{on the back of page~\boPage} +\end{Verbatim} +\noindent where \cs{boPage} is the page the student is instructed +to do the work. Thus, if you say, ``Continue \cs{OnBackOfPage}.'' +This would expand to ``Continue on the back of page 2.'', or +whatever \cs{boPage} is determined to be. + +\newtopic To illustrate the use of the optional argument of +\cs{OnBackOfPage}, you might say, +\begin{quote} + \verb+\OnBackOfPage[The back of page~\boPage]+ can be used\\ + to continue work, if necessary. +\end{quote} +This expands to +``The back of page 2 can be used to continue work, if necessary.'' + +The algorithm used to compute the page, \cs{boPage}, on which to +continue to work is as follows: For all pages, except for the +first page of the test, the student works on the back of the +previous page. For the first page of the test, the student works +on the back of the first page, unless there is a cover page, in +which case the student is instructed to work on the back of that +page. + +In the case of working on the back of the cover page, there is a variation on the +instructions, \cs{OnBackOfPage} expands to ``on the back of page 1 (the cover page)''. +The phrase ``(the cover page)'' can be redefined using the \cs{bopCoverPageText} command. +The definition of this command is +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\bopCoverPageText{\space(the cover page)} +\end{Verbatim} +\noindent We could change this as follows, +\begin{Verbatim}[xleftmargin=\amtIndent] +\renewcommand\bopCoverPageText{, the cover page} +\end{Verbatim} +\noindent so that it would now read, ``on the back of page 1, the cover page''. To remove this feature +altogether, you could redefine as +\begin{Verbatim}[xleftmargin=\amtIndent] +\renewcommand\bopCoverPageText{} +\end{Verbatim} + +\subsection{\texorpdfstring + {The \cs{pushProblem} and \cs{popProblem} Commands} + {The \CMD{pushProblem} and \CMD{popProblem} Commands} +} + + +There may be an occasion when a multi-part question needs to be broken between parts, +use the \cs{pushProblem} and \cs{popProblem} for this purpose. The push saves the +counter value, and ends the \texttt{parts} environment. The pop restarts the +\texttt{parts}, and resets the parts counter. + +\newtopic +In the \texttt{multicols} environment below, we \cs{pushProblem}, then close \texttt{multicols}, we execute \cs{popProblem}, and then continue with the multi-parts in single column. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem*}[\auto] +Do each of the following without error. +\begin{multicols}{2} + \begin{parts} + \item\PTs{3} This is a problem. + \begin{solution}[1in]\end{solution} + + \item\PTs{3} This is a problem. + \begin{solution}[1in]\end{solution} +\pushProblem +\end{multicols} +\popProblem + \item\PTs{4} Do this harder problem. + \begin{solution}[.5in]\end{solution} + \end{parts} +\end{problem*} +\end{Verbatim} +\newtopic In the example, the first two questions appear in two +column format, while the third appears in single column format. The +same thing can be done in reverse, like so: +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem*}[\auto] +Do each of the following without error. + \begin{parts} + \item\PTs{3} This is a problem. + \begin{solution}[1in]\end{solution} +\pushProblem +\begin{multicols}{2} +\popProblem + \item\PTs{4} This is a hard problem. + \begin{solution}[1in]\end{solution} + \item\PTs{4} Do this harder problem. + \begin{solution}[1in]\end{solution} + \end{parts} +\end{multicols} +\end{problem*} +\end{Verbatim} +\newtopic Now, first question is in single column and the next two are in two column format. + +\handpoint In order to get the correct formatting, the \texttt{multicols} environment must begin +before the \texttt{parts} environment. + +%\newtopic See \texttt{quiz02.tex} for an example of \cs{pushProblem} and \cs{popProblem}. + +\exAeBBlogPDF{p=1211} See \texttt{\href{\urlAcroTeXBlog/?p=1211}{quiz02.pdf}} +for an example of \cs{pushProblem} and \cs{popProblem}. + + +\subsection{\texorpdfstring{\protect\cs{qNewPage}, \protect\cs{aNewPage}, + and \protect\cs{promoteNewPage}} + {\CMD{qNewPage}, \CMD{aNewPage}, and \CMD{promoteNewPage}}}\label{aqpNewPage} + +The command \cs{qNewPage} (questions newpage) and \cs{aNewPage} +(answers newpage) are convenience commands for creating new pages. +The first one expands to \cs{newpage} when the \cs{ifanswerkey} is +false and the second one expands to \cs{newpage} when the +\cs{ifanswerkey} is true; their definitions are +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand\qNewPage{\ifanswerkey\else\newpage\fi} +\newcommand\aNewPage{\ifanswerkey\newpage\fi} +\end{Verbatim} + +The \cs{promoteNewPage} can be used to insert a page break, if needed. +\settowidth{\aebdimen}{\ttfamily\string\promoteNewPage\darg{\meta{vspace}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\promoteNewPage[!meta(vspace)] +\end{dCmd} +If there is more than \meta{vspace} left on the current page, a +\cs{newpage} command is executed (a \cs{columnbreak} if in a +\texttt{multicols} environment). The default value for \meta{vspace} +is \cs{@fvsizeskip}\cs{textheight}, where \cs{@fvsizeskip} is a decimal +number between 0 and 1 that is set by \cs{fvsizeskip}. The default is +\verb!\fvsizeskip{.3}!. This means that if there is less than +\verb!.3\textheight!, and new page is created. This may be too large for +most applications, so you can pass a \meta{vspace} through the optional argument. +For example, \cs{promoteNewPage[.25in]}. + + + +\subsection{Support for Solution Sets from a Text}\label{solnSets} + +I use \textsf{eqexam} not only for exams, quizzes and homework +assignments, but also for solution sets for problems assigned from the text. + +Suppose the assignment was to solve, on a certain page in the text, +problems which include \textbf{2}, \textbf{6} and \textbf{12(b)(d)} and +it is desired to provide solutions to these problem. For this +purpose, \textsf{eqexam} provides \cs{forproblem} and \cs{foritem}. These +commands are used as follows: +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{exam}{HW\nExam} +\begin{instructions}[Description] (10 points) +Selected solutions from Assignments~24, 25, \S7.1. +\end{instructions} + +\begin{eqComments}[\S7.1] +\textbf{Solving Linear Equations} +\end{eqComments} + +\forproblem{2} +\begin{problem} +Statement of problem. +\begin{solution} +Solution to this problem. +\end{solution} +\end{problem} + +\forproblem{6} +\begin{problem} +Statement of problem. +\begin{solution} +Solution to this problem. +\end{solution} +\end{problem} + +\forproblem{12} +\begin{problem*} +Statement of problem. +\begin{parts} + \foritem{b} Statement for item (b) + \begin{solution} + Solution to this problem. + \end{solution} + + \foritem{d} Statement for item (d) + \begin{solution} + Solution to this problem. + \end{solution} +\end{parts} +\end{problem*} +\end{exam} +\end{Verbatim} + +\subsection{Referencing Multiple Choice Questions}\label{showgraylettersOpt} + +When the \texttt{showgrayletters} option is used, each alternatives in a +multiple choice question will have a gray capital letter \texttt{A}, +\texttt{B}, \texttt{C}, etc. underneath it. This letter can then be +referred to in the text or the solution. + +The use of this option is global and is controlled by the switch, +\cs{ifaeb\-show\-gray\-letters}. The gray letter feature can be turned on +and off locally: To turn on this feature, insert the command +\cs{graylettersOn} at some appropriately chosen point in +the document; to turn off the gray letter feature insert +\cs{graylettersOff}. + +\newtopic In support of the \texttt{showgrayletters} option is a new +command \cs{REF}. \cs{REF} acts like the {\LaTeX} command \cs{ref} +with the hyperref modifications, but it converts the reference to +uppercase. When \cs{ref} would typeset the letter `a', for example, +\cs{REF} would typeset the letter `A'. \cs{REF}, like \cs{ref}, +typesets a hyperref link. Hyperref defines a \texttt{*} version of +\cs{ref}; \cs{ref*} typesets the reference, but does not create a +link; \cs{REF*} does the same. When \cs{aebshowgraylettersfalse} is +in effect, \cs{REF} does not capitalize the reference. + +\redpoint Below is an example of this. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{problem}[5] +Answer this if you can! +\begin{answers}{2} +\bChoices + \Ans0\label{testsqFirst} This is a possible answer.\eAns + \Ans1\label{testsqSecond} Try this one (the correct one).\eAns + \Ans0 This is an answer.\eAns + \Ans0 Another alternative.\eAns +\eChoices +\end{answers} +\begin{solution} +We reference alternatives (\REF*{testsqFirst}), an incorrect answer, +and (\REF{testsqSecond}), the correct answer. +\end{solution} +\end{problem} +\end{Verbatim} +\newtopic Notice that the gray letters was not turned to off +until after the usage of \cs{REF}. + +\newtopic\textcolor{red}{\bfseries Important} The gray letters are typeset into the document. Do not +use a background color for the checkboxes as this color will cover +up the gray letters. The default background color checkboxes is +transparent, keep it that way. + +\newtopic When typesetting an exam for paper (using the \texttt{forpaper} +option), the gray letters appear as black letters. If you want actual gray +letters, you have to use the \texttt{forcolorpaper} option. In this case, +you'll see the blue color appearing in various places. Change these blue +colors to black using the following commands in the preamble: +\settowidth{\aebdimen}{\ttfamily\string\forceNoColor} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\forceNoColor +\end{dCmd} + + +\subsection{Displaying Points between two Markers} + +Some instructors might like a subdivide the exam into segments (or parts) and to have a total for +that segment of problems. The \textsf{eqexam} package offers three commands for that purpose. +\settowidth{\aebdimen}{\ttfamily\string\calcFromMarkers[\meta{formatting}]\darg{\meta{name2}}\darg{\meta{name3}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\placeMarkerHere{!meta(name)} +\calcFromMarkers[!meta(formatting)]{!meta(name2)}{!meta(name3)} +\markerTotalFmt{!meta(formatting)} +\end{dCmd} +Place \cs{placeMarkerHere} outside of a \texttt{problem}/\texttt{problem*} environment, giving each +a unique name; for example \verb!\placeMarkerHere{bQForm}!. Place +\cs{calcFromMarkers} wherever you wish a calculation to be displayed, for example, + +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\placeMarkerHere{bQForm} +\begin{eqComments}[Quadratic Formula\calcFromMarkers{eQForm}{bForm}.] +Solve each of the following equations using the quadratic formula. +\end{eqComments} +.. +\begin{problem}[5] +... +\end{problem} +... +% Finished with problems that use the quadratic formula, +% now create another marker for the next set of questions. +\placeMarkerHere{eQForm} +... +\end{Verbatim} +After you {\LaTeX} three times (and the totals are all brought up to date), +the header of the \textbf{eqComments} should read \textbf{Quadratic +Formula (12 points)}, where the \textbf{12 points} are the total of all +points assigned between the \texttt{bQForm} marker and the \texttt{eQForm} +marker. + +The formatting for the total points between markers is determined by the optional first parameter +of \cs{calcFromMarkers}, and if there is no optional first parameter, by a global command, +\cs{markerTotalFmt}, which sets the default formatting. The default definition of +\cs{markerTotalFmt} is +\begin{Verbatim}[xleftmargin=\amtIndent] +\markerTotalFmt{ (\themarkerCnt\space points)} +\end{Verbatim} +The command \cs{themarkerCnt} references the counter \texttt{markerCnt} in which the calculations are made. +Any redefinition of \cs{markerTotalFmt} should use \cs{themarkerCnt} to reference to value. + +You use the optional first parameter the same way as the definition of \cs{marker\-Total\-Fmt}. You can say, for +example, you can type +\begin{Verbatim}[xleftmargin=\amtIndent] +\calcFromMarkers[ $\themarkerCnt^{\text{pts}}$]{eQForm}{bForm} +\end{Verbatim} +to get a formatted total \verb*! $12^{\text{pts}}$!, which typesets to ` $12^{\text{pts}}$'. + +You might have noticed that I've inserted a space character at the beginning of the definition +\verb*!\markerTotalFmt{ (\themarkerCnt\space points)}!, and place \cs{calc\-From\-Markers} up against +the previous word, as in +\begin{Verbatim}[xleftmargin=\amtIndent] +Quadratic Formula\calcFromMarkers{eQForm}{bForm}. +\end{Verbatim} +This is so that when the required totals are not defined---early in the {\LaTeX}ing process---there +is no space between \texttt{Formula} and the period (.); this is nothing but a cosmetic trivial point. After +you {\LaTeX} enough times, the full expansion appears as, +\begin{Verbatim}[xleftmargin=\amtIndent] +Quadratic Formula (12 points). +\end{Verbatim} + + +\subsection{Extending the \texorpdfstring{\protect\cs{fillin}}{\CMD{fillin}} Command}\label{extendfillin} + +When the document author uses the \texttt{usexkv} option, and the +\textsf{xkeyval} package is found on the document author's system, +the \cs{fillin} command is redefined to use key-value pairs in the +optional first argument. The syntax for \cs{fillin} now is, +%\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\fontsize{9}{11}\selectfont] +\begin{dCmd}[commandchars=!(),fontsize=\small]{\linewidth} +\fillin[ + underline=true|false,u,b,boxed=true|false,boxpretext=!anglemeta(text), + align=l|r|c,boxsize=!anglemeta(!upshape(\tiny|...|normalsize|large|...|Huge)), + color=!anglemeta(namedcolor),format=!anglemeta(!upshape\bfseries|\ttfamily|\Large|!meta(whatever)), + enclosesoln=!anglemeta(!upshape(true|false)),fitwidth=!anglemeta(!upshape(true|false)) +]{!meta(width)}{!meta(answer)} +\end{dCmd} +\textbf{Parameter Description.} \cs{fillin} takes three parameters. +\begin{enumerate} +\item The first optional parameter uses a key-value system, these allow the document author +to set the appearance and behavior of the field. The keys are described below. + +\item The second parameter \meta{width} is the amount of horizontal +space to leave for the student to write in the response. For example, +\begin{Verbatim}[xleftmargin=\amtIndent] +\fillin[boxed,boxsize=Large]{1.5in}{$2x - 3$} +\end{Verbatim} +Yields the following results, depending on the option. +\begin{alignat*}{2} +&\makebox[1.5in][c]{\text{\texttt{nosolutions} option}}&&\qquad +\makebox[1.5in][c]{\text{\texttt{answerkey} option}}\\ +&\boxed{\text{\Large\strut}\makebox[1.5in]{\hfill}}&&\qquad +\boxed{\text{\Large\strut}\makebox[1.5in]{$2x-3$}} +\end{alignat*} +If this parameter is left empty, +the \textsf{eqexam} uses the \meta{answer} parameter to determine the width of the field. +The code +\begin{Verbatim}[xleftmargin=\amtIndent] +\fillin[boxed,boxsize=Large]{}{$2x - 3$} +\end{Verbatim} +gives a box the same width as the answer, $2x-3$, which is not very wide +in this case. On the test, (compiled with the \texttt{nosolutions} option) +the student would see this box +$\boxed{\text{\Large\strut}\text{\phantom{$2x-3$}}}$. Though we can typeset the +answer into this box, it is too narrow for the student to write the answer +into; a better strategy is as follows: +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small] +\fillin[boxed,boxsize=Large]{\ifNoSolutions{1.5in}{}}{$2x - 3$} +\end{Verbatim} +Now, when the file is compiled under different options, we obtain +\begin{alignat*}{2} +&\makebox[1.5in][c]{\text{\texttt{nosolutions} option}}&&\qquad +\makebox[1.5in][c]{\text{\texttt{answerkey} option}}\\ +&\boxed{\text{\Large\strut}\makebox[1.5in]{\hfill}}&&\qquad +\makebox[1.5in][c]{$\boxed{\text{\Large\strut}2x-3}$} +\end{alignat*} +For the answer key version, the answer is enclosed is tightly enclosed, a +cosmetic difference. See also the \texttt{fitwidth} option. + +\item[] The command \verb!\ifNoSolutions{#1}{#2}! executes the first parameter if +the compile option is \texttt{nosolutions}, otherwise it executes the second parameter. + +\item The third argument, \meta{answer}, is the correct answer; this correct answer +appears when the document is compiled with the \texttt{answerkey} option. +\end{enumerate} + +\newtopic\textbf{The description of the key-value pairs for \cs{fillin}:} +\begin{description} + \item[\texttt{underline}:] A Boolean switch, which if \texttt{true}, the + fill-in region is underlined. The default is \texttt{false}, the region + is not underlined. + \item[\texttt{u,b}:] Legacy options. If \texttt{u} is chosen, the region is + underlined, if \texttt{b} is chosen, the region is not underlined. Use + of the \texttt{underline} key is recommended. + \item[\texttt{boxed}:] A Boolean switch, which if \texttt{true}, the + fill-in region is boxed in using the \cs{boxed} command of + \textsf{amsmath} package. The default is \texttt{false}, the region is + not boxed. + \item[\texttt{boxpretext}:] A key that takes \meta{text} as its value. This + value will be placed in front of the third argument, labeled + \meta{answer} above. The \meta{text} appears in the box even when + the \texttt{answerkey} is not in effect. This key is ignored if the + \texttt{boxed} option is not taken. + + This option allows you to create an expression like +\begin{equation*} + \boxed{ y =\hspace{1in}\text{\Large\strut}}\quad\text{and with \texttt{answerkey}}\quad + \boxed{ y = \rlap{$2x^2 + 1$}\hspace{1in}\text{\Large\strut}} +\end{equation*} + \item[\texttt{boxsize}:] This is a choice key, the choices being \texttt{tiny}, \texttt{scriptsize}, \texttt{footnotesize}, \texttt{small}, \texttt{normalsize}, + \texttt{large}, \texttt{Large}, \texttt{LARGE}, \texttt{huge} and \texttt{Huge}. the smaller sizes probably are not useful, + I give them to you for free. This key allows you to adjust the height of the box. This key is ignored if the + \texttt{boxed} key does not appear in the option list. For example, +\begin{flushleft} +\hskip\leftmargini\begin{tabular}{@{}cc} + \makebox[1.2in][c]{\texttt{boxsize=Large}}&\makebox[1.2in][c]{\texttt{boxsize=Huge}}\\ + \multicolumn{1}{@{}p{1.2in}}{\kern0pt\centering\fbox{\hspace{1in}\Large\strut}}& + \multicolumn{1}{p{1.2in}}{\kern0pt\centering\fbox{\hspace{1in}\Huge\strut}} +\end{tabular} +\end{flushleft} + Choice of size depends on the height of the anticipated response of + the student. The default is \texttt{normalsize}. + + \item[\texttt{enclosesoln}:] This Boolean key only takes effect when the + \texttt{boxed} key is used, and when either the \texttt{nosolutions} or the + \texttt{vspacewithsolns} option is taken. When these conditions are + met, a box is created around the solution (the third parameter of \cs{fillin}); the solution + is enclosed in a \cs{phantom} so it is not seen, but the dimensions of the solution are used. + This key allows you to create a box or arbitrary dimension. + +A simple example would be +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small] +\fillin[boxed,enclosesoln,parbox={[t][1in]}]{2.4in}{% + The box is 2.4 inch wide and 1 inch high. The solution to + this problem appears when \texttt{answerkey} is in effect. +} +\end{Verbatim} +Below shows how this command appears under different options. +\begin{equation*}\def\fb#1{#1-2\fboxrule-2\fboxsep} +\boxed{\phantom{\parbox[b][\fb{1in}][t]{\fb{2.4in}}{% + The box is 2.4 inch wide and 1 inch high. The solution to + this problem appears when the answerkey is in effect} +}}\quad\boxed{\parbox[b][\fb{1in}][t]{\fb{2.4in}}{% + The box is 2.4 inch wide and 1 inch high. The solution to + this problem appears when \texttt{answerkey} is in effect. +}} +\end{equation*} +The box on the left is appears when the \texttt{nosolutions} or +\texttt{vspacewithsolns} is in effect. The one on the right appears when +the \texttt{answerkey} option is taken. Note the size of the two boxes are +the same. + +\textbf{Note:} The explanation of the \texttt{parbox} option used in this +example appears below. + +\item[\texttt{fitwidth}] This key is an implementation of the + \cs{ifNoSolutions} strategy discussed earlier. If \texttt{fitwidth} is + specified and the \texttt{nosolutions} option (an \textsf{eqexam} + option) is in effect, the width of the fill-in region is taken from + the second parameter; however, if the \texttt{answerkey} option is + specified, the natural with of the answer (the third parameter) is + used. + + \item[\texttt{align}:] A key that takes one of three values, \texttt{l}, + \texttt{\texttt{r}}, and \texttt{c}. This key aligns the text within + the fill-in field (when the \texttt{answerkey} option is taken): + \texttt{l} (left-aligned), \texttt{c} (center, the default), \texttt{r} + (right-aligned). This parameter affects the position of the + \meta{answer}, and does not affect the position of the + \meta{text}, which is aligned left, of the \texttt{boxpretext} key. + The alignment becomes visible when the \texttt{answerkey} option is in + effect. + + \item[\texttt{hiddenbox}:] When the \texttt{boxed} option is used, + \textsf{eqexam} uses an \cs{fbox} to enclose the content. + The \texttt{hiddenbox} is used with the \texttt{boxed} option and it + resets the lengths of \cs{fboxrule} and \cs{fboxsep} to + \texttt{0pt}. In this way, some of the features + (\texttt{enclosesoln} and \texttt{boxpretext}, for example) that + apply to boxed content can be used without the surrounding boundary + rule. See \texttt{parbox} for an example. + + \item[\texttt{parbox}:] When this option is taken, \textsf{eqexam} + encloses the third argument (the answer) in a \cs{parbox}. The value + of the \texttt{parbox} option is the first three parameters of a + \cs{parbox}; for example \verb!parbox={[t][.5in][c]}! causes \cs{fillin} + to enclose the content in a \cs{parbox} with a height of \texttt{.5in}. The width + of the \cs{parbox} is taken to be the second parameter of + \cs{fillin} macro. The third parameter of \cs{fillin} becomes + \cs{parbox[t][.5in][c]\darg{\meta{width}}\darg{\meta{answer}}}. + The value of the \texttt{parbox} key needs to be + enclosed in braces, as just illustrated. + +Here is an example of the use of this key-value pair: +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small] +\fillin[parbox={[t][.5in]},boxed,hiddenbox, + boxpretext={\textbf{\textcolor{black}{Conclusion: }}}, + format=\normalfont,enclosesoln]{\linewidth}{% + There is sufficient evidence at the $\alpha=0.05$ level to + conclude that the mean microwave repair cost is less than + \$100.} +\end{Verbatim} +If you say \cs{fillin[parbox,boxed,\meta{options}]\darg{\meta{width}}\darg{\meta{answer}}} (\texttt{parbox} with the +empty argument), translates into \cs{parbox\darg{\meta{text}}}, the height of the box is the +natural height of the content. + +Note the presence of the \texttt{hiddenbox} key, in this case, no rule +or additional spacing appears around the box. + + This typesets, when \texttt{answerkey} option is used as + + \parbox[t][.5in]{\linewidth}{\textbf{\textcolor{black}{Conclusion: }} + There is sufficient evidence at the $\alpha=0.05$ level to + conclude that the mean microwave repair cost is less than + \$100.} + + When \texttt{answerkey} is not used, the following is seen (by the student at test time): + + \parbox[t][.5in]{\linewidth}{\textbf{\textcolor{black}{Conclusion: }}} + + The same vertical space is used in both cases because of the \texttt{enclosesoln} + option taken in this example. + + If the \texttt{hiddenbox} key is removed, a proper boxed region appears, + + $\def\FB#1{#1-2\fboxrule-2\fboxsep} + \boxed{\parbox[t][\FB{.5in}]{\FB{\linewidth}}{\textbf{\textcolor{black}{Conclusion: }} + There is sufficient evidence at the $\alpha=0.05$ level to + conclude that the mean microwave repair cost is less than + \$100.}}$ + + Similarly, when \texttt{answerkey} is not used, the following is seen, + + $\def\FB#1{#1-2\fboxrule-2\fboxsep} + \boxed{\parbox[t][\FB{.5in}]{\FB{\linewidth}}{% + \textbf{\textcolor{black}{Conclusion: }}\hfill\vfill}}$ + + + \item[\texttt{color}:] The value of this key is a named color. The + \meta{answer} appears in this color, when \texttt{answerkey} option is + in effect. The default is red. + + \item[\texttt{format}:] A general purpose formatting key. The value of the key can be most anything: + \cs{bfseries} (to change font series), \cs{ttfamily} (to change font family), \cs{Large} (to change size of + the \meta{answer} and \meta{text} (the value of \texttt{boxpretext}). Several formatting commands can appear + as the value; thus, \verb!format={\bfseries\Large}! makes the answer, when \texttt{answerkey} is in effect, appear in large bold font. + The default is \verb!format={\fillInFormatDefault}!, where the definition of the command \cs{fillInFormatDefault} is +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand{\fillInFormatDefault}{\bfseries} +\end{Verbatim} +\end{description} +The next three keys apply when a \texttt{boxed} option is not taken, that is, they +apply to the case of \texttt{u} (\texttt{underlined}) or \texttt{b} (blank). The keys were designed +for the \texttt{underline} option, however. +\begin{description} +\item[\texttt{lift}:] The syntax is \texttt{lift=length} This key lowers the underline without changing the baseline reference +point of the content. For example, \texttt{lift=10pt} lowers the underlining by \texttt{10pt}. +\begin{equation*} +\frac{1}{2}+\frac{1}{3} = \underbar{\makebox[1in]{\ensuremath{\displaystyle\frac{3}{4}}}} +\qquad +\frac{1}{2}+\frac{1}{3} = \raisebox{-10pt}{\underbar{\raisebox{10pt}{\makebox[1in]{\ensuremath{\displaystyle\frac{3}{4}}}}}} +\end{equation*} +The expression on the right corresponds to +\begin{Verbatim}[xleftmargin=\amtIndent] +$...\fillin[lift=10pt]{1in}{\frac{3}{4}}...$ +\end{Verbatim} +The underline is lowered to include the baseline of the denominator of the fraction. + +\item[\texttt{autolift}:] The \texttt{autolift} key takes the guesswork + out of the \texttt{lift}. When \texttt{autolift} is used, the depth of + the content of the answer field. For example, with the \texttt{autolift} key, + \verb!\fillin[autolift]{1in}{\frac{3}{4}}! yields + {\setbox0=\hbox{$\displaystyle\frac{3}{4}$} + \raisebox{-\dp0}{\underbar{\raisebox{\dp0}{\makebox[1in]{\ensuremath{\displaystyle\frac{3}{4}}}}}}}. + Now the fraction is exactly underlined. + +\item[\texttt{addtoautolift}:] The \texttt{addtoautolift} key is a companion to \texttt{autolift}. + If we assign \texttt{addtoautolift=3pt}, \texttt{3pt} additional lift is added + to the amount of lift determined by \texttt{autolift}. For example, +\begin{small}% +\begin{equation*} +\setbox0=\hbox{$\displaystyle\frac{3}{4}$} +\dimen0=\dp0 \advance\dimen0by3pt + \verb!\fillin[autolift,addtoautolift=3pt]{.5in}{\frac{3}{4}}!\ \text{yields}\ + \raisebox{-\dimen0}{\underbar{\raisebox{\dimen0}{\makebox[.5in]{\ensuremath{\displaystyle\frac{3}{4}}}}}} +\end{equation*} +\end{small}% +the number three-fourths is underlined plus \texttt{3pt} more. +\end{description} +The keys are processed by an \cs{edef}, this allows you to define a +command with your favorite options; for example, you can define +\begin{Verbatim}[xleftmargin=\amtIndent] +\newcommand{\myBoxOpts}{boxed,boxsize=Large,align=l} +\end{Verbatim} +then in the exam, type +\begin{Verbatim}[xleftmargin=\amtIndent] +$\frac{\sqrt{-18}}{\sqrt{6}}=\fillin[\myBoxOpts]{1.5in}{3\imath}$ +\end{Verbatim} + +% dps Need to revise this section, I've changed how \fillin works. + +\paragraph*{\cs{fillin} boxed.} When the \texttt{boxed} key is used, +the \cs{boxed} command of \texttt{amsmath} is used; This command needs to +be in math mode. If the \texttt{boxed} key is used and the \cs{fillin} +command is in math mode, then \cs{fillin} puts the \meta{answer} and +\texttt{boxpretext} in math mode too; if \cs{fillin} command \emph{not in +math mode} (i.e., it is in text mode), \cs{fillin} typesets the +\meta{answer} and \texttt{boxpretext} in text mode. For example, +\begin{Verbatim}[xleftmargin=\amtIndent] +Let $ x = 4 $ and $ y = -3 $ and let $ z = 2x - 4y $ then + $\fillin[boxed,align=l,boxpretext={z=}]{1in}{20}$ +\end{Verbatim} +When \texttt{answerkey} is used, the above question appears as +\begin{quote} +Let $ x = 4 $ and $ y = -3 $ and let $ z = 2x - 4y $ then + \fbox{\makebox[1in][l]{$ z=20 $ }} +\end{quote} +Here is an example in text mode +\begin{Verbatim}[xleftmargin=\amtIndent] +The first president of the US is + \fillin[boxed,align=c]{1.5in}{Washington} +\end{Verbatim} +When \texttt{answerkey} is used, the above question appears as +\begin{quote} +The first president of the US is + \fbox{\makebox[1.5in][c]{Washington}} +\end{quote} +Here is an example of mixed mode +\begin{Verbatim}[xleftmargin=\amtIndent] +The width of a rectangle is 20 feet and length is 15 feet. +Find the area: $\fillin[boxed,align=l, + boxpretext={\text{Area: }}]{1in}{300\,\text{feet}}$ +\end{Verbatim} +The answer is typeset in math mode, but the value of \texttt{boxpretext} +needs to be typeset in text mode. When \texttt{answerkey} is used, the +above question appears as +\begin{quote} +The width of a rectangle is 20 feet and length is 15 feet. +Find the area: \fbox{\makebox[1in][l]{Area: $300\,\text{feet}$}} +\end{quote} + +\paragraph*{\cs{fillin} not boxed.} The \cs{fillin} command will typeset +the answer in math mode if \cs{fillin} is in math mode, and in text mode, +otherwise. For example, each of the following typesets the same. +\begin{Verbatim}[xleftmargin=\amtIndent] +The area of a circle of radius $2$ is \fillin[u]{.5in}{$4\pi$} +The area of a circle of radius $2$ is $\fillin[u]{.5in}{4\pi}$ +\end{Verbatim} + +\subsubsection{\texorpdfstring{\protect\cs{fillineol}}{\CMD{fillineol}}: Fill-in to end-of-line} + +The \cs{fillineol} is a variant of \cs{fillin}, its main feature is that the +width parameter of the \cs{fillin} command is automatically calculated to the +end of the line. +\settowidth{\aebdimen}{\small\ttfamily\string + \fillineol*\darg{\ameta{phrase}}[\ameta{fillin-opts}]\darg{\ameta{answer}}}% +\begin{dCmd}[commandchars=!(),fontsize=\small]{\aebdimen+2\fboxsep+2\fboxrule} +\fillineol*{!ameta(phrase)}[!ameta(fillin-opts)]{!ameta(answer)} +\end{dCmd} +\fillineol{Calculus originator, Isaac }[boxed,align=l,boxsize=Large]{Newton} +\begin{Verbatim}[fontsize=\small] +\fillineol{Calculus originator, Isaac }[boxed,align=l,boxsize=Large]{Newton} +\end{Verbatim} +The star-option allows \ameta{phrase} to contain verbatim text; in this case, +the \textsf{collectbox} package is required. + +The \cs{fillineol} command takes the \ameta{phrase}, measures its width, and +uses the result as the value of \ameta{width} in the \cs{fillin} command. +Usually, the \ameta{phrase} occurs at the beginning of the sentence. However, +that is not always convenient. + +For this next example, the fill-in occurs at the end of the sentence, which +wraps around to the next line. Enter the name of your professor for the +course you are cur\-\fillineol{rently taking, his name is }{Dr.\ D. P. Story} + +\exAeBBlogPDF{p=1356} The demo file for this feature is named +\texttt{\href{\urlAcroTeXBlog/?p=1356}{fillineol.pdf}}, found on the {\AcroTeX} Blog website. + + +\subsection{Vertical Space Fill Types}\label{ss:VSFT} + +When the \texttt{nosolutions} or the \texttt{vspacewithsolns} is used, a +vertical space is generated by the \texttt{solution} environment. Previously, +this has just been a vertical white space, now, we provide the ability to +fill the space with horizontal rules of different types.\footnote{The filler +line feature has been rewritten and extended from previous versions of +\pkg{eqexam}.} + +%\redpoint The demo file for these features is \texttt{hw03.tex}. + +\exAeBBlogPDF{p=1222} The demo file for this feature is named +\texttt{\href{\urlAcroTeXBlog/?p=1222}{hw03.pdf}} + + +\newtopic There are two sets of commands. +\settowidth{\aebdimen}{\ttfamily\string\useFillerDefault} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\useFillerLines +\useFillerDefault +\end{dCmd} +\noindent The first command sets the code to draw rule lines in the +vertical white space, the second command reverts back to the default, +plain vertical white space. + +\begin{comment} +\newtopic The next set of commands determine the type of line to be drawn +in the white space. +\settowidth{\aebdimen}{\ttfamily\string\fillTypeDashLine} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\fillTypeHRule +\fillTypeDashLine +\fillTypeDots +\fillTypeDefault +\end{dCmd} +\noindent The rule types are in the order listed: draw solid horizontal lines; draw +dashed lines; draw dotted lines; draw the default line type (\cs{fillTypeHRule)}. + +\newtopic These two command determine color of the lines, and the spacing between lines. +\settowidth{\aebdimen}{\ttfamily\string\eqWriteLineColor\darg{\meta{named\_color}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\eqWriteLineColor{!meta(named_color)} +\eqWLSpacing{!meta(length)} +\end{dCmd} +\noindent The default color is \texttt{gray} and the default vertical +spacing between lines is +\texttt{14pt}. +\end{comment} + +The \cs{setFillLinesFmt} command is used to set the design parameters +of filler lines. +\settowidth{\aebdimen}{\ttfamily\string\setFillLinesFmt\darg{\meta{KV-pairs}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\setFillLinesFmt{!meta(KV-pairs)} +\end{dCmd} +There is an extensive list of key-value pairs. + +\begin{comment} +%The default values are shown in parentheses above. +%The \cs{eqWLSpacing} command sets the length register \Com[, length\ipkg{eqexam}|textbf]{wlVspace} +%to its argument \meta{vskip}; \cs{wlVspace} is the vertical space between lines. +% +%The \cs{eqWriteLineColor} command passes a color to the fill lines. +% +%Properties of fill lines are set through key-value pairs of the command +%\cs{fillLinesNumFmt}; the properties are not local, but continue to be +%applied until they are explicitly changed. The properties are, +%\bVerb\columnseprule0pt\columnsep0pt +\end{comment} + +\newtopic\noindent +\textbf{Key-value pairs of \cs{setFillLinesFmt}.} These key-values +document-wide scope \emph{if not declared within a group}. + +\begin{description} +\item[\texttt{fltype=\ameta{\upshape{line|dash|dots|blank|grid}}}] When the + value of \texttt{fltype} is different from \texttt{grid}, the key + determines the type of horizontal line drawn (including a + ``blank'' line); when \texttt{fltype=grid}, the type of line drawn is + determined by \texttt{gridtype}, described below. The default + is \texttt{line}. + + When \texttt{fltype=grid} and neither \texttt{bgonly} nor + \texttt{outlineonly} are specified, a grid is drawn consisting of + horizontal and vertical lines. The thickness of the lines drawn is + determined by the length. The + default is \cs{setlength\darg{\string\flfboxrule}\darg{.4pt}}. Any dotted + line is unaffected by the value of \cs{flfboxrule}. +\end{description} +The rest of the keys are listed in alphabetical order. The \texttt{fltype} key +is separated out due to its importance. +\begin{description} + +%\item[\texttt{fontfamily=\anglemeta{family}}{\sIndexttKey[\ipkg{web}|textbf]{fontfamily}}] +% Font family to use for section titles, permitted values are +% \texttt{rmfamily}, \texttt{sffamily}, \texttt{ttfamily}. + +\item [\texttt{align=\ameta{\upshape{default|left}}}] This key sets the + horizontal alignment of the filler lines; a key-value of + \texttt{align=default} is the natural way of aligning the filler lines, + while \texttt{align=left} shifts the lines to the left margin. The + default is \texttt{default}, \texttt{align} is equivalent to + \texttt{align=default}. + +% Refer to the paragraph \textbf{\nhnameref{para:fl-align}} on +% page~\pageref{para:fl-align} and Example~\ref{exmpl:aligntypes} that +% follows it. + +\item [\texttt{bgcolor=\ameta{named\_color}}] The color of the background, + when \texttt{bgonly} is in effect. + +\item [\texttt{bgonly*=\ameta{\upshape{true|false}}}] When the key is set to + true, \pkg{eqexam} colors the targeted region with the color determined + by the \texttt{bgcolor} key. This key\FmtMP{\texttt{fltype=grid} + required} is \emph{ignored} unless \texttt{fltype=grid}. + + If \texttt{bgonly[=true]} is declared, \texttt{bgonly=false} must be + declared later to turn off this effect, as \pkg{eqexam} cannot determine + the intention. If the star-form is used (\texttt{bgonly*[=true]}), + \texttt{bgonly} is automatically set to false after the next region is + drawn. + Use the \texttt{bgonly} key to create backgrounds for several consecutive + regions. Use the \texttt{bgonly*} form of the key for a single region. +% See Problem~1\,(g) of Example~\ref{exmpl:fillertypes}. + +% for example, \setFillLinesFmt{fltype=grid,bgonly} then later we say +% \setFillLinesFmt{fltype=grid,gridtype=dash}, do we continue with bgonly, +% or switch over to a true grid? + +\item [\texttt{equalcells=\ameta{\upshape{true|false}}}] This key is only + effective when \texttt{fltype=grid}, but the keys \texttt{bgonly} and + \texttt{outlineonly} are both false. When the key \texttt{equalcells} (or + the key-value \texttt{equalcells=true}) is specified, grid cells of equal + width are drawn; the total width of a row may not be equal to the + \cs{linewidth}, however. The key is initially set to \texttt{false}. + +% An example of the default (cells not necessarily equal) is found in +% problem 1\,(\ref{item:gridtype}) on page~\pageref{item:gridtype}. + + The command versions of this key may also be expanded explicitly; these are + \Com[\ipkg{eqexam}|textbf]{equalCellSizesOn} and + \Com[\ipkg{eqexam}|textbf]{equalCellSizesOff}. + +\item [\texttt{color=\ameta{named\_color}}] The value of the \texttt{color} + key sets the color to be used when drawing filler lines (both horizontal + and vertical). + +\item [\texttt{gridtype=\ameta{\upshape{line|dash|dots}}}] The value of + the key \texttt{gridtype} determines the line type when + \texttt{fltype=grid}, otherwise, the value of this key is ignored. Values + of \texttt{line} and \texttt{dash} obey the value of \cs{flfboxrule}. + +\item [\texttt{linegap=\ameta{dimen}}] The ``gap'' between two horizontal or + vertical lines; the \texttt{linegap} key sets the length register \Com[, + length\ipkg{eqexam}|textbf]{wlVspace}\FmtMP{the gap is \cs{wlVspace}} to + \ameta{dimen}. This key executes the command + \Com[\ipkg{eqexam}|textbf]{eqWLSpacing}\texttt{\darg{\ameta{dimen}}}. The + default is 14pt. + +\item [\texttt{numbers=\ameta{\upshape{none|left|right}}}] The + \texttt{numbers} key controls whether the lines are numbered and their + relative position to the line; the default is not to number the lines (\texttt{numbers=none}). + +\item [\texttt{numbersep=\ameta{dimen}}] The value of \texttt{numbersep} sets + the separation between the line and the number, the default is 2pt. + +\item [\texttt{numfmt=\ameta{num-fmt}}] This key-value pair formats the line + numbers. Within the value \ameta{num-fmt}, the macro \cs{flnum} refers + to the number itself; for example,\[ + \texttt{numfmt=\string\textcolor\darg{red}\darg{\string\flnum}}\] + produces red line numbers. The initial declaration for + this key is \texttt{numfmt=\cs{flnum}}, which creates a black line + number. + + The font size\FmtMP{font size of the numbers} of the line numbers is + \cs{tiny}, but this can be overwritten by incorporating a size into the + \texttt{numfmt} (\texttt{numfmt=\string\small\string\flnum}). + +%\promoteNewPage[2\baselineskip] + +\item [\texttt{outlineonly*=\ameta{\upshape{true|false}}}]\label{item:outlineonly} If this key is + true\FmtMP{\texttt{fltype=grid} required}, an outline of the region is drawn using line type determined by + \texttt{gridtype}. This key is \emph{ignored} unless + \texttt{fltype=grid}. + + If \texttt{outlineonly[=true]} is declared, \texttt{outlineonly=false} + must be declared later to turn off this effect, as \pkg{eqexam} cannot + determine the intention. If the star-form is used + (\texttt{outlineonly*}), \texttt{outlineonly} is automatically set + to false after the next region is drawn. Use the \texttt{outlineonly} key + to create backgrounds for several consecutive regions. Use the + \texttt{outlineonly*} form of the key for a single region. + +% See Problem +% 1\,(f) of Example~\ref{exmpl:fillertypes} for an illustration of this feature. + +\item [\texttt{topline=\ameta{\upshape{true|false}}}] If true, \pkg{eqexam} + draws an extra horizontal line above the topmost line. Any vertical lines + are extended to meet this additional line. + +% See Problem 1\,(b) of Example~\ref{exmpl:fillertypes}. +\end{description} + +\begingroup + +%\writeToSolnFile{^^J\protect\iffalse^^J}% + + +\useFillerLines +\turnflnosolnsOn +\turnContAnnotOn +\setFillLinesFmt{fltype=line,numbers=left} + +\noindent +The following is an example of filler lines under the \env{nosolutions} assumption. +\separationruleOff +\chngToNoSolns +%\solutionsonlytrue +\RecordThisExamOff +\begin{exam}[Filler Lines 1]{fl1} +\begin{problem} +Expound on all you know on the subject. +%\priorworkareaCmds{\baselineskip\wlVspace} +\begin{priorworkarea}\baselineskip\wlVspace +When the \opt{flextended} option is not in force, these three lines are blank. However, in this example, +\opt{flextended} is active, and I can write to these lines. Refer to `\nameref{sss:flxtnd}' below. +\end{priorworkarea} +\begin{solution}[42pt] +Your guess is as good as mine. +\end{solution} +\end{problem} + +\turnflnosolnsOff +\setFillLinesFmt{fltype=grid,gridtype=line,numbers=right,topline,color=lightgray} + +\begin{problem} +Expound on all you know on the subject. +\begin{priorworkarea} +Essay area. +\end{priorworkarea} +\begin{solution}[\sameVspace] +Your guess is as good as mine. +\end{solution} +\belowexskip{0pt} +\end{problem} +%\belowsqskip{\vskip0pt} +\end{exam} +\noindent +The verbatim listing of this example is presented and discussed in the next section. + +%\writeToSolnFile{\protect\fi^^J}% +\endgroup \therearesolutionsfalse % do not record this as a solution at the end + +\subsubsection{On the \texttt{flextended} option}\label{sss:flxtnd} + +The \texttt{flextended} option brings in code that extends filler lines. It +defines one new environment \env{priorworkarea}, and several commands. One +significant enhancement is the ability to write to the lined regions in the +\opt{nosolutions}\FmtMP{\opt{nosolutions}}, \opt{vspacewithsolns}\FmtMP{\opt{vspacewith\-solns}}, and +\env{answerkey} options are in effect. + +The contents of the \env{priorworkarea} environment will be superimposed on the filler lines +when the \opt{nosolution} or \opt{vspacewithsolns} option is in effect. It is placed prior to +the \env{solution} environment. +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=!()] +\begin{priorworkarea} +!quad!ameta(content) +\end{priorworkarea} +\begin{solution}[!meta(vspace)] +!quad!ameta(solution) +\end{solution} +\end{Verbatim} +For the \ameta{content} to be superimposed on the vertical space specified by +the optional parameter \meta{vspace} of the \env{solution} environment, +\cs{useFillerLines} must be in force and \cs{turnflnosolnsOn} must be +expanded prior to the statement of the problem. (Turn off the writing to the +vertical space with \cs{turnflnosolnsOff}). +The verbatim listing of the example above, which does use the +\opt{flextended} option as well as the \env{priorworkarea} +environment is presented below. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small] +\begin{exam}{fl1}\chngToNoSolns + +\begin{problem} +Expound on all you know on the subject. +\begin{priorworkarea}\baselineskip\wlVspace +When the \texttt{flextended} option is not in force, these three +lines are blank. However, in this example, \textsf{flextended} is +active, and I can write to these lines. Refer to ... +\end{priorworkarea} + +\begin{solution}[nLines=3] +Your guess is as good as mine. ... +\end{solution} +\end{problem} + +\turnflnosolnsOff +\setFillLinesFmt{fltype=grid,gridtype=line, + numbers=right,topline,color=lightgray} +\begin{problem} +Expound on all you know on the subject. +\begin{priorworkarea} +Essay area. +\end{priorworkarea} + +\begin{solution}[nLines=3] +Your guess is as good as mine. +\end{solution} +\end{problem} +\end{exam} +\end{Verbatim} + +%\vspace{3\wlVspace} + +For the \opt{answerkey} option\FmtMP{\opt{answerkey}}, content of the +\env{solution} environment is written to the vertical space allotted by is +optional parameter, \meta{vspace}. As with \env{priorworkarea} there is a +gatekeeper command \cs{turnflanskeyOn}. For the content to be written to the +vertical space, \cs{userFillerLines} and \cs{turnflanskeyOn} must be +expanded. To turn off writing to the vertical space, expand +\cs{turnflanskeyOff}. + +\newtopic\noindent +The last example is repeated, but under the assumption of the \opt{answerkey} option. + +\useFillerLines +\turnflanskeyOn +\turnContAnnotOn +\DoNotFitItIn +\acvspace{2\wlVspace} + +\fvsizeskip{.1} +\noExamTitleInSolns +\begin{exam}[Filler Lines 2]{fl2}\AnswerKey +\flPageBreakMsg{\textbf{Problem~{\eqeCurrProb} continues on next page\strut}}% + +\begin{problem} +Expound on all you know on the subject. +%\priorworkareaCmds{\baselineskip\wlVspace} +\begin{priorworkarea}\baselineskip\wlVspace +When the \opt{flextended} option is not in force, these three lines are blank. However, in this example, +\opt{flextended} is active, and I can write to these lines. Refer to `\nameref{sss:flxtnd}' below. +\end{priorworkarea} +\solutionafterExCmds{\baselineskip\wlVspace + \parindent\wlVspace}%\tweakBreakPoint{5pt} +\begin{solution}[nLines=10] %\baselineskip\wlVspace\parindent\wlVspace +Your guess is as good as mine. The content has the capability of breaking across pages. + +I've added more lines because this problem has a chance breaking across a page boundary. +Let's prattle on until we go to the next page.\vspace{2\baselineskip} + +We'll jump down a couple of lines cause I don't have much to say. Gotta keep +going to get to the next page. If all works as it should, I'll see you one +the other side! Perfect! As mentioned in the `\nameref{sss:BAP}' below. There +are limitations to this wonder. +\end{solution} +\end{problem} + +\turnflnosolnsOff +\setFillLinesFmt{fltype=grid,gridtype=line,numbers=right,topline,color=lightgray} + +\begin{problem} +Expound on all you know on the subject. +\begin{priorworkarea} +Essay area. +\end{priorworkarea} +\begin{solution}[42pt] +Your guess is as good as mine. +\end{solution} +\end{problem} +All in all, this is very cool. +\belowsqskip{\vskip0pt} +\end{exam} + + +\subsubsection{Breaking across pages}\label{sss:BAP} +When the vertical space of the \env{solution} environment is filled with +filler lines (assuming \cs{useFillerLines} is in force), \emph{the lines and the +content can break across pages}, provided the content is not within a box. It +has limited capabilities of breaking across columns (for +\texttt{fltype=line|dash|dots}), but when the \opt{flextended} option is in +effect, may fail dramatically at superimposing the content over the filler +lines. + +When \cs{turnContAnnotOn} is expanded prior to the problem, should the fill +lines break across a page boundary, the annotation string +(\Com[\ipkg{eqexam}]{annotContStr}) appears at the top of the next page. The +topic of annotating solutions is taken up again in the next section. + +\subsubsection{Annotating a continuing problem with +\texorpdfstring{\cs{useFillerLines}}{\CMD{\useFillerLines}}}\label{para:cnwithFL} + +When the command \Com[\ipkg{eqexam}]{useFillerLines} is expanded, any vertical +space declared with the optional argument of \env{solution} is created one +line at a time. Just before each of the lines is drawn, two commands are +expanded, the first just prior to the a page break, if one occurs, and the +second just after the page break, if one occurs. The second command is the internal +version of \Com[\ipkg{eqexam}]{insertContAnnot}, the first command is accessed through +the command \cs{priorPageBreakMsg}. +\settowidth{\aebdimen}{\ttfamily\string\priorPageBreakMsg\darg{\meta{msg}}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\priorPageBreakMsg{!meta(msg)} +\flPageBreakMsg{!meta(msg)} +\end{dCmd} +The \cs{priorPageBreakMsg} command allows you to insert \meta{msg} at the +beginning of each line, but does not determine whether a page break is near. +The \cs{flPageBreakMsg} command, which uses both \cs{priorPageBreakMsg} and +\Com[\ipkg{eqexam}]{emitMessageNearBottom}, is the appropriate vehicle for +writing \meta{msg} just prior to a page break. Its definition is found next. +\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small] +\newcommand{\flPageBreakMsg}[1]{% + \priorPageBreakMsg{\emitMessageNearBottom[\iacvspace] + {\eqfititin{{\Large\strut}#1}}}} +\end{Verbatim} +The command may be redefined for your needs. Notice that the star-option of +the command \cs{emitMessageNearBottom} \emph{is not taken}, so the command does not +create a new page if near the bottom, but it does create a message +(\texttt{\#1}). The optional argument of \cs{emitMessageNearBottom} is set to +\texttt{\cs{iacvspace}}, this is the interpretation of `near the bottom' of +the page. A recommended value for \cs{iavspace} is \texttt{2\cs{wlVspace}} +(\cs{acvspace\darg{2\cs{wlVspace}}}). A typical declaration might be, +\begin{Verbatim}[xleftmargin=15pt,fontsize=\small,commandchars=!()] +% Set \iacvspace for \insertContAnnot and \emitMessageNearBottom +\acvspace{2\wlVspace} %!sffamily(<-- the recommended value) +\flPageBreakMsg{\textbf{Problem~{\eqeCurrProb}!lp(\thepartno)!rp\space + continues on next page}} +\end{Verbatim} +At the top of the next page the \cs{annotContStr} string appears as well. + +\subsection{Keep vertical space with \texttt{answerkey}} + +One thing that has bothered me in my efforts to create the ``perfect'' +exam package, is the differences in vertical spacing between the exam the +student sees (which is compiled with the \texttt{nosolutions} option), and +the solutions document the instructor sees (as compiled with the +\texttt{answerkey} option). The differences in vertical space of the two +documents makes it harder for the eye to move from the student's exam to +the answer key document and back again. In the past, I've used +\cs{aNewPage} or \cs{qNewPage} to force page breaks so that the page +breaks of the two document match, this makes it easier to get one page at +a time. + + +Below is a simple example to illustrate the above points. In the example below, +we simulate +\begin{Verbatim}[xleftmargin=\amtIndent] +\begin{solution}[1in] +$ x+1 = 4 \implies x = 3 $ +\end{solution} +\end{Verbatim} +\begin{flushleft} +\setlength{\fboxsep}{0pt} +\begin{tabular}{@{\hskip\leftmargini}cc} +\texttt{nosolutions} & \texttt{answerkey}\\ +\fbox{\parbox[t][1in]{.4\linewidth}{\strut\kern0pt\vfill\hfill}}& +\fbox{\parbox[t]{.4\linewidth}{\strut\textit{Solution:} $ x+1 = 4 \implies x = 3 $}}\\ +\end{tabular} +\end{flushleft} +We have put an \cs{fbox} around the vertical space so you can see the +bottom of the vertical space, and better appreciate the point I am trying +to make. When \texttt{nosolutions} is in effect, a vertical space of 1 +inch is created; when the \texttt{answerkey} is used, the vertical spacing +is ignored, and the solution is typeset, as shown above. Notice the +difference in the vertical spacing between the two. + +The \textsf{eqexam} package now attempts to build the solution environment +so the vertical spacing is (roughly) the same. +\settowidth{\aebdimen}{\ttfamily\string\vspacewithkeyOff} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\vspacewithkeyOn +\vspacewithkeyOff +\end{dCmd} +\noindent The first command turns on this new feature---the feature of trying to +place the vertical spacing in the \texttt{answerkey} mode as requested by +the optional argument of the \texttt{solution} environment. The second +one, \cs{vspacewithkeyOff} (the default) turns off this new feature, and +reverts to the old behavior of \textsf{eqexam}. + +Here is a representation of the effects of the command \cs{vspacewithkeyOn}. + +\begin{Verbatim}[xleftmargin=\amtIndent] +\begin{solution}[1in] +$ x+1 = 4 \implies x = 3 $ +\end{solution} +\end{Verbatim} +\begin{flushleft} +\setlength{\fboxsep}{0pt} +\begin{tabular}{@{\hskip\leftmargini}cc} +\texttt{nosolutions} & \texttt{answerkey}\\ +\fbox{\parbox[t][1in]{.4\linewidth}{\strut\kern0pt\vfill\hfill}}& +\fbox{\parbox[t][1in]{.4\linewidth}{\strut\textit{Solution:} $ x+1 = 4 \implies x = 3 $\hfill\vfill}}\\ +\end{tabular} +\end{flushleft} +As you can see, the vertical spacing with solutions is the same as +without, the page breaks should be the same, and the positioning of the problems should be +(roughly) the same throughout the test. + +\newtopic The commands \cs{vspacewithkeyOn} and \cs{vspacewithkeyOff} may +be used anywhere (between problems or parts), but normally, one would put +\cs{vspacewithkeyOn} in the preamble. + +\subsection{Annotating a Continuing Problem with Parts} + +% http://www.acrotex.net/blog/?p=698 +% Annotating a Continuing Problem with Parts, and Page totals +The demonstration file for this feature is +\begin{equation*} +\textsl{\textsl{\ulSetLink{http://www.acrotex.net/blog/?p=698}{Annotating a +Continuing Problem with Parts, and Page totals}}} +\end{equation*} +found at the \textbf{\ulSetLink{http://www.acrotex.net/blog}{Acro\TeX{} Blog}} + +\newtopic A situation often encountered is when a problem with parts crosses a page +boundary; the problem continues on the next page without any annotation. +This feature works to insert a text string at the top of the next page, a +string that gives the reader (student) the context of the part. + +\medskip\noindent +\begin{minipage}{\linewidth} +\begin{minipage}[t]{.5\linewidth-5pt} +\emph{(Page 2)}\\ +\textbf{4.} Solve each of the following. +\begin{enumerate} +\item[(a)] Solve this +\item[(b)] Solve this +\end{enumerate} +\end{minipage}\hfil\vrule\hfill +\begin{minipage}[t]{.5\linewidth-10pt} +\emph{(Page 3)}\\ +\textbf{Problem~4 continued.} +\begin{enumerate} +\item[(c)] Solve this +\item[(d)] Solve this +\end{enumerate} +\end{minipage} +\end{minipage} +\newtopic Above is an illustration of how this feature works. + +%the default string is \textbf{Problem \texttt{} continued.} + +\settowidth{\aebdimen}{\ttfamily\string\turnContAnnotOff} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\turnContAnnotOff +\turnContAnnotOn +\end{dCmd} +\noindent The feature may be turned off and on using the above two commands. These +commands are usually in the preamble, but they can appear between problems +or between \texttt{exam} environments. + +\newtopic The annotatation text that appears is determined by the definition of +\cs{annotContStr}. +\begingroup\obeyspaces% +\settowidth{\aebdimen}{\ttfamily \string\textbf\darg{Problem\string~\string\eqeCurrProb\string\space continued.}\}}% +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\newcommand{\annotContStr}{% + \textbf{Problem~\eqeCurrProb\space continued.}} +\end{dCmd} +\endgroup\noindent where \cs{eqeCurrProb} is the current problem number. +\cs{annotContStr} may be redefined, but be sure to include the problem +number \cs{eqeCurrProb}. + +The insertion of the continuation annotation uses the \cs{promoteNewPage} command, see +Section~\ref{aqpNewPage} on page~\pageref{aqpNewPage} for a description of this command. + +\settowidth{\aebdimen}{\ttfamily\string\newcommand\darg{\string\ic@vspacedefault}\darg{1in}} +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\acvspace{!meta(vspace)} +\resetacvspace +\newcommand{\ic@vspacedefault}{1in} +\end{dCmd} +\noindent The above three lines describes some commands for controlling the +generation of a new page through the use of \cs{promoteNewPage}. The first +one \cs{acvspace} defines the value of the length +\cs{iacvspace}\FmtMP{\cs{iacvspace}}, which is used to set the option +parameter of \cs{promoteNewPage}. The default value for promoting a new page +is \texttt{1in}, as defined by \cs{ic@vspacedefault}, which can be +redefined. The command \cs{resetacvspace} resets the optional argument of +\cs{promoteNewPage} back to its default. All definitions are local, so the +revert to their original values when a group is exited. + +\paragraph*{Automatic annotation.}\label{para:autoAnnot}\leavevmode +\index{annotating a continuing problem!automatic}% +Just prior to an \cs{item} within a \env{parts} environment\FmtMP{for items +in a \env{parts} env.}, the command \Com[\ipkg{eqexam}]{promoteNewPage} is +expanded with optional argument of \cs{iacvspace} in this case. This command +calculates the amount of space remaining on the page, if it is less than +\cs{iacvspace}, a \cs{newpage} is emitted and \cs{annotContStr} is typeset at +the top of the next page. As a result of this algorithm, if there is more +space than \cs{iacvspace}, but a page break occurs by the {\TeX} page +breaking algorithm, the continuation string does not +appear.\footnote{Remember, after each \cs{item} a \env{solution} environment +may request vertical space for the student to do his work.} If you don't get +the continuation annotation at the page break, change \cs{iacvspace} +(possibly to a smaller value) through its \cs{acvspace} interface command. + +When the \Com[\ipkg{eqexam}]{useFillerLines} command is used, there are +additional automatic automation commands, refer to the paragraph +\textbf{\nhnameref{para:cnwithFL}} on page~\pageref{para:cnwithFL}. + +\paragraph*{Manual annotation.}\label{para:manAnnot}\leavevmode +\index{annotating a continuing problem!automatic}% +There are two commands for manually inserting +annotations into the document. +\settowidth{\aebdimen}{\ttfamily\string\emitMessageNearBottom*[\meta{vspace}]\darg{\meta{msg}}}% +\begin{dCmd}[commandchars=!()]{\aebdimen+2\fboxsep+2\fboxrule} +\insertContAnnot[!meta(vspace)] +\emitMessageNearBottom*[!meta(vspace)]{!meta(msg)} +\end{dCmd} +For both commands, the default value for the optional argument \meta{vspace} +is \cs{iacvspace}. Both commands start with a \cs{par}, meaning they must be +in vertical mode to work, so they should not be used within a paragraph. Each +command determines the amount of space left (\meta{spaceleft}) on the page. + +For \cs{insertContAnnot}, if $\meta{spaceleft} < \meta{vspace}$, a +\cs{newpage} command is expanded and the continuation string +\cs{annotContStr} is inserted at the top of the next page; otherwise, it does +nothing. + +The action of \cs{emitMessageNearBottom} is similar but it \emph{does not +insert} start a new page (\cs{newpage}) unless the star-option (\texttt*) is +specified. If $\meta{spaceleft} < \meta{vspace}$, then \meta{msg} is typeset +(at the bottom of the page). If the star-option is specified, a \cs{newpage} +is invoked and \cs{annotContStr} is typeset at the top of the next page. + +\subsection{The Exam Record}\label{examrecord} + +% http://www.acrotex.net/blog/?p=703 +% The Exam Record on the Cover Page + +The demonstration file for this feature is +\begin{equation*} +\textsl{\textsl{\ulSetLink{http://www.acrotex.net/blog/?p=703}{The Exam Record on the Cover Page}}} +\end{equation*} +found at the \textbf{\ulSetLink{http://www.acrotex.net/blog}{Acro\TeX{} Blog}} + + +\newtopic When choose the \texttt{coverpage} option and the \texttt{coverpagesumry} option is set to either +\texttt{byparts} or \texttt{bypages}, you get an \textbf{Exam Record} appearing on the cover page. +See Figure~\ref{fig:ExamRecord}, page~\pageref{fig:ExamRecord}. + +There are several commands that can be used to customize the layout of the \textbf{Exam Record} +\begin{Verbatim}[xleftmargin=\amtIndent,numbers=left] +\eqeSumryHoriz +\eqeSumryVert +\end{Verbatim} +These two commands arrange the \textbf{Exam Record} +relative to the student/instructor information. The former is a horizontal +arrangement, the latter is a vertical arrangement, \cs{eqeSumryVert} is the default. + +\newtopic Below are several text commands for customizing the text in the \textbf{Exam Record} +box: +\begin{Verbatim}[xleftmargin=\amtIndent,numbers=left] +\newcommand{\cpSumryHeader}{\textbf{Exam Record}} +\newcommand{\cpSumryPts}{\,\text{pts}} +\newcommand{\cpSumryPage}{Page} +\newcommand{\cpSumryTotal}{Total:} +\newcommand{\cpSumryGrade}{Grade:} +\cpSetSumryWidth{.5\linewidth} +\end{Verbatim} +The meanings of numbers~(1)--(5) are apparent from Figure~\ref{fig:ExamRecord}, page~\pageref{fig:ExamRecord}, +where these strings are on display. Number~(6) determines the width of the \textbf{Exam Record}, its default +is half the \cs{linewidth}. + +\newtopic The \textbf{Exam Record} by default is enclosed in an \cs{fbox}, use the command +\cs{cpNofbox} in the preamble to remove this enclosing box. + +\newtopic\textbf{Naming conventions for \texttt{byparts}.} When +\texttt{coverpagesumry=byparts}, there are several naming options +available. The default name of each part is the exam name (the required +argument of the \texttt{exam} environment. By specifying +\cs{useUIPartNames} in the preamble, the user friendly name is used (the +one that appears as the optional first argument of the \texttt{exam} +environment. The user friendly names are used when the solutions are +listed in the back of the document (for example, when the option +\texttt{vspacewithsolns} is specified). These user-friendly names may be too wide +to put in the \textbf{Exam Record}, in this case, you can executed +\cs{useCustomPartNames} in the preamble. This allows you to define your own names +that are to appear in the \textbf{Exam Record}. To define your custom names, use +the \cs{customNaming} command: +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=+\(\)] +\customNaming{+meta(name)}{+meta(text)} +\end{Verbatim} +where, \meta{name} is the name of the exam, and \meta{text} is the text to appear +in the \textbf{Exam Record}. For example, the following definitions might be made +for a two part final exam, the first part the instructor is free to pose questions, +the second part are Department supplied questions. +\begin{Verbatim}[xleftmargin=\amtIndent] +\customNaming{Part1}{Instr Qs:} +\customNaming{Part2}{Dept Qs:} +\end{Verbatim} + +\subsection{Calculate problem range between two markers} + +I have defined the command In response to a user who wanted more +information about problem ranges between two marks, the command +\cs{calcQsBtwnMarkers} is the proposed solution. The syntax is\dots +\begin{Verbatim}[xleftmargin=\amtIndent,commandchars=+\(\)] +\calcQsBtwnMarkers[+meta(Mrk2)]{+meta(Mrk1)} +\end{Verbatim} +The required parameter (\meta{Mrk1}) is called the \emph{primary mark}. +The command defines a number of other commands based on the primary +mark name. \cs{calcQsBtwnMarkers} calculates the first and +last problem numbers of the questions between the command +\cs{calcQsBtwnMarkers} that has \meta{Mrk1} as its \emph{primary marker} and +another command \cs{calcQsBtwnMarkers} that has \meta{Mrk2} as its \emph{primary +marker}. The names of the commands produced are all based in the primary +marker name \meta{Mrk1}. + +\newtopic As mentioned above, there are several other commands +\cs{calcQsBtwnMarkers} defines. +\cs{calcQsBtwnMarkers[\meta{Mrk2}]}\verb!{!\meta{Mrk1}\verb!}! defines the +following commands: +\begin{itemize} + +\item \cs{\meta{Mrk1}Start} is the first question number that follows the placement +of the command \cs{calcQsBtwnMarkers} with \meta{Mrk1} as its primary marker. + +\item \cs{\meta{Mrk1}End} is the last question number between two +\cs{calcQsBtwnMarkers} commands having \meta{Mrk1} and \meta{Mrk2} as their +primary marks. + +\item \cs{\meta{Mrk1}nQs} is the number of questions appearing +between \cs{calcQsBtwnMarkers} commands having primary marks of +\meta{Mrk1} and \meta{Mrk2}. +\end{itemize} +Three other commands are defined for easy user access. +\begin{itemize} +\item \cs{markStartFor}\verb!{!\meta{Mrk1}\verb!}! expands to \cs{\meta{Mrk1}Start}. +\item \cs{markEndFor}\verb!{!\meta{Mrk1}\verb!}! expands to \cs{\meta{Mrk1}End}. +\item \cs{markNumQsFor}\verb!{!\meta{Mrk1}\verb!}! expands to \cs{\meta{Mrk1}nQs}. +\end{itemize} +Use the command \cs{calcQsBtwnMarkers} without the optional first argument as the last mark +in your \texttt{exam} environment. + +%\handpoint The demo file for this feature is named \texttt{markqs.tex}. + +\exAeBBlogPDF{p=1231} The demo file for this feature is named +\texttt{\href{\urlAcroTeXBlog/?p=1231}{markqs.pdf}} + +\newpage +\markright{References} + +\begin{thebibliography}{[1]}\label{references} +\addcontentsline{toc}{section}{\protect\numberline{}References} +\backrefparscanfalse +\def\srtln{\vskip-\baselineskip\vskip-\parsep} +\def\lngln{\vskip-\parsep} + +\bibitem{book:AEBB} + D. P. Story, \textsl{\AEBBook}, in preparation. \backrefprint + +\end{thebibliography} + + +\end{document} diff --git a/macros/latex/contrib/eqexam/doc/fortextbook/fortextbook.pdf b/macros/latex/contrib/eqexam/doc/fortextbook/fortextbook.pdf new file mode 100644 index 0000000000..4619dc8891 Binary files /dev/null and b/macros/latex/contrib/eqexam/doc/fortextbook/fortextbook.pdf differ diff --git a/macros/latex/contrib/eqexam/eqecus.opt b/macros/latex/contrib/eqexam/eqecus.opt new file mode 100644 index 0000000000..15c4586697 --- /dev/null +++ b/macros/latex/contrib/eqexam/eqecus.opt @@ -0,0 +1,12 @@ +% +% AcroTeX Software Development Teams -- 2010 +% http://www.acrotex.net +% +% The following options combination of options are special to the +% @EASE application. Do not change. +% +\DeclareOptionX{atbdbopts}{% + \ExecuteOptionsX{online,forcolorpaper,nosolutions,nopoints,nototals,nospacetowork,obeylocalversions,myconfig} +} +\endinput + diff --git a/macros/latex/contrib/eqexam/eqexam.def b/macros/latex/contrib/eqexam/eqexam.def new file mode 100644 index 0000000000..1cdf043328 --- /dev/null +++ b/macros/latex/contrib/eqexam/eqexam.def @@ -0,0 +1,1734 @@ +%% +%% This is file `eqexam.def', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% exerquiz.dtx (with options: `eqexam') +%% +\ProvidesFile{eqexam.def} + [2019/02/11 v8.2.9 % + Exerquiz support file for eqexam (dps)] +\let\eq@YES=y \let\eq@NO=n +\let\eq@One=1 \let\eq@Zero=0 +\def\eq@r{r}\let\eq@f=f \let\eq@l=l +\newif\ifeq@noforms \eq@noformsfalse +\newif\ifeq@noquizsolutions \eq@noquizsolutionsfalse +\newif\ifnocorrections \nocorrectionsfalse +\@ifundefined{ifeqe@flextended}{\newif\ifeqe@flextended + \eqe@flextendedfalse}{} +\@ifundefined{ifcont@nnot}{\newif\ifcont@nnot \cont@nnotfalse}{} +\@ifundefined{if@eqalignfilllinestoleft} + {\newif\if@eqalignfilllinestoleft\@eqalignfilllinestoleftfalse}{} +\newif\ifkeepdeclaredvspacing \keepdeclaredvspacingfalse +\newif\ifeq@nolink \eq@nolinkfalse +\def\eq@ckglobalhide{\ifeq@globalshowsolutions\eq@hidesolutionfalse\fi} +\def\hidesymbol{h}\def\Hidesymbol{H} +\newif\iftherearesolutions \therearesolutionsfalse +\newif\ifIsRespBox \global\IsRespBoxfalse +\def\SolutionsAfter{\solutionsAtEndfalse\eq@solutionsaftertrue + \displayworkareafalse\eq@proofingfalse\eq@nolinktrue} +\newif\ifcqSA\cqSAfalse +\def\SolutionsAtEnd{\solutionsAtEndtrue\vspacewithsolnstrue + \eq@solutionsafterfalse\eq@nolinkfalse + \displayworkareafalse\ifvspacewithsolns\eq@nosolutionsfalse\else + \eq@nosolutionstrue\fi\eq@proofingfalse\answerkeyfalse} +\def\NoSpaceToWork{\let\eq@insertverticalspace\eq@NO} +\def\SpaceToWork{\let\eq@insertverticalspace\eq@YES} +\SpaceToWork +\long\def\ifNoSolutions#1#2{% + \ifeq@nosolutions\expandafter#1\else + \expandafter#2\fi} +\newif\ifeq@randomizeChoices \eq@randomizeChoicesfalse +\newif\ifeq@randomizeallChoices \eq@randomizeallChoicesfalse +\def\turnOnRandomize{\eq@randomizeallChoicestrue} +\def\obeyLocalRandomize{\eq@randomizeallChoicesfalse} +\let\saveRandomSeed\relax +\let\inputRandomSeed\relax +\newcommand{\exsolafter}{\eq@exsolafterDefault} +\newcommand{\resetSolnAfterToDefault}{% + \def\exsolafter{\eq@exsolafterDefault}} +\newcommand{\exsolafterDefault}[1]{\def\eq@exsolafterDefault{#1}% + \def\exSolafterDefault{#1}\resetSolnAfterToDefault} +\exsolafterDefault{\textit{Solution}:} +\newcommand{\renameSolnAfterTo}[1]{\def\exsolafter{#1}} +\newcommand{\adjDisplayBelow}{\vskip-\lastskip\vskip-\baselineskip} +\newcommand{\adjDisplayBelowPlus}{\adjDisplayBelow\recoverDisplayBelow} +\def\recoverDisplayBelow{\vskip\belowdisplayskip} +\newcommand\setDefShortQuizLabelName[1]% + {\def\eq@defaultShortQuizLabelName{#1}} +\setDefShortQuizLabelName{Quiz} +\newcommand{\writeToExSolns@}[1]{% + \ifsolutionsonly\else + \ifOKToWriteExamData + \set@display@protect + \immediate\write\ex@solns{#1}\set@typeset@protect + \fi\fi}% +\ifsolutionsonly + \InputIfFileExists{\jobname_xdefs.cut}{% + \typeout{^^JExerquiz|Eqexam: Reading \jobname_xdefs.cut^^J}} + {\PackageWarningNoLine{exerquiz|eqexam}{% + \jobname_xdefs.cut not found.\MessageBreak + Recompile file under the vspacewithsolns\MessageBreak + option, then compile with the solutionsonly\MessageBreak + option}} + \let\writeToExSolns\@gobble +\else + \newwrite\ex@solns \immediate\openout \ex@solns \jobname.sol + \let\writeToExSolns\writeToExSolns@ + \newwrite\eq@xrefdefns + \immediate\openout\eq@xrefdefns\jobname_xdefs.cut +\fi +\let\writeT@ExSolns\writeToExSolns +\newwrite\quiz@solns \immediate\openout \quiz@solns \jobname.qsl +\newcommand{\writeToQzSolns}[1]{\ifOKToWriteExamData\set@display@protect + \immediate\write\quiz@solns{#1}\set@typeset@protect\fi} +\let\writeT@QzSolns\writeToQzSolns +\def\eq@IWAuxOut#1{\immediate\write\@auxout{#1}} +\def\eq@IWDefs#1{\immediate\write\eq@xrefdefns{#1}} +\@ifundefined{ifOKToWriteExamData}{\newif\ifOKToWriteExamData + \OKToWriteExamDatatrue}{} +\def\noSolnWrites{\OKToWriteExamDatafalse} +\def\normalSolnWrites{\OKToWriteExamDatatrue} +\def\bHideSolnIn#1{#1{\protect\iffalse}\noSolnWrites} +\def\eHideSolnIn#1{\normalSolnWrites#1{\protect\fi^^J}} +\newcounter{eqexno} \setcounter{eqexno}{0} +\newcounter{@exno} \setcounter{@exno}{0} % running exno +\newcounter{quizno} \setcounter{quizno}{0} +\renewcommand\thequizno{\alph{quizno}} +\newcounter{eqpointvalue} \setcounter{eqpointvalue}{0} +\newlength\eq@tmplength +\newlength\eqtmplength +\newcounter{questionno} +\newcounter{eqquestionnoi} +\newcounter{eqquestionnoii} +\newcounter{eqquestionnoiii} +\newcount\@eqquestiondepth \@eqquestiondepth=0 +\newcounter{partno} +\newif\ifuseNumForParts\useNumForPartsfalse +\def\alphaParts{\def\partnoFmt{\alph}\useNumForPartsfalse}\alphaParts +\def\numberParts{\def\partnoFmt{\arabic}\useNumForPartstrue} +\renewcommand\thepartno{\partnoFmt{partno}} +\newtoks\eq@scratchtoks +\def\verbatimwrite{\@bsphack + \let\do\@makeother\dospecials + \catcode`\^^M\active \catcode`\^^I=12 + \def\verbatim@processline{% + \immediate\write\verbatim@out + {\the\verbatim@line}}% + \verbatim@start} +\def\endverbatimwrite{\@esphack} +\providecommand\PBS[1]{\let\temp=\\#1\let\\=\temp} +\newcommand{\belowexskip}[1]{\setlength{\eq@tmplength}{#1}% + \edef\eq@exerskip{\noexpand\removelastparskip + \noexpand\vskip\the\eq@tmplength\relax\kern0pt}} +\let\eqexerskip\belowexskip +\belowexskip{\medskipamount} +\newcommand{\aboveexskip}[1]{\setlength{\eq@tmplength}{#1}% + \edef\eq@priorexskip{\noexpand\vskip\the\eq@tmplength\relax + \kern0pt}} +\let\priorexskip\aboveexskip +\aboveexskip{\medskipamount} +\let\eq@postexerciseHook\relax +\newcommand\belowexsolnskip{\protect\medskip} +\def\removelastparskip{\ifdim\parskip>0pt\vskip-\parskip\fi} +\let\marginparpriorhook\@empty % used to material before the exercise +\let\marginparafterhook\@empty % used to material after the exercise +\let\afterlabelhskip\space +\let\exersolnheadhook\@empty +\let\exer@solnheadhook\@empty +\newcommand{\eqexheader} +{% + \mbox{\color{\@nolinkcolor}\if\exerstar*\exlabelformatwp\else + \exlabelformat\fi}% +} +\def\eqexheader@wrapper{\hypertarget{qex.\the@exno}{\eqexheader}} +\newcommand{\partsformat}[1]{\def\eq@partsformat{#1}} +\partsformat{(\hfil\thepartno\hfil)} +\newcommand{\defaultpartsformat}{% + \partsformat{(\hfil\thepartno\hfil)}} +\let\exlisttabheaderpriorhook\@empty +\let\exlisttabheaderafterhook\@empty +\newcommand{\eqexlisttabheader} +{% + \exlisttabheaderpriorhook + \color{\@nolinkcolor}\eq@partsformat +} +\newcount\cq@Cnt +\def\cq@CutName{cq-\the\cq@Cnt.cut} +\let\cq@star\eq@NO +\newif\ifcqqs \cqqstrue +\newif\ifcqIsActive \cqIsActivefalse +\def\cqQS{\@ifstar{\cqQSV}{\cqQSA}} +\def\cqQSA#1#2{\ifcqqs#1\else#2\fi} +\@ifpackageloaded{web}{\@ifundefined{IF@AorBswitch}{% + \PackageWarningNoLine{A version of the web package + dated\MessageBreak 2016/11/03 or later is required + for \string\cqQS}}}{}% +\@ifundefined{webtempboxi}{\newbox\webtempboxi + \newbox\webtempboxii}{} +\providecommand\SHOWTEMPBOXi{\unhbox\webtempboxi} +\providecommand\TRUEACTIONi{\aftergroup\SETTEMPBOXii} +\providecommand\TRUEACTIONia{\aftergroup\SHOWTEMPBOXi} +\providecommand\FALSEACTIONii{\aftergroup\SETTEMPBOXi} +\providecommand\FALSEACTIONiia{\aftergroup\SHOWTEMPBOXi} +\providecommand\SETTEMPBOXi{\IF@AorBswitch\else + \afterassignment\TRUEACTIONia\fi + \setbox\webtempboxi=\hbox} +\providecommand\SETTEMPBOXii{\IF@AorBswitch + \afterassignment\FALSEACTIONiia\fi + \setbox\webtempboxii=\hbox} +\def\cqQSV{\let\IF@AorBswitch\ifcqqs + \IF@AorBswitch + \def\eq@next{\afterassignment\TRUEACTIONi\SETTEMPBOXi}\else + \def\eq@next{\afterassignment\FALSEACTIONii\SETTEMPBOXii}\fi + \eq@next} +\def\eq@turnMessageOff{\let\save@message\message + \let\message\@gobble} +\def\eq@turnMessageOn{\let\message\save@message} +\def\eqCQDeclarations{\cqqsfalse\eq@turnMessageOff + \includecomment{sPage}\excludecomment{qPage}% + \eq@turnMessageOn} +\def\eqTopOfSolnPage{\withinsoldoctrue\cqSAfalse + \eqCQDeclarations} +\def\eqTopOfQslPage{\withinqsldoctrue} +\eq@turnMessageOff +\includecomment{qPage}\excludecomment{sPage} +\eq@turnMessageOn +\newenvironment{cq@CQ} +{% + \global\cqIsActivetrue + \global\advance\cq@Cnt1\relax + \immediate\openout\CommentStream=\cq@CutName + \let\verbatim@out\CommentStream + \verbatimwrite +}{% + \endverbatimwrite + \immediate\closeout\CommentStream + \ifx\cq@star\eq@YES + \xdef\cq@INPUTCUT{\noexpand\cqqstrue + \noexpand\input{\cq@CutName}\noexpand + \def@QuesToSoln}\else + \xdef\cq@INPUTCUT{\noexpand\cqqstrue + \noexpand\input{\cq@CutName}\noexpand + \p@ssQuesToSoln}\fi + \aftergroup\cq@INPUTCUT +} +\newenvironment{cqs@CQ}{\let\cq@star\eq@YES\cq@CQ}{\endcq@CQ} +\def\declCQQuesStr#1{\def\cqQStr{#1}} +\declCQQuesStr{Question} +\def\declCQSolStr#1{\def\cqSStr{#1}} +\declCQSolStr{Solution} +\newcommand\declCQPre[1]{\def\cq@Pre{#1}} +\declCQPre{\emph{\cqQStr}:\space} +\newcommand\declCQPost[1]{\def\cq@Post{#1}} +\declCQPost{\par\medskip\noindent\emph{\cqSStr}:\space\ignorespaces} +\def\cqFmtPasteQues#1{\cq@Pre\input{#1}\cq@Post} +\def\p@ssQuesToSoln{\ifeq@hidesolution\else + \global\terminexchangedtrue % dps cq + \ifeq@solutionsafter\else + \writeT@ExSolns{\protect\decleqterminex{\protect + \cqFmtPasteQues{\cq@CutName}}\eq@commentchar}\fi\fi} +\def\declCopyQues#1{\def\cqCopiedQues{#1}} +\def\def@QuesToSoln{\restoreNormalSolns + \global\terminexchangedfalse % dps cq + \ifeq@hidesolution\else\writeT@ExSolns{\protect + \declCopyQues{\protect\input{\cq@CutName}}}\fi} +\newcommand\restoreNormalSolns{\ifeq@solutionsafter\else + \writeT@ExSolns{\protect\decleqterminex{\protect + \eqterminexDEF}\eq@commentchar}\fi} +\newcommand{\eq@CommonCmd}[1]{\def\eq@@CommonCmd{#1}#1} +\let\eq@@CommonCmd\@empty +\newcommand\gExCommonCmd[1]{\gdef\gEx@CommonCmd{\eq@CommonCmd{#1}}} +\let\gEx@CommonCmd\@empty +\let\endexerhook\@empty +\newenvironment{exercise} +{% + \let\cq\cq@CQ\let\endcq\endcq@CQ + \csarg\let{cq*}\cqs@CQ + \csarg\let{endcq*}\endcqs@CQ + \par\removelastskip\eq@priorexskip\noindent + \let\eqCommonCmd\eq@CommonCmd + \def\eq@argi{eqexno}%% use eqexno counter + \if\eq@exerstarEnv*\def\exerstar{*}\else\def\exerstar{x}\fi + \def\currhideopt{x}% + \@ifnextchar[{\exercise@}% + {\if\exerstar*\def\eq@next{\@exercise}\else + \def\eq@next{\exercise@@}\fi\eq@next}% +}{\eq@postexerciseHook\endexerhook\par + \global\eq@exerciseheadingtrue\removelastskip\eq@exerskip} +\def\exercise@[#1]{\edef\eq@arg{#1}% + \if\eq@arg h\def\currhideopt{h}% + \eq@hidesolutiontrue\eq@nolinktrue% + \ifeq@globalshowsolutions + \eq@hidesolutionfalse\eq@nolinkfalse\fi + \def\eq@next{\@exercise}% h, no *, no counter + \else + \if\eq@arg H% + \edef\currhideopt{\Hidesymbol}% + \eq@hidesolutiontrue\eq@nolinktrue% + \ifeq@globalshowsolutions + \eq@hidesolutionfalse\eq@nolinkfalse + \fi + \def\eq@next{\@exercise}% H, no *, no counter + \else + \def\currhideopt{x}% + \ifx\eq@arg\@empty\else\def\eq@argi{#1}\fi + \if\exerstar*\def\eq@next{\@exercise}\else + \def\eq@next{\exercise@@}\fi + \fi + \fi +\eq@next} +\def\exercise@@{\@ifstar{\def\exerstar{*}\@exercise}{\exercise@@@}} +\def\exercise@@@{\@ifnextchar[{\exercise@@@@}{\@exercise}} +\def\exercise@@@@[#1]{\edef\eq@arg{#1}% + \if\eq@arg h\def\currhideopt{h}% + \eq@hidesolutiontrue\eq@nolinktrue + \ifeq@globalshowsolutions + \eq@hidesolutionfalse\eq@nolinkfalse\fi + \def\eq@next{\@exercise}% h, no *, no counter + \else + \if\eq@arg H\edef\currhideopt{\Hidesymbol}% + \eq@hidesolutiontrue\eq@nolinktrue% + \def\eq@next{\@exercise}% h, no *, no counter + \else + \def\currhideopt{x}% + \PackageWarning{exerquiz}{The option #1 is not recognized} + \let\eq@next\relax + \fi + \fi +\eq@next} +\newif\ifeq@exerciseheading \eq@exerciseheadingtrue +\let\prior@exerSolnHeaderHook\@empty +\newcommand\exerSolnHeader[3]{% + \prior@exerSolnHeaderHook + \ifeqforpaper\else\webnewpage\fi\markright{#1}%\par\noindent% + #3% + \solnhspace +} +\let\solnItemMngt\relax +\let\eqEXt\@gobbletwo +\let\endeqEXt\relax +\let\eqExtArg\@empty +\let\eqFilterArg\@empty +\let\eqExerSolnHeader\@empty +\let\solutionparshape\@empty +\def\eq@pslnaindnt{0pt} +\let\eq@setPrbSolnAftrIndnt\relax +\newcommand{\setPrbSolnAftrIndent}[1]{\ifdim#1=0pt + \def\eq@pslnaindnt{0pt}\let\eq@setPrbSolnAftrIndnt\relax\else + \edef\eq@pslnaindnt{#1}\edef\eq@setPrbSolnAftrIndnt{\expandafter + \noexpand\expandafter\parindent#1\noexpand\relax}\fi} +\newif\if@restorejustify \@restorejustifyfalse +\newcommand\restoreJustifyOn{\@restorejustifytrue} +\newcommand\restoreJustifyOff{\@restorejustifyfalse} +\def\restorejustify{\if@restorejustify + \@rightskip\z@skip \rightskip\@rightskip + \leftskip\z@skip \let\\\@normalcr\fi} +\def\@exercise{% + \global\let\solutionparshape\@empty + \let\verbatim@out=\ex@solns + \if\eq@argi0\else\refstepcounter{\eq@argi}\fi\stepcounter{@exno}% + \if\exerstar*% if exercise with parts + \eq@nolinktrue + \else + \if\currhideopt H% + \else + \ifeq@solutionsafter + \eq@nolinktrue % no link to solution + \else + \eq@ckglobalhide % + \ifeq@hidesolution\else + \global\let\eqExerSolnHeader\eq@@writeexheader + \fi + \fi + \fi + \fi + \ifvmode\ifdim\lastskip>\z@ + \vskip-\lastskip + \fi\fi + \if\exerstar*% + \let\solution\solnexer@woparts + \let\endsolution\endsolnexer@woparts + \let\parts\exercise@parts + \let\endparts\endexercise@parts + \else + \let\solution\solnexer@woparts + \let\endsolution\endsolnexer@woparts + \let\parts\relax + \let\endparts\relax + \if\Hidesymbol h\eq@nolinkfalse\ifeq@solutionsafter + \eq@nolinktrue\fi\fi + \fi + \eq@initializeContAnnot + \ifeq@exerciseheading + \prior@questionsHook\marginparpriorhook\noindent\eqexheader@wrapper + \afterlabelhskip\marginparafterhook\gEx@CommonCmd + \eq@setPrbSolnAftrIndnt\ignorespaces\fi} +\newif\ifterminexchanged \terminexchangedfalse % dps cq +\newcommand\decleqterminex[1]{\def\eqterminex{#1}} +\def\eqterminexDEF{\relax\ignorespaces} +\decleqterminex{\eqterminexDEF} +\newif\ifmakeExSlLocal \makeExSlLocalfalse +\def\makeExSolnsLocalOn{\makeExSlLocaltrue} +\def\makeExSolnsLocalOff{\makeExSlLocalfalse} +\let\eqMrkSoln\@gobble +\def\eqExerSolnHeaderSngl{% + \ifmakeExSlLocal\protect\begingroup^^J\fi + \ifx\eqMrkCpyArg\@empty\else + \protect\eqMrkSoln{\eqMrkCpyArg}\fi + \protect\eqEXt{\eqExtArg}{\eqFilterArg}\protect + \solnItemMngt\protect\exerSolnHeader{\exsecrunhead}{ex.\the@exno}% + {\exsllabelformat}\exer@solnheadhook + \exersolnheadhook\protect\eqterminex} +\def\eq@@writeexheader{\ifeq@hidesolution\else\ifOKToWriteExamData + \set@display@protect + \immediate\write\verbatim@out{\eqExerSolnHeaderSngl}% + \set@typeset@protect\fi\fi} +\def\eqExerSolnHeaderList{% + \ifmakeExSlLocal\protect\begingroup^^J\fi + \ifx\eqMrkCpyArg\@empty\else + \protect\eqMrkSoln{\eqMrkCpyArg}\fi + \protect\eqEXt{\eqExtArg}{\eqFilterArg}\protect + \solnItemMngt\protect\exerSolnHeader{\exsecrunhead}% + {ex.\the@exno\thepartno}{\exsllabelformatwp}% + \exer@solnheadhook\exersolnheadhook\protect\eqterminex} +\def\eq@@writeexheaderlist{\ifeq@hidesolution\else\ifOKToWriteExamData + \set@display@protect\immediate + \write\verbatim@out{\eqExerSolnHeaderList}\set@typeset@protect\fi\fi} +\long\def\setsolnspace#1{\def\newsolnspace{#1}% + \let\solnspace\newsolnspace} +\newif\ifeq@ckSolnVspace \eq@ckSolnVspacetrue +\def\ckSolnOpt{\global\eq@ckSolnVspacetrue} +\def\noSolnOpt{\global\eq@ckSolnVspacefalse} +\let\solnhspace\space +\let\solnspace\space +\let\exsolnonceonlytophook\relax +\def\solnexer@woparts{% + \ifanswerkey\ifeqe@flextended\ifcont@nnot + \ifx\solutionparshape\@empty\else % dpsj8 + \pushEnvir + \everypar{}\if@eqalignfilllinestoleft\else + \parshape=1 \leadinIndent \linewidth\fi + \popEnvir + \fi\fi\fi\fi\def\bLeaveVspace{x}% = no vertical space added + \exsolnonceonlytophook % dps27 + \global\let\exsolnonceonlytophook\relax + \@ifundefined{KV@eqefillLines@bgonly}{} + {\ifKV@eqefillLines@bgonly\ifvmode\else + \par\leavevmode\strut\fi\fi + \ifKV@eqefillLines@outlineonly\leavevmode\strut\fi}% + \ifeq@ckSolnVspace + \def\eq@next{\@ifnextchar[{\solnexer@@woparts}%] + {\solnexer@@woparts[\null]}}\else + \def\eq@next{\solnexer@@woparts[\null]}\fi + \eq@next} +\let\eqPriorVspace\@gobble +\newif\if@eqlinedfiller \@eqlinedfillerfalse +\newcommand{\vspaceFiller}[1]{\vfill} +\newcommand{\vspaceFillerDefault}[1]{\vfill} +\def\eqWriteLine{\hfill} +\def\eq@linesXPgs{% + \begingroup\offinterlineskip\parskip0pt + \@tempcnta=0 + \@whilenum\@tempcnta<\soln@keys@nLines\relax\do + {\vskip0pt\penalty-50\vglue\wlVspace\eqWriteLine + \advance\@tempcnta1\relax}\par\endgroup} +\let\leavevspace\relax % dpsj5 +\newcommand{\vspaceFmt}[1]{% + \ifx\solutionparshape\@empty\else + \advance\linewidth-\leadinIndentPrtSep\fi + \ifdim\sameVspace>0pt + \let\bLeaveVspace\@empty + \def\leavevspace{% + \ifx\eq@insertverticalspace\eq@YES\par\eq@quessolskip + \eqPriorVspace{#1}{\nobreak\noindent + \if@eqlinedfiller + \ifx\soln@keys@nLines\@empty + \def\eq@lines@next{\vspaceFiller{#1}}\else + \def\eq@lines@next{\eq@linesXPgs}\fi + \else + \def\eq@lines@next{\parbox[b][#1][t]{\linewidth} + {\vspaceFiller{#1}}}% + \fi\eq@lines@next}% + \fi + }\expandafter\leavevspace + \fi} +\define@key{soln@keys}{nLines}[]{\def\soln@keys@nLines{#1}} +\let\soln@keys@nLines\@empty +\def\eqKV@errx#1{\xdef\XKV@rm{\@tempa}} +\def\eqSolnForEqexam#1{% + \let\soln@keys@nLines\@empty + \setkeys*{soln@keys}{#1}% + \ifx\soln@keys@nLines\@empty + \ifx\minVspacet@bs\@empty\xdef\sameVspace{\XKV@rm}\else + \xdef\sameVspace{\minVspacet@bs}\fi + \else + \@tempdima\wlVspace + \@tempdima=\soln@keys@nLines\@tempdima + \xdef\sameVspace{\the\@tempdima}% + \ifx\XKV@rm\@empty\else + \if@equsedim\let\soln@keys@nLines\@empty + \xdef\sameVspace{\XKV@rm}\fi + \fi + \fi + \ifx\sameVspace\@empty\gdef\sameVspace{0pt}\fi +} +\def\solnexer@@woparts[#1]{% + \ifcqIsActive\else\ifterminexchanged + \restoreNormalSolns\fi\fi % dps cq + \global\cqIsActivefalse + \def\eq@argi{#1}\def\eq@null{\null}% + \ifx\eq@argi\@empty\gdef\sameVspace{0pt}\else + \ifx\eq@argi\eq@null\gdef\sameVspace{0pt}\else + \@ifundefined{PointsOnLeft}{% + \let\eqKV@errx@SAVE\KV@errx + \let\KV@errx\eqKV@errx\let\XKV@rm\@empty + \edef\temp@exp{\noexpand\setkeys*{soln@keys}{#1}}\temp@exp + \let\KV@errx\eqKV@errx@SAVE + \ifx\soln@keys@nLines\@empty\else + \PackageInfo{exerquiz}{% + nLines key detected in solution environment,\MessageBreak + is not not recognized without eqexam,\MessageBreak + will remove it}% + \let\soln@keys@nLines\@empty\fi + \xdef\sameVspace{\XKV@rm}% + }{\eqSolnForEqexam{#1}}% + \fi\fi + \solnexer@@@woparts +} +\def\solnsafterSkip#1{\setlength{\@tempdima}{#1}% + \edef\solnsafterSkipAmt{\the\@tempdima}% + \def\solutionsafterSkip{\vskip\solnsafterSkipAmt\relax}} +\solnsafterSkip{\smallskipamount} +\def\@solnafterSkipOnce#1{\setlength{\@tempdima}{#1}% + \xdef\@solnafterSkipOnceAmt{\the\@tempdima}}% +\def\@@solnafterSkipOnce{\vskip\@solnafterSkipOnceAmt\relax %dpsj3 + \gdef\@solnafterSkipOnceAmt{0pt}} +\def\@solnafterSkipOnceAmt{0pt} +\def\quessolSkip#1{\setlength{\@tempdima}{#1}% + \edef\eq@quessolskip{\noexpand\vskip\the\@tempdima\relax}} +\def\eq@quessolskip{\vskip\smallskipamount} +\def\eqe@debugVertSkip#1{} +\def\eqe@showEndHere#1{#1} +\def\eqe@setStartSolns{% + \xdef\eq@startSoln{\the\pagetotal}% + \eqe@debugVertSkip{\marginpar{\smash{b[\sameVspace]}}}% +} +\let\eqSavedComment\dlcomment +\let\endeqSavedComment\enddlcomment +\def\setTabulrSolnEnv{% + \@ifundefined{@listii@SAVE}{\global\let\@listii@SAVE\@listii}{}% + \expandafter\def\expandafter\@listii\expandafter{\@listii@SAVE + \leftmargin\leftmarginii \labelwidth\leftmarginii + \advance\labelwidth-\labelsep}% + \def\everyparShape{\everypar{\parshape \@ne 0pt \linewidth}}% + \reset@doendpe{\parshape \@ne 0pt \linewidth}% + \parshape \@ne 0pt \linewidth + \everyparShape +} +\newif\ifthereissolution +\let\priorexsolafterList\@empty +\let\priorexsolafterTab\@empty +\let\priorexsolafterSngl\@empty +\def\eq@Hid{H}\def\eq@hid{h} +\def\solutionafterExCmds#1{\def\@rgi{#1}\ifx\@rgi\@empty + \let\eqSolnExCmds\relax\else + \def\eqSolnExCmds{#1}\fi} +\let\eqSolnExCmds\relax +\def\eq@b@ddCodeSpecialDef#1{#1}% +\let\eq@b@ddCodeSpecial\eq@b@ddCodeSpecialDef +\def\solnexer@@@woparts{\ifeq@solutionsafter\else + \expandafter\begingroup\fi + \global\thereissolutiontrue + \global\let\procsoln\relax + \global\let\endprocsoln\relax + \def\exerwparts@cols{0}% + \let\verbatim@out\ex@solns + \if\currhideopt\eq@Hid + \let\minVspacet@bs\@empty + \let\procsoln\eqSavedComment + \let\endprocsoln\endeqSavedComment + \def\eq@next{\procsoln}% + \else + \eq@ckglobalhide + \ifeq@hidesolution + \let\procsoln\eqSavedComment + \let\endprocsoln\endeqSavedComment + \else + \ifeq@solutionsafter\else + \ifx\eq@@CommonCmd\@empty\else + \set@display@protect + \immediate\write\verbatim@out{\eq@@CommonCmd}% + \set@typeset@protect + \fi + \fi + \let\procsoln\verbatimwrite + \let\endprocsoln\endverbatimwrite + \fi + \def\eq@next{% + \ifeq@solutionsafter + \let\procsoln\relax + \let\endprocsoln\relax + \removelastskip\removelastparskip + \cqSAtrue\eqCQDeclarations + \declCopyQues{\input{\cq@CutName}}% + \ifx\exsolafter\@empty + \ifdim\sameVspace=0pt\eqe@setStartSolns + \else + \solutionsafterSkip + \@@solnafterSkipOnce + \eqe@setStartSolns + \fi + \else\par\kern0pt + \solutionsafterSkip + \@@solnafterSkipOnce + \noindent\strut\eqe@setStartSolns + \fi + \parskip\eqeques@parsep + \ifx\endparts\endexercise@parts@tabular + \eq@setPrbSolnAftrIndnt + \restorejustify + \fi + \ifx\endparts\endexercise@parts@tabular\expandafter + \priorexsolafterTab\else + \ifx\endparts\endexercise@parts@list\expandafter + \priorexsolafterList\else\expandafter + \priorexsolafterSngl\fi\fi + \exsolafter\space\ignorespaces + \solutionparshape + \else + \eqExerSolnHeader + \global\therearesolutionstrue\expandafter\procsoln + \fi + }% + \fi + \eq@b@ddCodeSpecial{\eq@next}% +}% dpsj4 +\let\endsolnexerhook\@empty +\let\pkg@endsolnexerhook\@empty +\let\endsolnexerhookaux\@empty +\def\eq@fititin#1{\noindent\unskip\nobreak\hfill\penalty100 + \hskip1em\hbox{}\nobreak\hfill#1}% +\let\eqfititin\eq@fititin +\bgroup\catcode`\%=12\relax +\gdef\eq@commentchar{%}\egroup +\newcommand\eqExerSolnTrailer{% + \protect\ReturnTo{page.\the\c@page}% + {\protect\mbox{\if\exerstar*\exrtnlabelformatwp\else + \exrtnlabelformat\fi}}% + \protect\endeqEXt\ifeqforpaper\protect\par{\belowexsolnskip}\fi + \eq@commentchar^^J% + \ifmakeExSlLocal\protect\endgroup^^J\fi +} +\let\eq@e@ddCodeSpecialDef\relax % dpsj4 +\let\eq@e@ddCodeSpecial\eq@e@ddCodeSpecialDef % dpsj6 +\let\kdvsp@Restore\relax +\def\eq@clearMrkCpy{\if@targetforextr + \global\let\eqMrkCpyArg\@empty + \global\@targetforextrfalse\fi +} +\def\endsolnexer@woparts{\endprocsoln\eq@e@ddCodeSpecial + \pkg@endsolnexerhook + \eq@clearMrkCpy + \ifeq@solutionsafter\else + \expandafter\endgroup\fi % from \begingroup at \solnexer@@@woparts + \global\let\exsolnonceonlytophook\relax + \ifx\sameVspace\@empty\gdef\sameVspace{0pt}\fi + \ifvspacewithsolns\vspaceFmt{\sameVspace}\else + \ifeq@nosolutions\ifeq@solutionsafter\else + \vspaceFmt{\sameVspace}\fi\fi\fi + \if\currhideopt H% + \ifkeepdeclaredvspacing\vskip\sameVspace\fi + \else + \ifeq@solutionsafter + \ifx\isitleadin\eq@YES\parshape=0 \fi + \if\exerstar*% + \eq@fititin{\mbox{\exrtnlabelformatwp}}\else + \eq@fititin{\mbox{\exrtnlabelformat}}\fi + \ifx\istabularexer\eq@YES\unskip\kern0pt\else\par\fi + \ifx\minVspacet@bs\@empty + \ifkeepdeclaredvspacing + \@tempdima\pagetotal + \advance\@tempdima-\eq@startSoln + \@tempdimb\sameVspace\relax + \ifdim\@tempdimb>1sp\relax + \advance\@tempdimb-\@tempdima + \ifdim\@tempdimb>0pt\vglue\@tempdimb\kern0pt + \let\eqe@showEndHere\@gobble + \edef\tmp@exp{\noexpand\marginpar{\noexpand + \smash{e: adj \the\@tempdimb}}}% + \eqe@debugVertSkip{\tmp@exp}% + \fi + \fi + \fi + \eqe@showEndHere{\eqe@debugVertSkip{\marginpar{\smash{e}}}}% + \fi + \else + \eq@ckglobalhide + \ifeq@hidesolution\else + \endsolnexerhookaux + \writeT@ExSolns{\eqExerSolnTrailer}% + \fi + \fi + \fi + \kdvsp@Restore + \endsolnexerhook\penalty0\relax} +\let\eq@exerstarEnv\relax +\newenvironment{exercise*}{\def\eq@exerstarEnv{*}\exercise} +{\endexercise} +\def\exerwparts@cols{0} +\let\topofpartshook\relax +\let\@listiiredefined\eq@NO +\let\itsExerParts\eq@NO +\newif\if@tableadinitem\@tableadinitemfalse +\newcommand{\tableadin@external}{\PackageError{exerquiz/eqexam} + {The \string\tableadin\space command is designed\MessageBreak + for the problem* environment of eqexam}{Use \string\tableadin\space + in the problem* environment of eqexam.}% +} +\let\tableadin\tableadin@external +\newcommand{\eq@tableadinparts}{\item\relax + \PackageError{exerquiz/eqexam}{The \string\tableadin\space + command is not allowed in the\MessageBreak + parts environment}{Use \string\tableadin\space + in the problem* environment of eqexam.}% +} +\let\istabularexer\eq@NO +\def\exercise@parts{\let\rlspar\relax + \ifx\solutionparshape\@empty + \let\isitleadin\eq@NO + \if@tableadinitem\let\rlspar\@gobbletwo\fi + \else\let\isitleadin\eq@YES\fi + \rlspar\removelastskip\par + \if\isitleadin\eq@YES + \def\eqparts@topsep{0pt}% + \vskip\eqparts@itemsep\relax\fi + \topofpartshook + \let\itsExerParts\eq@YES + \global\let\@listiiredefined\eq@NO + \def\exerwparts@cols{0}\@ifnextchar[% + {% + \if@tableadinitem\else\removelastparskip\fi + \let\endparts\endexercise@parts@tabular\exercise@parts@tabular@}% + {\let\endparts\endexercise@parts@list\exercise@parts@list}} +\def\eq@extralabelsep{0pt} +\newcommand{\setPartsWidth}[1]{\def\parts@indent{\normalfont#1}% + \bgroup\settowidth{\eq@tmpdima}{\parts@indent}% + \xdef\widthOfParts{\the\eq@tmpdima}\egroup} +\setPartsWidth{(d)} +\def\eqe@prtsepPrb{\ } +\providecommand{\prbPrtsep}[1]{\def\eqe@prtsepPrb{#1}} +\providecommand{\exPrtsep}[1]{\def\eqe@prtsepPrb{#1}} +\providecommand{\eqequesparsep}[1]{\def\eqeques@parsep{#1}} +\eqequesparsep{0pt} +\let\prior@parts@hook\@empty +\let\post@parts@hook\@empty +\let\abovepartshook\@empty +\let\belowpartshook\@empty +\let\eqp@rtc@lcm@rk\relax +\let\eq@insertContAnnot\relax +\def\eq@item@common{\eq@insertContAnnot\eqp@rtc@lcm@rk + \def\currhideopt{x}\eq@hidesolutionfalse\eq@nolinkfalse + \@ifnextchar[{\@ckhide}{\eq@item}} +\newcommand{\partsitemsep}[1]{{% + \setlength{\@tempdima}{#1}% + \xdef\eqparts@itemsep{\the\@tempdima}}} +\let\eqpartsitemsep\partsitemsep +\def\eqparts@itemsep{0pt} +\newcommand\partsparsep[1]{{% + \setlength{\@tempdima}{#1}% + \xdef\eqparts@parsep{\the\@tempdima}}} +\def\eqparts@parsep{0pt} +\newcommand\partstopsep[1]{{% + \setlength{\@tempdima}{#1}% + \xdef\eqparts@topsep{\the\@tempdima}}} +\def\eqparts@topsep{3pt} +\newcommand{\leadinitem@external}{\PackageError{exerquiz/eqexam} + {The \string\leadinitem\space command is designed to be\MessageBreak + the first item in the problem*\MessageBreak + environment above the parts environment} + {Use \string\leadinitem\space in the problem* environment.}} +\let\leadinitem\leadinitem@external +\let\itsforleadinitem\eq@NO +\newcommand{\eq@leadinitemparts}{\item\relax + \PackageError{exerquiz/eqexam}{The \string\leadinitem\space + command is not allowed in the\MessageBreak + parts environment} + {Use \string\leadinitem\space in the problem* environment.}} +\def\eq@handleOptArg[#1]{\def\eq@optArg{[#1]}\eq@handleOptArgi} +\def\eq@handleOptArgi{\expandafter + \eq@item@latex\eq@optArg\exlisttabheaderafterhook} +\newif\ifwithinparts +\let\ex@listtabheader@fterhook\@empty +\newenvironment{exercise@parts@list}{% + \settowidth{\eq@tmplength}{\parts@indent}% + \edef\widthOfParts{\the\eq@tmplength}% + \global\let\eqExerSolnHeader\eq@@writeexheaderlist + \eq@initializeContAnnot\eq@nolinkfalse\prior@parts@hook + \abovepartshook\list{\normalfont + \if\Hidesymbol h\eq@nolinkfalse\ifeq@solutionsafter + \eq@nolinktrue\fi\fi + \if\currhideopt H% + \else + \ifeq@solutionsafter + \eq@nolinktrue % no link to solution + \else + \ifeq@nosolutions + \eq@nolinktrue % no link to solution + \else + \eq@ckglobalhide + \ifeq@hidesolution\eq@nolinktrue\else + \global\let\eqExerSolnHeader\eq@@writeexheaderlist + \fi + \fi + \fi + \fi + \makebox[\widthOfParts][r]{\eqexlisttabheader}% +}{% + \usecounter{partno}% + \if\isitleadin\eq@YES + \settowidth{\eq@tmplength}{\parts@indent\eqe@prtsepPrb}% + \xdef\prtsIndntSep{\the\eq@tmplength}% + \if\itsforleadinitem\eqe@YES\setcounter{partno}{\fliPartNo}\else + \setcounter{partno}{1}\fi\fi + \let\leadinitem\eq@leadinitemparts + \let\tableadin\eq@tableadinparts + \global\let\solutionparshape\@empty + \setlength{\topsep}{\eqparts@topsep}% + \setlength{\parskip}{0pt}% + \setlength{\partopsep}{0pt plus 1pt minus 1pt}% + \ifdim\eqeques@parsep=0pt + \setlength{\parsep}{\eqparts@parsep}% + \else + \setlength{\parsep}{\eqeques@parsep}% + \fi + \setlength{\itemsep}{\eqparts@itemsep-\parsep}% + \setlength{\itemindent}{0pt}% + \setlength{\listparindent}{\parindent}% + \settowidth{\labelsep}{\normalfont\eqe@prtsepPrb}% + \addtolength{\labelsep}{\eq@extralabelsep}% + \settowidth{\labelwidth}{\parts@indent}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \let\eq@item@latex\item + \def\eq@item{\@ifnextchar[{\eq@handleOptArg} + {\eq@item@latex\ex@listtabheader@fterhook + \exlisttabheaderafterhook}}% + \def\eqthisenv{parts}\withinpartstrue + \def\item{\ifx\@currenvir\eqthisenv + \def\eq@next{\eq@item@common}\else + \def\eq@next{\eq@item}\fi + \eq@next}% +}}{\endlist\global\let\leadinitem\leadinitem@external + \post@parts@hook\belowpartshook} +\def\eq@initializeContAnnot{\@ifundefined{eqequestions} + {\global\let\eqeCurrProb\relax} + {\xdef\eqeCurrProb{\theeqquestionnoi}}% + \xdef\eq@currProbStartPage{\arabic{page}}} +\define@key{tabp@rts}{nCols}{\def\exerwparts@cols{#1}} +\define@key{tabp@rts}{minVspace}{\def\minVspacet@bs{#1}} +\let\minVspacet@bs\@empty +\def\minVspacetabs#1{\def\minVspacet@bs{#1}} +\def\priorexsolafterTab{\ifkeepdeclaredvspacing + \ifeq@solutionsafter\ifx\minVspacet@bs\@empty\else + \priorexsolafterTab@cont\fi\fi\fi} +\def\priorexsolafterTab@cont{\let\exsolafter@save\exsolafter + \let\exsolafter\@empty + \makebox[0pt][r]{\parbox[t][\minVspacet@bs][t]{0pt} + {\strut\hfill\vfill\strut}}% + \minipage[t]{\linewidth}\exsolafter@save} +\def\pkg@endsolnexerhook{\ifkeepdeclaredvspacing + \ifeq@solutionsafter\ifx\minVspacet@bs\@empty\else + \endminipage\fi\fi\fi} +\def\exercise@parts@tabular@[#1]{% + \inittabMark + \let\eq@insertContAnnot\relax + \let\exerwparts@cols\@empty + \setkeys*{tabp@rts}{#1}\ifx\exerwparts@cols\@empty + \edef\exerwparts@cols{\XKV@rm}\fi + \ifx\minVspacet@bs\@empty\keepdeclaredvspacingfalse\fi + \let\istabularexer\eq@YES + \@tempcnta\exerwparts@cols\relax + \ifnum\@tempcnta<2\relax + \PackageError{exerquiz}{% + The number of columns for parts\MessageBreak + needs to be an integer greater than 1} + {Enter an integer, 2 or larger}\fi + \exercise@parts@tabular} +\newcount\eq@extabColCnt +\def\autotabOn{\let\eq@tabMarkChk\relax% + \PackageInfo{exerquiz/eqexam}{Executing \string\autotabOn}} +\def\autotabOff{\let\eq@tabMarkChk\@gobble + \PackageInfo{exerquiz/eqexam}{Executing \string\autotabOff}} +\autotabOff +\def\inittabMark{\global\eq@extabColCnt=0 } +\def\resettabMark{\global\eq@extabColCnt=1 } +\newcommand\autotabnewline[1][\eqparts@tabrowsep]{% + \ifnum\exerwparts@cols>0\relax + \ifx\eq@tabMarkChk\@gobble + \def\eq@atnext{\expandafter + \tabularnewline\expandafter[#1]}\else + \def\eq@atnext{\resettabMark\tabularnewline + \noalign{\expandafter\kern#1}}\fi + \expandafter\eq@atnext\fi} +\def\eq@tabMark{% + \ifnum\eq@extabColCnt=0\relax + \global\advance\eq@extabColCnt1\relax + \let\eq@next\relax + \else + \ifnum\eq@extabColCnt=1\relax + \let\eq@next\relax + \else + \ifnum\eq@extabColCnt>\exerwparts@cols + \let\eq@next\autotabnewline + \else\def\eq@next{&}\fi + \fi + \fi + \eq@next + \global\advance\eq@extabColCnt1\relax} +\newcommand\partstabcolsep[1]{\def\eq@partstabcolsep{#1}} +\partstabcolsep{1.5pt} +\newcommand\partstabtopsep[1]{\def\eq@partstabtopsep{#1}} +\partstabtopsep{3pt} +\def\eq@vpartstabtopsep{\vskip\eq@partstabtopsep\relax} +\newcommand\partstabrowsep[1]{\setlength{\@tempdima}{#1}% + \edef\eqparts@tabrowsep{\the\@tempdima}} +\partstabrowsep{0pt} +\newenvironment{exercise@parts@tabular}{% + \setcounter{partno}{0}% + \global\let\eqExerSolnHeader\eq@@writeexheaderlist + \def\tablrIndent{\hglue\prtsIndntSep\relax}% + \if\isitleadin\eq@YES + \if$\the\everypar$\let\tablrIndent\relax\fi + \setcounter{partno}{1}\fi + \let\leadinitem\eq@leadinitemparts + \let\tableadin\eq@tableadinparts + \global\let\solutionparshape\@empty + \settowidth{\eq@tmplength}{\parts@indent\eqe@prtsepPrb}% + \xdef\prtsIndntSep{\the\eq@tmplength}% + \sbox{\eq@tmpbox}{\parts@indent}% + \let\eq@item@latex\item + \let\eq@item\item@part@tabular + \def\eqthisenv{parts}\withinpartstrue + \def\item{\ifx\@currenvir\eqthisenv + \def\eq@next{\eq@tabMarkChk\eq@tabMark\eq@item@common}\else + \def\eq@next{\eq@item@latex}\fi + \eq@next}\eq@nolinkfalse + \@ifundefined{@xtabularcr}{\let\@xarraycr\eq@xtabularcr} + {\let\@xtabularcr\eq@xtabularcr}% + \eq@tmpdima=\linewidth + \advance\eq@tmpdima-\prtsIndntSep\relax + \@tempcnta\exerwparts@cols\relax + \advance\@tempcnta-1\relax + \multiply\@tempcnta2\relax + \@tempdima\prtsIndntSep\relax + \divide\@tempdima 2\relax + \edef\halfWidth{\the\@tempdima}% + \advance\@tempdima\eq@partstabcolsep\relax + \tabcolsep\@tempdima + \multiply\@tempdima\@tempcnta + \advance\eq@tmpdima-\@tempdima + \divide\eq@tmpdima by\exerwparts@cols\relax %dpsj3 + \edef\widthOfPartsBox{\the\eq@tmpdima}% dpsj2 + \if@tableadinitem\else\vskip\eq@partstabtopsep\relax\fi + \noindent\normalbaselines\kern0pt + \prior@parts@hook\abovepartshook + \tablrIndent\tabular[t]{@{}*{\exerwparts@cols}{>{\setTabulrSolnEnv + \parskip\eqeques@parsep\relax + \parindent0pt\relax\strut}p{\eq@tmpdima}}@{\hidewidth}}% +}{\endtabular\kern0pt + \@ifundefined{@listii@SAVE}{}{\global\let\@listii\@listii@SAVE + \global\let\@listii@SAVE\relax}% + \post@parts@hook\belowpartshook + \aftergroup\eqe@innermarkpts + \aftergroup\eq@vpartstabtopsep} +\let\eqe@innermarkpts\relax +\def\item@part@tabular{\refstepcounter{partno}% + \ifeq@solutionsafter + \eq@nolinktrue % no link to solution + \else\ifeq@nosolutions + \eq@nolinktrue % no link to solution + \else + \eq@ckglobalhide + \ifeq@hidesolution\eq@nolinktrue\else + \gdef\eqExerSolnHeader{\eq@@writeexheaderlist}% + \fi\fi\fi + \if@restorejustify\restorejustify\else\PBS\raggedright\fi + \settowidth{\eq@tmplength}{\parts@indent\eqe@prtsepPrb}% + \xdef\prtsIndntSep{\the\eq@tmplength}% + \sbox{\eq@tmpbox}{\parts@indent}% + \eq@tmpdima=\wd\eq@tmpbox + \addtolength\eq@tmplength{\eq@extralabelsep}% + \xdef\partshangamount{\the\eq@tmplength}% + \parshape \@ne 0pt \linewidth + \everypar{\parshape \@ne 0pt \linewidth}% + \eq@setPrbSolnAftrIndnt + \makebox[0pt][r]{\eqexlisttabheader\eqe@prtsepPrb}% + \ex@listtabheader@fterhook + \exlisttabheaderafterhook\ignorespaces} +\def\@ckhide[#1]{\edef\eq@arg{#1}% + \def\currhideopt{x}% + \ifx\eq@arg\@empty\else + \if\eq@arg\eq@Hid + \eq@hidesolutiontrue\eq@nolinktrue% + \edef\currhideopt{\Hidesymbol}% + \else + \ifeq@globalshowsolutions\else + \if\eq@arg\eq@hid + \eq@hidesolutiontrue\eq@nolinktrue% + \def\currhideopt{h}% + \fi + \fi + \fi\fi + \eq@item} +\def\tabControlOn{\@ifundefined{@xtabularcr} + {\let\save@@xtabularcr\@xarraycr} + {\let\save@@xtabularcr\@xtabularcr}} +\def\tabControlOff{\@ifundefined{@xtabularcr} + {\let\@xarraycr\save@@xtabularcr} + {\let\@xtabularcr\save@@xtabularcr}} +\AtBeginDocument{\tabControlOn} +\def\eq@xtabularcr{\@ifnextchar[{\save@@xtabularcr} + {\eqe@tab@parts@rowsep}}% +\def\eqe@tab@parts@rowsep{\save@@xtabularcr + \noalign{\expandafter\kern\eqparts@tabrowsep}}% +\let\eqgrii\relax +\let\eqgriii\relax +\def\includeexersolutions{\@ifstar + {\let\resetEXsolns\relax\includeexersolutionsi} + {\def\resetEXsolns{\global\let\include@solutions\relax}% + \includeexersolutionsi}} +\newcommand{\includeexersolutionsi}[1][]{% + \filterFor{#1}\includeexersolutionsii} +\def\includeexersolutionsii{% + \include@solutions + \resetEXsolns + \let\eqFilterArg\@empty +} +\long\def\gobbleToEndEXt#1\endeqEXt{\ifeqforpaper + \expandafter\@gobbletwo\fi} +\newif\if@targetforextr \@targetforextrfalse +\newcommand\filterFor[1]{\def\eqFilterArg{#1}} +\newcommand{\mrkForIns}[1]{\def\eqMrkCpyArg{#1}\global + \@targetforextrtrue\@ifundefined{#1@mfc} + {\global\@namedef{#1@mfc}{}} + {\PackageWarning{exerquiz/eqexam} + {The name '#1' has already been used.\MessageBreak + Please choose another, otherwise results may\MessageBreak + be as unexpected}}\ignorespaces} +\let\eqMrkCpyArg\@empty +\newcommand\inclEXtFilter[2]{\def\eqargii{#2}\ifx\eqargii\eqFilterArg + \else\expandafter\gobbleToEndEXt\fi} +\newcommand\useEXtFilter{\let\eqEXt\inclEXtFilter} +\let\eqsolutionshook\@empty +\let\eq@solutionshook\@empty +\let\priorexsectitle\@empty +\let\priorexslinput\@empty +\def\exerSolnsHeadnToc{\section*{\exsectitle}% + \addcontentsline{toc}{section}{% + \@ifundefined{web@latextoc}{}{% + \ifx\web@latextoc\eq@YES\else + \protect\numberline{}\fi}\exsectitle}} +\@ifpackageloaded{web}{\def\eq@normallheader{\lheader{\rightmark}}} + {\let\eq@normallheader\relax} +\@ifpackageloaded{web}{\def\eq@defaultlheader{\lheader{\aeb@setmarks}}} + {\let\eq@defaultlheader\relax} +\newif\ifExSolutionsSet \ExSolutionsSetfalse +\def\eqExSolFileName{\jobname.sol} +\newcommand{\exerSolnInput} +{% + \@ifundefined{eqe@IWO}{}{\ifsolutionsAtEnd + \eqe@IWO\@auxout{\string\expandafter\string\gdef + \string\csname\space eqExamQuesLastPage\string\endcsname + {\arabic{page}}}\fi}\let\webnewpage\relax + \ifsolutionsonly\else + \bgroup\OKToWriteExamDatatrue + \writeT@ExSolns{\string\endinput}\egroup + \immediate\closeout\ex@solns\fi + \ifeq@nosolutions\else + \iftherearesolutions + \ifsolutionsonly\eq@solutionshook + \eqsolutionshook + \else + \newpage\eq@solutionshook + \eqsolutionshook\markright{}\eq@normallheader + \fi + \markright{\exsectitle}% + \ifx\webnewpage\relax + \def\webnewpage{\global\let\webnewpage\newpage}\fi + \priorexsectitle\exerSolnsHeadnToc\priorexslinput + \InputIfFileExists{\eqExSolFileName} + {\global\ExSolutionsSettrue}{\PackageWarning{exerquiz} + {!!! Solutions to exercises not found}}% + \global\ExSolutionsSetfalse + \newpage\eq@defaultlheader + \fi + \fi +} +\def\include@solutions{% + \exerSolnInput +} +\newcommand{\prior@questionsHook}{} +\let\qMark@Hook\@empty +\let\aebtitleQuiz\@empty +\newcommand{\post@questionsHook}{} +\newcommand{\quesNumColor}[1]{\def\eq@quesNumCol{#1}} +\quesNumColor{blue} +\renewcommand{\theeqquestionnoi}{\arabic{eqquestionnoi}} +\newcommand{\labeleqquestionnoi}{% + \color{\eq@quesNumCol}\bfseries\theeqquestionnoi.} +\renewcommand\theeqquestionnoii{(\alph{eqquestionnoii})} +\newcommand{\labeleqquestionnoii}{% + \color{\eq@quesNumCol}\bfseries\theeqquestionnoii} +\renewcommand\theeqquestionnoiii{(\roman{eqquestionnoiii})} +\newcommand{\labeleqquestionnoiii}{% + \color{\eq@quesNumCol}\bfseries\theeqquestionnoiii} +\define@key{props@ques}{labelwidthTo}% + [\normalsize\normalfont\bfseries00.]% + {\def\propQ@labelwidthTo{#1}} +\define@key{props@ques}{labelwidth}[]{\def\propQ@labelwidth{#1}} +\let\propQ@labelwidth\@empty +\define@key{props@ques}{topsep}[\the\topsep]{\edef\propQ@topsep{#1}} +\define@key{props@ques}{partopsep}[\the\partopsep]% + {\edef\propQ@partopsep{#1}} +\define@key{props@ques}{parsep}[\the\parsep]{\edef\propQ@parsep{#1}} +\define@key{props@ques}{itemsep}[\the\itemsep]{\edef\propQ@itemsep{#1}} +\define@key{props@ques}{labelsepTo}[\normalsize\normalfont\ ]% + {\def\propQ@labelsepTo{#1}} +\define@key{props@ques}{labelsep}[\@empty]{\def\propQ@labelsep{#1}} +\let\propQ@labelsep\@empty +\define@key{props@ques}{color}[blue]{\quesNumColor{#1}} +\setkeys{props@ques}{labelwidthTo,topsep,partopsep,parsep,% + itemsep,labelsepTo,color}% +\newenvironment{questions}[1][] +{% + \ifnum\@eqquestiondepth>\tw@\@toodeep\else + \advance\@eqquestiondepth\@ne\fi + \def\@quesctr{eqquestionno\romannumeral\the\@eqquestiondepth}% + \toks@=\expandafter\expandafter\expandafter{#1}\expandafter + \xdef\csname quesOpts\@quesctr\endcsname{\the\toks@}% + \edef\tempexp{\noexpand\setkeys{props@ques}{\the\toks@}}\tempexp + \list{\qMark@Hook\prior@questionsHook\gdef\eqPTs{1}% + \global\let\eqQT\eq@na% + {\@tempcnta=0 \let\@thispr@b\@empty + \@whilenum\@tempcnta<\@eqquestiondepth\do{\advance\@tempcnta\@ne + \ifx\@thispr@b\@empty\edef\@thispr@b{% + \csname theeqquestionno\romannumeral\the\@tempcnta\endcsname}\else + \edef\@thispr@b{\@thispr@b% + \csname theeqquestionno\romannumeral\the\@tempcnta\endcsname}\fi + }\xdef\@currentQues{\@thispr@b}}% + \makebox[\labelwidth][r]{\normalfont\@nameuse{label\@quesctr}}% + \xdef\eq@pageThisQ{\the\c@page}% + \post@questionsHook}{\usecounter{\@quesctr}% + \ifx\propQ@labelsep\@empty + \settowidth{\labelsep}{\propQ@labelsepTo}\else + \setlength{\labelsep}{\propQ@labelsep}\fi + \ifx\propQ@labelwidth\@empty + \settowidth{\labelwidth}% + {\propQ@labelwidthTo\hspace{\labelsep}}\else + \settowidth{\labelwidth}{\hspace{\propQ@labelwidth}% + \hspace{\labelsep}}\fi + \setlength{\topsep}{\propQ@topsep}% + \setlength{\partopsep}{\propQ@partopsep}% + \ifdim\parskip>\z@\addtolength{\topsep}{-\parskip}\fi + \setlength{\parsep}{\propQ@parsep}% + \setlength{\itemsep}{\propQ@itemsep}% + \setlength{\itemindent}{0pt}% + \setlength{\leftmargin}{\labelwidth}% + }% +}{\endlist} +\def\pushquestions{\expandafter\xdef\csname save\@quesctr\endcsname + {\expandafter\the\csname c@\@quesctr\endcsname}\end{questions}} +\def\popquestions{% + \begin{questions}[\csname quesOpts\@quesctr\endcsname]% + \setcounter{\@quesctr}{\csname save\@quesctr\endcsname}% + \@ifnextchar\popquestions{\item[]}{\@ifnextchar\begin{\item[]}{}}} +\newcommand{\priorsqhook}[1]{\def\sq@priorhook{#1}} +\priorsqhook{} +\newcommand{\abovesqskip}[1]{\def\sq@aboveskip{#1}} +\abovesqskip{\par\medskip} +\long\def\endsqhook#1{\def\sq@afterhook{#1}} +\endsqhook{} +\def\@shortquizCnt{0} +\def\@sqGenBaseName{eqSqBn\@shortquizCnt} +\let\sqhspace\space +\let\ListOfSQuizNames\@empty +\newenvironment{shortquiz} +{% + \xdef\eq@pageThisQ{\the\c@page}% + \let\@currentQues\@empty + {\count0=\@shortquizCnt \advance\count0by1\relax + \xdef\@shortquizCnt{\the\count0}}% + \goodbreak\@ifstar{\sqForms\@shortquiz}% + {\if\aeb@FLOverride\eq@f\def\sqstar{*}\else + \def\sqstar{}\sqLinks\fi\@shortquiz}% +}{\aeb@endshortquiz} +\newenvironment{shortquiz*} +{% + \xdef\eq@pageThisQ{\the\c@page}% + {\count0=\@shortquizCnt\advance\count0by1\relax + \xdef\@shortquizCnt{\the\count0 }}% + \sqForms\@shortquiz +}{\aeb@endshortquiz} +\def\@shortquiz{\@ifnextchar[% + {\@@shortquiz}{\@@shortquiz[\@sqGenBaseName]}} +\def\sq@setCLN#1{\ifx\aebTitleQuiz\@empty + \protected@edef\@currentlabelname{#1}\else + \protected@edef\@currentlabelname{\@currentlabelname}\fi +} +\let\isQZ=q \let\isSQZ=s +\let\eqQuizType\relax +\def\@@shortquiz[#1]{%\begingroup + \gdef\oField{#1}\gdef\curr@quiz{#1}\gdef\currQuiz{#1}% + \edef\tmp@Exp{\noexpand\g@addto@macro\noexpand + \ListOfSQuizNames{,#1}}\tmp@Exp + \global\let\eqQzQuesList\@empty + \let\eq@AddProbToQzQuesList\relax + \edef\@currentlabel{\@shortquizCnt}% + \edef\@currentHref{shortquiz.\@shortquizCnt}% + \global\let\eqQuizType\isSQZ\let\@qzsolndest\@empty + \if\sqstar*\relax + \let\@Ans\Ans@sq@f + \ifx\oField\@empty + \typeout{^^JExerquiz: Base field name required when using + shortquiz with '*' option}% + \PackageInfo{exerquiz}{Assuming link style^^J}% + \let\@Ans\Ans@sq@l + \fi + \else + \let\@Ans\Ans@sq@l + \fi + \setcounter{questionno}{0}% + \let\answers\answers@sq + \let\endanswers\endanswers@sq + \let\manswers\manswers@sq + \let\endmanswers\endmanswers@sq + \let\solution\solution@sq + \let\endsolution\endsolution@sq + \sq@aboveskip\sq@priorhook\ignorespaces +} +\newcommand\belowsqskip[1]{\def\aftershortquizskip{#1}} +\belowsqskip{\medskip} +\def\aeb@endshortquiz{\setcounter{quizno}{0}% + \sq@afterhook + \global\let\sqlabel\eq@sqlabel + \global\let\sqslrtnlabel\eq@sqslrtnlabel + \global\let\sqsllabel\eq@sqsllabel + \par\aftershortquizskip +} +\def\sqLinks{\def\sqstar{}}\sqLinks +\def\sqForms{\def\sqstar{*}} +\let\eq@tq@star\relax +\def\qzPriorSolutionAfterHook{\smallskip} +\let\sqPostHeaderHook\@empty +\let\qPostHeaderHook\@empty +\let\eq@sqPostHeaderHook\@empty +\let\eq@qPostHeaderHook\@empty +\let\prior@eqQt\@empty +\let\prior@eqSQt\@empty +\def\sqsolafterhspace{\space} +\newif\ifmakeQzSlLocal \makeQzSlLocalfalse +\def\makeQzSolnsLocalOn{\makeQzSlLocaltrue} +\def\makeQzSolnsLocalOff{\makeQzSlLocalfalse} +\def\solution@sq{\let\eq@next\relax + \ifx\@qzsolndest\@empty + \PackageWarning{exerquiz}% + {* Solutions unexpected here, will *\MessageBreak + * assume solutionsafter option *}% + \eq@solutionsaftertrue + \fi + \ifeq@solutionsafter + \par\qzPriorSolutionAfterHook\noindent + \if!\sqsolafter!\else + \sqsolafter\sqsolafterhspace\fi\ignorespaces + \else + \global\therearequizsolutionstrue\let\verbatim@out\quiz@solns + \set@display@protect + \immediate\write\verbatim@out{% + \ifmakeQzSlLocal\protect\begingroup^^J\fi + \if\eqQuizType\isQZ + \ifx\prior@eqQt\@empty\else\prior@eqQt\fi + \ifx\eqMrkCpyArg\@empty\else + \protect\eqMrkSoln{\eqMrkCpyArg}\fi + \protect\eqQt{\eqFilterArg}\else + \ifx\prior@eqSQt\@empty\else\prior@eqSQt\fi + \ifx\eqMrkCpyArg\@empty\else + \protect\eqMrkSoln{\eqMrkCpyArg}\fi + \protect\eqSQt{\eqFilterArg}\fi + \protect\quizSolnHeader\if\eqQuizType\isQZ\ifx\allow@peek\eq@NO + [{\curr@quiz}{\currQuizStartPage}]\fi\fi + {\@qzsolndest}{\sqsllabel}\protect\eqterminex + \if\eqQuizType\isQZ\expandafter\eq@qPostHeaderHook + \expandafter\qPostHeaderHook\else + \expandafter\eq@sqPostHeaderHook + \expandafter\sqPostHeaderHook\fi}% + \set@typeset@protect + \expandafter\verbatimwrite\fi +} +\let\qzSolutionsAfterHook\@empty +\def\endsolution@sq +{% + \ifeq@solutionsafter + \eq@fititin{\mbox{\sqslrtnlabel}}\par\qzSolutionsAfterHook + \aftergroup\ignorespaces + \else + \endverbatimwrite + \eq@clearMrkCpy + \ifx\@qzsolndest\@empty\else\set@display@protect + \immediate\write\verbatim@out{\eqSqSolnTrailer}% + \set@typeset@protect + \fi + \fi + \global\let\@qzsolndest\@empty +} +\def\fpAfterSolutionsSkip{\par\medskip} +\let\eqSqSolnTrailerHook\@empty +\let\eqQzSolnTrailerHook\@empty +\newcommand\eqSqSolnTrailer{% + \if\eqQuizType\isQZ + \eqQzSolnTrailerHook + \protect\ReturnTo{page.\eq@pageThisQ}% + {\protect\mbox{\sqslrtnlabel}}\string\endeqQt + \else + \eqSqSolnTrailerHook + \protect\ReturnTo{page.\eq@pageThisQ}% + {\protect\mbox{\sqslrtnlabel}}\string\endeqSQt% + \fi + \ifeqforpaper\protect\fpAfterSolutionsSkip\fi^^J% + \ifmakeQzSlLocal\protect\endgroup^^J\fi +} +\let\eqSQt\@gobble +\let\endeqSQt\relax +\let\eqQt\@gobble +\let\endeqQt\relax +\let\prior@quizSolnHeaderHook\@empty +\newcommand\quizSolnHeader[3][]{% + \prior@quizSolnHeaderHook + \ifeqforpaper\else\webnewpage\fi\noindent + #2% + \solnspace +} +\newif\iftherearequizsolutions \therearequizsolutionsfalse +\let\aeb@FLOverride\relax +\def\includequizsolutions{\@ifstar + {\let\resetQZtsolns\relax\includequizsolutionsi} + {\def\resetQZtsolns{\global\let\include@quizsolutions\relax}% + \includequizsolutionsi}} +\newcommand{\includequizsolutionsi}[1][]{% + \filterFor{#1}\includequizsolutionsii} +\def\includequizsolutionsii{\include@quizsolutions + \resetQZtsolns + \let\eqFilterArg\@empty} +\newcommand\useForms{\def\aeb@FLOverride{f}} +\newcommand\useLinks{\def\aeb@FLOverride{l}} +\newcommand\restoreFLTypeDefault{\global\let\aeb@FLOverride\relax} +\let\aeb@FLOverride\relax +\let\aebtitleQuiz\@empty +\let\aebTitleQuiz\@empty +\def\pushEnvir{\xdef\eq@currenvir{\@currenvir}\endgroup} +\def\popEnvir{\begingroup\@endpefalse + \edef\@currenvir{\eq@currenvir}% + \edef\@currenvline{\on@line}% +} +\def\answers@sq{\parindent0pt + \ifx\solutionparshape\@empty\else + \pushEnvir\par\noindent\expandafter\popEnvir\fi + \stepcounter{questionno}% + \if\sqstar*\relax + \if\aeb@FLOverride\eq@l + \let\@Ans\Ans@sq@l\else + \let\@Ans\Ans@sq@f\fi + \else + \if\aeb@FLOverride\eq@f + \let\@Ans\Ans@sq@f\else + \let\@Ans\Ans@sq@l\fi + \fi + \def\aeb@answerType{r}\@ifnextchar[{\answers@@sq}% + {\@ifstar{\answers@@sq[\curr@quiz.\thequestionno]}{\answers@@sq[]}}} +\def\manswers@sq{\parindent0pt + \@ifundefined{ifuserectforms}{} + {\if\aeb@FLOverride\eq@f\ifuserectforms + \useRectForMC\else\useCircForMC\fi\fi}% + \ifx\solutionparshape\@empty\else + \pushEnvir\par\noindent\expandafter\popEnvir\fi + \stepcounter{questionno}% + \if\sqstar*\relax + \if\aeb@FLOverride\eq@l + \let\@Ans\Ans@ck@sq@l\else + \let\@Ans\Ans@ck@sq@f\fi + \else + \if\aeb@FLOverride\eq@f + \let\@Ans\Ans@ck@sq@f\else + \let\@Ans\Ans@ck@sq@l\fi + \fi + \def\aeb@answerType{c}\@ifnextchar[{\answers@@sq}% + {\@ifstar{\answers@@sq[\curr@quiz.\thequestionno]}{\answers@@sq[]}}} +\let\sq@hwdest\@empty % hard-wired destination +\def\answers@@sq[#1]#2{% + \xdef\aeb@numCols{#2}% + \ifx\sq@hwdest\@empty + \xdef\@qzsolndest{#1}\else + \gdef\@qzsolndest{\sq@hwdest}\fi + \if\aeb@numCols1\gdef\eq@listType{1}\expandafter\answers@sq@list + \else + \gdef\eq@listType{0}\expandafter\answers@@sq@tabular + \fi{\aeb@numCols}} +\def\setMClabelsepDefault#1{\def\eq@hspanner@default{#1}} +\def\setMClabelsep#1{\def\eq@hspanner{#1}} +\setMClabelsep{\ }\setMClabelsepDefault{\ } +\def\resetMClabelsep{\expandafter\setMClabelsep\expandafter + {\eq@hspanner@default}} +\def\eq@lw@l{\eq@l@l\eq@hspanner} +\def\eq@l@l{\normalsize\normalfont(d)} +\def\eq@lw@f{\kern\RadioFieldSize\eq@hspanner} +\@ifundefined{ifwithinsoldoc}{\newif\ifwithinsoldoc\withinsoldocfalse}{} +\@ifundefined{ifwithinqsldoc}{\newif\ifwithinqsldoc\withinqsldocfalse}{} +\let\eq@ansChoiceArray\@empty +\def\eq@recordAnsChoice{% + \ifx\eq@ansChoiceArray\@empty + \edef\tmp@exp{\noexpand\g@addto@macro + \noexpand\eq@ansChoiceArray{"\alph{quizno}"}}\else + \edef\tmp@exp{\noexpand\g@addto@macro + \noexpand\eq@ansChoiceArray{,"\alph{quizno}"}}\fi + \tmp@exp} +\newcommand\Ans@list[2][0]{\gdef\eq@pPTs{#1}\xdef\Ans@choice{#2}% + \item\relax\noindent\if\eq@listType\eq@One + \addtocounter{quizno}{-1}\@ifundefined{ifwithinsoldoc} + {\refstepcounter{quizno}}{\ifwithinsoldoc\stepcounter{quizno}\else + \refstepcounter{quizno}\fi}\fi + \ignorespaces} +\newenvironment{answers@sq@list}[1]{% + \ifx\aeb@answerType\eq@r + \let\endanswers\endanswers@sq@list\else + \let\endmanswers\endanswers@sq@list\fi + \list{\strut\@Ans}{% + \if\sqstar*\relax + \settowidth{\labelwidth}{\eq@lw@f}\else + \settowidth{\labelwidth}{\eq@lw@l}\fi + \setlength{\topsep}{-\parskip+\aboveanswersSkip}% + \setlength{\parsep}{0pt}\setlength{\itemindent}{0pt}% + \setlength{\itemsep}{0pt}\setlength{\partopsep}{0pt}% + \setlength{\listparindent}{\parindent}% + \ifnum\exerwparts@cols>1\relax + \ifx\itsExerParts\eq@YES + \setlength{\leftmargin}{\labelwidth}\else + \setlength{\leftmargin}{\labelwidth+\eqemargin}\fi + \else + \ifx\solutionparshape\@empty + \setlength{\leftmargin}{\labelwidth}\else + \setlength{\leftmargin}{\labelwidth+\eqemargin}\fi + \fi + \setlength{\labelsep}{0pt}% + \def\Ans{\Ans@list}% + }% list +}{\endlist\setcounter{quizno}{0}\eq@answersEndHook} +\newcommand\Ans@tabular[2][0]{\gdef\eq@pPTs{#1}\xdef\Ans@choice{#2}% + \leavevmode\@Ans +} +\newcommand\sqtabsep[1]{\def\eq@argi{#1}\ifx\eq@argi\@empty + \def\sq@tabsep{1.5pt}\else\def\sq@tabsep{#1}\fi} +\sqtabsep{1.5pt} +\def\sqTabPos#1{\def\sq@TabPos{[#1]}}\sqTabPos{} +\def\answers@@sq@tabular#1{% + \ifinner + \ifx\itsExerParts\eq@YES\par\removelastskip + \removelastparskip\vskip\aboveanswersSkip\fi + \else\par\removelastskip\removelastparskip + \vskip\aboveanswersSkip\fi + \noindent\ifnum\exerwparts@cols>1\relax\parshape=0\fi + \tabcolsep=0pt + \eq@tmpdima=\linewidth + \@tempcnta#1\relax + \advance\@tempcnta-1\relax + \multiply\@tempcnta by2 + \@tempdima\sq@tabsep\relax + \multiply\@tempdima\@tempcnta + \advance\eq@tmpdima-\@tempdima + \divide\eq@tmpdima by#1 + \def\Ans{\Ans@tabular}% + \tabcolsep\sq@tabsep\relax + \expandafter\tabular\sq@TabPos{@{}*{#1}{p{\eq@tmpdima}}@{}}}% +\let\eq@save@doendpe\@doendpe +\def\reset@doendpe#1{\global\eq@scratchtoks=\expandafter{#1}% + \gdef\@doendpe{\par\@endpetrue\global\let\@doendpe\eq@save@doendpe + \def\par{\@restorepar + \expandafter\everypar + \expandafter{\the\eq@scratchtoks}\par\@endpefalse}% + \everypar{{\setbox\z@\lastbox}% + \everypar{}\@endpefalse}\the\eq@scratchtoks + }% +} +\newcommand\answersEndHook[1]{\def\eq@answersEndHook{#1}} +\let\eq@answersEndHook\@empty +\def\endanswers@sq{\endtabular\setcounter{quizno}{0}% + \eq@answersEndHook\reset@doendpe{\the\everypar}% + \ifinner\else%\par + \removelastskip + \vspace{\aboveanswersSkip}\@endpetrue\fi +} +\def\endmanswers@sq{\endtabular\setcounter{quizno}{0}% + \eq@answersEndHook\reset@doendpe{\the\everypar}% + \ifinner\else%\par + \removelastskip + \vspace{\aboveanswersSkip}\@endpetrue\fi +} +\def\popiiictm{\special{CTM: pop pop pop}} +\def\aebChoiceAltFmt{\noexpand\ifaebshowgrayletters + \Alph{quizno}\noexpand\else\linkContentFormat\noexpand\fi} +\def\linkContentFormat{% + \if\probstar*\Alph{quizno}\else\alph{quizno}\fi} +\def\linkContentWrapper{(\hfil\linkContentFormat\hfil)}% +\def\Ans@sq@l{% + \leavevmode\if\eq@listType\eq@One\stepcounter{quizno}\else + \@ifundefined{ifwithinsoldoc}{\refstepcounter{quizno}} + {\ifwithinsoldoc\stepcounter{quizno}\else + \refstepcounter{quizno}\fi}\fi\PBS\raggedright + \settowidth{\eq@tmplength}{\eq@lw@l}\sbox{\eq@tmpbox}{\eq@l@l}% + \eq@tmpdima=\wd\eq@tmpbox + \def\link@@Content{\linkContentWrapper}% + \hangindent=\eq@tmplength\hangafter=1\relax + \Ans@sq@l@driver +\eq@hspanner\ignorespaces} +\let\Ans@ck@sq@l\Ans@sq@l +\let\rbf@Opts\@empty +\def\Ans@sq@f{% + \if\eq@listType\eq@One\stepcounter{quizno}\else + \@ifundefined{ifwithinsoldoc}{\refstepcounter{quizno}} + {\ifwithinsoldoc\stepcounter{quizno}\else + \refstepcounter{quizno}\fi}\fi\PBS\raggedright + \settowidth{\eq@tmplength}{\eq@lw@f}% + \eq@tmpdima=\wd\eq@tmpbox% + \hangindent=\eq@tmplength\hangafter=1\relax + \insertGrayLetters % 6.3d + \Ans@sq@f@driver +\eq@hspanner\ignorespaces} +\let\Ans@ck@sq@f\Ans@sq@f +\newskip\aboveanswersSkip +\setlength\aboveanswersSkip{3pt} +\providecommand\graylettersColor{gray} +\def\insertGrayLetters{\ifaebshowgrayletters + \rlap{\makebox[\RadioFieldSize]% + {\textcolor{\graylettersColor}{\Alph{quizno}}}}\else\relax\fi} +\newcount\eq@tabColCnt +\define@key{bchoice}{nCols}{\def\bChoiceNumCols{#1}} +\@for\eqi:=1,2,3,4,5,6,7,8,9,10 \do{\edef\temp@expand@def{% + \noexpand\define@key{bchoice}{\eqi}[\eqi]{% + \noexpand\def\noexpand\bChoiceNumCols{\eqi}}% + }\temp@expand@def +} +\def\bChoiceNumCols{\aeb@numCols} +\define@key{bchoice}{random}[true]{% + \csname if#1\endcsname\eq@randomizeChoicestrue + \else\eq@randomizeChoicesfalse\fi +} +\define@key{bchoice}{label}[]{\xdef\bChoiceLabel{#1}} +\def\bChoices{\@ifnextchar[{\@ansChoices}{\@ansChoices[\aeb@numCols]}} +\def\@ansChoices[#1]% +{% + \global\let\@tempholdSaveAns\@empty %4/5 + \global\let\@tempholdSaveChoice\@empty %4/5 + \global\let\bChoiceLabel\@empty %4/5 + \setkeys{bchoice}{#1}% + \global\eq@tabColCnt=0 + \ifnum\aeb@numCols=1 % list mode + \def\eq@next{\@layoutListAns}\else % tabular mode + \def\eq@next{\@layoutTabularAns{\bChoiceNumCols}}\fi + \eq@next +} +\let\eChoices\relax +\def\@layoutListAns{\@ifnextchar\Ans{\@getListAns}% + {\@lookforendansChoices{\@layoutListAns}}% +} +\newcommand{\eq@saveAns}[2][]{% + \let\eq@next\@@@SaveAnsGobbleAns + \ifx\bChoiceLabel\@empty\else + \def\eq@savedAnsOpt{#1}\def\eq@savedAnsZO{#2}% + \if\eq@savedAnsZO1 \let\eq@next\@@@SaveAns\fi + \fi\eq@next +} +\long\def\@@@SaveAns#1\eAns{% 4/5 + \g@addto@macro\@tempholdSaveAns{\\{\ignorespaces#1}}% + \addtocounter{quizno}{1}% + \edef\temp@expand{\noexpand\g@addto@macro\noexpand + \@tempholdSaveChoice{% + \noexpand\\{\ifx\sqstar\@empty\aebChoiceAltFmt\else + \ifaebshowgrayletters\Alph{quizno}\else + \linkContentFormat\fi\fi}}}\temp@expand + \addtocounter{quizno}{-1}% +} +\newif\ifoxfordcomma \oxfordcommatrue +\def\oxfordCommaOn{\oxfordcommatrue} +\def\oxfordCommaOff{\oxfordcommafalse} +\def\eq@insertComma{% + \ifx\eq@comma\@empty + \ifnum\@nameuse{NumAns\eq@namearg}>2\relax + \def\eq@comma{,}\fi + \else\ifx\eq@insertAnd\@empty\eq@comma\space + \else\ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}% + \ifoxfordcomma\eq@comma\fi\else\eq@comma\fi\space + \fi + \fi +} +\newcommand\eqAnd{and}\def\eq@insertAnd{% + \ifnum\@nameuse{NumAns\eq@namearg}<2\relax\else + \ifnum\@nameuse{NumAns\eq@namearg}>2\relax + \else\leavevmode\space\fi\eqAnd\space\fi} +\long\def\eq@displayAns#1{\advance\@tempcnta1\relax + \eq@insertComma + \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi#1} +\def\eq@displayAlts#1{\advance\@tempcnta1 + \eq@insertComma + \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi + \savedAltFmt{#1}} +\def\eq@displayAltsAns#1{\advance\@tempcnta1\relax + \eq@insertComma + \ifnum\@tempcnta=\@nameuse{NumAns\eq@namearg}\eq@insertAnd\fi#1} +\newcommand{\savedAltFmt}[1]{(#1)} +\newcommand{\useSavedAns}{\bgroup\@ifstar{\useSavedAns@i} + {\let\eq@insertAnd\@empty\useSavedAns@i}} +\newcommand{\useSavedAns@i}[2][]{\@tempcnta=0\relax + \def\eq@namearg{#2}\let\label\@gobble + \def\eq@argi{#1}\ifx\eq@argi\@empty + \let\eq@comma\@empty + \let\\\eq@displayAns\@nameuse{SavedAns#2}\else + \@nameuse{SavedAns#2-Idx#1}\fi + \egroup +} +\newcommand{\useSavedAlts}{\bgroup\@ifstar{\useSavedAlts@i} + {\let\eq@insertAnd\@empty\useSavedAlts@i}} +\newcommand{\useSavedAlts@i}[2][]{\@tempcnta=0\relax + \def\eq@namearg{#2}\@nameuse{caseFor#2}% + \def\eq@argi{#1}\ifx\eq@argi\@empty + \let\eq@comma\@empty + \let\\\eq@displayAlts\@nameuse{SavedAlts#2}\else + \savedAltFmt{\@nameuse{SavedAlts#2-Idx#1}}\fi + \egroup +} +\newcommand{\useSavedAltsAns}{\bgroup\@ifstar{\useSavedAltsAns@i} + {\let\eq@insertAnd\@empty\useSavedAltsAns@i}} +\newcommand{\useSavedAltsAns@i}[2][]{\@tempcnta=0\relax + \def\eq@namearg{#2}\@nameuse{caseFor#2}\let\label\@gobble + \def\eq@argi{#1}\ifx\eq@argi\@empty + \let\eq@comma\@empty + \let\\\eq@displayAltsAns\@nameuse{SavedAltsAns#2}\else + \savedAltFmt{\@nameuse{SavedAlts#2-Idx#1}} + \@nameuse{SavedAns#2-Idx#1}\fi + \egroup +} +\newcommand{\useSavedNumAns}[1]{\@nameuse{NumAns#1}} +\long\def\@@@SaveAnsGobbleAns#1\eAns{} % 4/5 +\long\def\@getListAns\Ans#1\eAns{%\@@par %start new paragraph + \eq@saveAns#1\eAns % 4/5 + \Ans#1\vspace{\@rowskip}% + \@layoutListAns +} +\long\def\@lookforendansChoices#1{% + \@ifnextchar\eChoices{\rowsep{\rowsep@default}% + \expandafter\@findendans\@gobble}{\expandafter#1\@gobble}% +} +\def\@layoutTabularAns#1{% + \let\eq@tabSep\@empty + \xdef\numShortCols{#1}% + \ifnum#1>\aeb@numCols \xdef\numShortCols{\aeb@numCols}\fi + \@@layoutTabularAns +} +\def\@@layoutTabularAns{% + \@ifnextchar\Ans{\@getTabAns}% + {\@lookforendansChoices{\@@layoutTabularAns}}% +} +\def\rowsep#1{\gdef\@rowsep{[#1]}\gdef\@rowskip{#1}}% +\rowsep{\rowsep@default} +\def\rowsepDefault#1{\def\rowsep@default{#1}} +\def\rowsep@default{0pt} +\long\def\@getTabAns\Ans#1\eAns{% + \eq@saveAns#1\eAns + \global\advance\eq@tabColCnt1 + \let\@save@tabSep=\eq@tabSep + \ifnum\eq@tabColCnt=\numShortCols + \global\eq@tabColCnt=0 + \xdef\eq@tabSep{\noexpand\\\noalign{\kern\@rowskip\relax}}% + \else + \gdef\eq@tabSep{&}% + \fi + \@ifnextchar\eChoices{\@save@tabSep\Ans#1\rowsep{\rowsep@default} + \expandafter\@findendans\@gobble}% + {\@save@tabSep\Ans#1\@@layoutTabularAns}% +} +\def\@findendans{\@ifnextchar\end{% 4/5 + \ifx\bChoiceLabel\@empty\else + \processLabeledAns\fi + }{\expandafter\@findendans\@gobble}}% +\def\defineEachAns#1{\advance\count0by1\relax + \@temptokena={#1}\csarg\xdef + {SavedAns\bChoiceLabel-Idx\the\count0}{\the\@temptokena}% + \ifsolutionsonly\else + {\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAns\bChoiceLabel-Idx\the\count0}% + {\the\@temptokena}}}\fi +} +\def\defineEachChoice#1{\advance\count0by1\relax + \@temptokena={#1}\csarg\xdef + {SavedAlts\bChoiceLabel-Idx\the\count0}% + {\the\@temptokena}\ifsolutionsonly\else + {\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAlts\bChoiceLabel-Idx\the\count0}% + {\the\@temptokena}}}\fi +} +\def\processLabeledAns{% + \bgroup + \let\label\@gobble +\if\aeb@FLOverride\eq@l + \global\@namedef{caseFor\bChoiceLabel}{\graylettersOff}\else + \ifaebshowgrayletters + \global\@namedef{caseFor\bChoiceLabel}{\graylettersOn}\else + \global\@namedef{caseFor\bChoiceLabel}{\graylettersOff}\fi +\fi + \toks@=\expandafter{\@tempholdSaveAns}\csarg + \xdef{SavedAns\bChoiceLabel}{\the\toks@}% + \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAns\bChoiceLabel}{\the\toks@}}}\fi + \count0=0\relax\let\\\defineEachAns\the\toks@ + \xdef\@currNCntAns{\the\count0 }\csarg + \xdef{NumAns\bChoiceLabel}{\@currNCntAns}% + \ifsolutionsonly\else{\eq@IWDefs{\string + \csarg\string\gdef{NumAns\bChoiceLabel}{\the\count0 }}}\fi + \toks@=\expandafter{\@tempholdSaveChoice}\csarg + \xdef{SavedAlts\bChoiceLabel}{\the\toks@}% + \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAlts\bChoiceLabel}{\the\toks@}}}\fi + \count0=0\relax\let\\\defineEachChoice\the\toks@ + \count0=1\relax\toks@={}%{\ignorespaces\@gobble}% + \loop + \edef\temp@exp{\the\toks@\noexpand\\{% + \noexpand\useSavedAlts[\the\count0]{\bChoiceLabel} + \noexpand\useSavedAns[\the\count0]{\bChoiceLabel}}}% + \toks@=\expandafter{\temp@exp}% + \ifnum\count0<\@currNCntAns + \advance\count0by1 + \repeat + \csarg\xdef{SavedAltsAns\bChoiceLabel}{\the\toks@}% + \ifsolutionsonly\else{\let\\\relax\eq@IWDefs{\string + \csarg\string\gdef{SavedAltsAns\bChoiceLabel}{\the\toks@}}}\fi + \egroup +} +\def\graylettersOn{\aebshowgrayletterstrue} +\def\graylettersOff{\aebshowgraylettersfalse} +\def\aeb@exiii{\expandafter\expandafter\expandafter} +\def\REF{\@ifstar{\let\isREFstar\eq@One\aeb@REFstar} + {\let\isREFstar\eq@Zero\aeb@REF}} +\def\aeb@REFstar#1{\@ifundefined{r@#1}{\hbox{\reset@font\bfseries ??}} + {\ifaebshowgrayletters\aeb@buildUpperCaseRef{#1}% + \else\ref*{#1}\fi}% +} +\def\aeb@REF#1{\@ifundefined{r@#1}{\hbox{\reset@font\bfseries ??}} + {\ifaebshowgrayletters\aeb@buildUpperCaseRef{#1}% + \else\ref{#1}\fi}% +} +\def\aeb@buildUpperCaseRef#1{% + \xdef\tmp@expand{\aeb@exiii\@firstoftwo\csname r@#1\endcsname}% + \xdef\tmp@expand{\uppercase{\tmp@expand}}\tmp@expand +} +\endinput +%% +%% End of file `eqexam.def'. diff --git a/macros/latex/contrib/eqexam/eqexam.dtx b/macros/latex/contrib/eqexam/eqexam.dtx new file mode 100644 index 0000000000..655bc1cc1c --- /dev/null +++ b/macros/latex/contrib/eqexam/eqexam.dtx @@ -0,0 +1,9697 @@ +% \iffalse +% makeindex -s gglo.ist -o eqexam.gls eqexam.glo +% makeindex -s gind.ist -o eqexam.ind eqexam.idx +%<*copyright> +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% eqexam.sty package, %% +%% Copyright (C) 2005--2018 D. P. Story %% +%% dpstory@uakron.edu %% +%% %% +%% This program can redistributed and/or modified under %% +%% the terms of the LaTeX Project Public License %% +%% Distributed from CTAN archives in directory %% +%% macros/latex/base/lppl.txt; either version 1.2 of %% +%% the License, or (at your option) any later version. %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +%\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{eqexam} +% [2019/01/31 v5.1.4 An Exam Construction Package (dps)] +%\def\eqexamdefReq{2019/02/11} +%<*driver> +\documentclass{ltxdoc} +\GlossaryPrologue{\section{{Change History}}}% +\IndexPrologue{\section{{Index}}}% +\value{IndexColumns}=2 +\value{GlossaryColumns}=2 +\usepackage{makeidx} +\usepackage[colorlinks,hyperindex=false]{hyperref} +\def\darg#1{\texttt{\{#1\}}} +\let\env\texttt +\let\opt\texttt +\let\app\textsf +\def\visispace{\symbol{32}} +\def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}} +\def\meta#1{\textsl{\texttt{#1}}} +\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}} +%\def\cs#1{\texttt{\bslash#1}} +%\pdfstringdefDisableCommands{\let\\\textbackslash}% +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\InputIfFileExists{aebdocfmt.def}{\PackageInfo{eqexam}{Inputting aebdocfmt.def}} + {\def\IndexOpt{\DescribeMacro}\let\setupFullwidth\relax + \PackageInfo{eqexam}{aebdocfmt.def cannot be found}} +\makeatletter + \let\@latex@warning\@gobble +\makeatother +\begin{document} + \let\pkg\textsf + \def\switchCats{\catcode`\{=12\relax\catcode`\}=12\relax + \catcode`\(=1\relax\catcode`\)=2\relax} + \GetFileInfo{eqexam.sty} + \title{\textsf{eqexam}: An Exam Construction Package} + \author{D. P. Story\\ + Email: \texttt{dpstory@uakron.edu}} + \date{Processed \today} + \maketitle + \tableofcontents + \let\Email\texttt + \DocInput{eqexam.dtx} +\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\PrintIndex}{\paragraph*{Index} The index goes here.\\Execute + \texttt{makeindex -s gind.ist -o eqexam.ind eqexam.idx} on the command line and recompile + \texttt{eqexam.dtx}.} +\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here.\\Execute + \texttt{makeindex -s gglo.ist -o eqexam.gls eqexam.glo} on the command line and recompile + \texttt{eqexam.dtx}.} +\end{document} +% +% \fi +% +% \StopEventually{} +% +% \InputIfFileExists{aebDoNotIndex.def}{\PackageInfo{eqexam}{Inputting aebDoNotIndex.def}} +% {\PackageInfo{eqexam}{aebDoNotIndex.def cannot be found}} +% +% \section{Introduction} +% +% This package is my attempt at writing a set of macros for creating exams. +% The package can be used with or without \textsf{web} or \textsf{exerquiz}. +% When used without, what is produced is a document suitable for printing. +% When \textsf{exerquiz} is used, the same document is produced, but with +% hypertext links to solutions. This may be useful for publishing solutions +% on the web, or publishing pretests with/without solutions. +% +% The package must be as flexible as possible vis-\`a-vis PDF. (1) +% \textsf{web} only does not add much, it does input hyperrref and test info +% such as \cs{title}, \cs{subject}, etc are placed in the Document Info +% fields of the PDF. (2) If \textsf{exerquiz} is also input (prior to +% \textsf{eqexam}), then hyperlinks will be created to the solutions to the +% test, if solutions are included at the end of the document. (3) If +% \textsf{web} and \textsf{exerquiz} are input, and the \texttt{online} +% option is taken, then the checkboxes will be come interactive, the space +% left to work the problems will be multi-line text boxes, fill-ins limited +% to True/False and simple text fill-in the blank will also become text +% boxes. +% +% When in \texttt{online} mode, the student can take the test in a computer +% lab, the completed exam can be printed and handed in, or perhaps submitted +% server-side script. +% +% \medskip\noindent (2011/05/13) The version of \textsf{eqexam} is a +% departure from previous versions. Previously, the list of problems were +% not in list, they were left-justified, with the problem number extending +% out into a little area determined by \cs{oddsidemargin}. This makes it +% hard to reformat a list of problems to fit into a custom book format. +% This new version defines a new environment, \texttt{eqequestions}, that +% makes each problem into a list. The list environment allows for an easy +% redesign of the formatting of the problems. The purpose of this new +% scheme, is to open up \textsf{eqexam} as a format package that can be used +% by author for writing a textbook. +% +% The \texttt{fortextbook} option supplies support for authors writing a +% textbook. The \texttt{exam} environment is re-cast into the +% \texttt{probset} environment, it can be used to write problem sets within +% the text. there is a version for the instructor and the student. The +% instructors version writes answers to the problem sets to the margins (or +% inline). Two solutions are offered, short and long. The short solutions +% appear in the back of the book (odd-numbered ones for the student edition. +% The long solutions are used to build the stand-alone solutions manuals for +% both the student and the instructor. More details are found in +% \Nameref{fortextbook}, see also \Nameref{fortextbookstyle}. +% +% \newpage +% \section{Package options and Process Options} +% Let us catalog the options of this package. +% +% \subsection{Early inclusion of packages} +% We include these packages early in the process of loading. +% \begin{macrocode} +%<*package> +% \end{macrocode} +%\changes{v3.1b}{2012/06/18}{New requirement \textsf{ifpdf}} +% \begin{macrocode} +\RequirePackage{ifpdf}[2006/02/20] +\RequirePackage{ifxetex}[2006/08/21] +% \end{macrocode} +% Very useful package for defining key-values. +% \begin{macrocode} +\usepackage{xkeyval} +% \end{macrocode} +% +% \subsection{Options New to \textsf{eqexam}} +% Here are some options unique to this package. +% \IndexOpt{usecustomdesign} +% Use this option to avoid \textsf{eqexam} from setting up the ``standard'' page layout. +% \begin{macrocode} +\DeclareOptionX{usecustomdesign}{\eqcustomdesigntrue} +\newif\ifeqcustomdesign \eqcustomdesignfalse +\DeclareOptionX{nocustomdesign}{\let\eqe@nocustomdesign=1} +\let\eqe@nocustomdesign=0 +% \end{macrocode} +% \IndexOpt{fortextbook} +% An option to extend the application of \textsf{eqexam} to provide support +% (exercises, providing solutions, short solutions, answers, and hints) for +% authors writing textbooks. See \Nameref{fortextbook}. +% \begin{macrocode} +\DeclareOptionX{fortextbook}{\eqfortextbooktrue} +\newif\ifeqfortextbook \eqfortextbookfalse +% \end{macrocode} +% \IndexOpt{forinstr} +% \IndexOpt{forstudent} +% These two options simply set a switch to signal the intention of the +% document author. +% \begin{macrocode} +\DeclareOptionX{forinstr}{\eqforinstrtrue} +\DeclareOptionX{forstudent}{\eqforinstrfalse} +\newif\ifeqforinstr \eqforinstrfalse +% \end{macrocode} +% \IndexOpt{nomarginwrite} +% The switch \cs{ifeqwritetomargins} is used by the \texttt{fortextbook} +% option. It is normally \texttt{true}, but if set to \texttt{false}, the +% \cs{AddToShipoutPicture} is not generated at the beginning of the +% document. Here is the code taken from below: +%\begin{verbatim} +% \ifeqfortextbook\ifeqwritetomargins +% \AtBeginDocument{\chkmarginboxwidth +% \AddToShipoutPicture{\eqe@tb@shipout}} +% \fi\fi +%\end{verbatim} +% Using this option, the check for the margin width is not done, +% and writing to the margins is turned off. +% (\cs{marginpar} still works) +% \begin{macrocode} +\DeclareOptionX{nomarginwrite}{\eqwritetomarginsfalse} +\newif\ifeqwritetomargins\eqwritetomarginstrue +% \end{macrocode} +% +% \paragraph*{Configuration Files.} +% This section contains options for the configuration files. +% \IndexOpt{cfg} +% The \texttt{cfg} option is used to specify a named configuration file, extension +% must be \texttt{.cfg}; usage \texttt{cfg=hwdoc}. +%\changes{v3.0u}{2012/09/03}{Added the \texttt{cfg} option for inputting +% a custom config file.} +%\changes{v3.1d}{2012/09/29}{Added \cs{ifeqexamCFG} and cs{eqexamCFG}; these are +% used by \textsf{ATB} to attached the configuration file.} +% \begin{macrocode} +\define@key{eqexam.sty}{cfg}[]{% + \def\arg@i{#1}\ifx\arg@i\@empty + \PackageWarning{eqexam}{No value for `cfg' specified}\else + \def\ifeqexamCFG{true}\def\eqexamCFG{#1.cfg}% + \AtEndOfPackage{\InputIfFileExists{#1.cfg} + {\typeout{Inputting #1.cfg}}{\PackageWarning{eqexam}{% + Cannot find configuration file #1.cfg}}}\fi + } +\def\ifeqexamCFG{false} +\let\eqexamCFG\@empty +% \end{macrocode} +% \IndexOpt{myconfig}\IndexOpt{myconfigi...myconfigvi} +% We offer seven sets of configuration files, that should be enough, especially +% light of the new \texttt{cfg} option, defined above. +% \changes{v3.0t}{2012/25/01}{Added four more CFG files are the request +% of a user.} +% \begin{macrocode} +\@for\eqe@tmp@i:={},i,ii,iii,iv,v,vi\do{% + \edef\eqe@tmp@exp{% + \noexpand\DeclareOptionX{myconfig\eqe@tmp@i}% + {\noexpand\AtEndOfPackage{\expandafter\noexpand + \csname eqemyconfig\eqe@tmp@i\endcsname}}% + }\eqe@tmp@exp +} +% \end{macrocode} +% +% \paragraph*{Point options.} +% Options relating to points, points on left, right, both, no points, +% totals on left and right. +% \IndexOpt{pointsonleft} +% \IndexOpt{pointsonright} +% \IndexOpt{pointsonboth} +% \IndexOpt{nopoints} +% \IndexOpt{totalsonleft} +% \IndexOpt{totalsonright} +% \IndexOpt{nozerototals} +% We offer options for points and totals. +% \begin{macrocode} +\DeclareOptionX{pointsonleft}{\AtEndOfPackage{\PointsOnLeft}} +\DeclareOptionX{pointsonright}{\AtEndOfPackage{\PointsOnRight}} +\DeclareOptionX{pointsonboth}{\AtEndOfPackage{\PointsOnBothSides}} +\DeclareOptionX{nopoints}{\AtEndOfPackage{\NoPoints}} +\DeclareOptionX{totalsonleft}{\AtEndOfPackage{\TotalsOnLeft}} +\DeclareOptionX{totalsonright}{\AtEndOfPackage{\TotalsOnRight}} +\DeclareOptionX{nozerototals}{\AtEndOfPackage{\noZeroTotals}} +% \end{macrocode} +% +% \paragraph*{Totals options.} +% +% \IndexOpt{nototals} +% \IndexOpt{noparttotals} +% \IndexOpt{parttotalsonright} +% \IndexOpt{parttotalsonleft} +% \IndexOpt{noseparationrule} +% \IndexOpt{nosummarytotals} +% Options relating to totals +% \begin{macrocode} +\let\eqe@YES=y \let\eqe@NO=n +\let\eqe@One=1 \let\eqe@Zero=0 +\let\eqe@Two=2 \let\eqe@Three=3 \let\eqe@Four=4 +\def\eqe@h{h} +\DeclareOptionX{nototals}{\AtEndOfPackage{\NoTotals}} +\DeclareOptionX{noparttotals}{% + \AtEndOfPackage{\let\eq@parttotals\eqe@NO}} +\DeclareOptionX{parttotalsonright}{% + \def\eqeomarginbox{\eqeomarginboxright}} +\DeclareOptionX{parttotalsonleft}{% + \def\eqeomarginbox{\eqeomarginboxleft}} +\def\eqeomarginbox{\eqeomarginboxright} +\DeclareOptionX{noseparationrule}{% + \AtEndOfPackage{\separationruleOff}} +% \AtEndOfPackage{\let\separationrule\relax}} +\DeclareOptionX{nosummarytotals}{\let\eq@nosummarytotals\eqe@YES} +% \end{macrocode} +% +% \paragraph*{cover page options.} There are two such options, +% \texttt{coverpage} and \texttt{cover\-page\-sumry}. +% \IndexOpt{coverpage} +% If this option is taken, a cover page is generate. +% \begin{macrocode} +\DeclareOptionX{coverpage}{\def\eqex@coverpage{\eqexcoverpage}% + \setcounter{page}{0}} +% \end{macrocode} +% \IndexOpt{coverpagesumry} +% If this option is taken, an \textbf{Exam Record} is generated on the +% cover page, provided the \texttt{coverpage} option is taken. Possible +% values aer \texttt{byparts}, \texttt{bypages}, or \texttt{none}. +% \begin{macrocode} +\define@choicekey+{eqexam.sty}{coverpagesumry}[\val\nr]% + {byparts,bypages,none}{% + \ifcase\nr\relax + \def\sumryAnnots{\cpSumrybyparts}\or + \def\sumryAnnots{\cpSumrybypages}\or + \let\sumryAnnots\relax + \fi +}{\PackageWarning{aeb}{Bad choice for coverpagesumry, permissible values + are byparts, bypages, and none. Try again}} +\let\sumryAnnots\relax +% \end{macrocode} +% +% \paragraph*{Options related to how the document is built.} +% +% \IndexOpt{nospacetowork} +% The vertical space defined by the solution environment is removed. +% \begin{macrocode} +\DeclareOptionX{nospacetowork}{% + \AtEndOfPackage{\let\eq@insertverticalspace\eqe@NO}} +% \end{macrocode} +% \IndexOpt{answerkey} +% Equivalent to solutionsafter and proofing. +% \begin{macrocode} +\@ifundefined{ifanswerkey}{\newif\ifanswerkey\answerkeyfalse}{} +\@ifundefined{ifsolutionsAtEnd} + {\newif\ifsolutionsAtEnd\solutionsAtEndtrue}{} +% \end{macrocode} +% A more intelligent processing of certain options is deployed: Now, we allow +% only one of the options \texttt{answerkey}, \texttt{nosolutions}, +% \texttt{vspacewithsolns}, \texttt{solutionsafter}, and +% \texttt{solutionsonly} at a time. +% \begin{macrocode} +\let\thisOpt@OK \eqe@YES +\def\w@rningBadOpts{\PackageWarningNoLine{eqexam}{You've chosen two + conflicting options,\MessageBreak \l@stPO\space and \CurrentOption. + We will recognize\MessageBreak the \l@stPO\space option. + Please correct\MessageBreak this if my guess is wrong}} +\def\eqe@optiont@kenMsg{\PackageInfo{eqexam} + {Option \CurrentOption\space taken}} +\DeclareOptionX{answerkey}{\ifx\thisOpt@OK\eqe@YES + \def\l@stPO{answerkey}\let\thisOpt@OK\eqe@NO + \eqe@optiont@kenMsg\expandafter\AnswerKey\else + \w@rningBadOpts\fi} +\def\AnswerKey{\solutionsAtEndfalse\answerkeytrue + \eq@proofingtrue\eq@solutionsaftertrue\displayworkareafalse} +% \end{macrocode} +% \IndexOpt{vspacewithsolns} +% When \texttt{vspacewithsolns} is used, vertical space is created by +% the solutions environment, and the solutions are written to the +% end of the file. +% \changes{v2.0d}{2011/03/04}{% +% Added the \texttt{vspacewithsolns} option} +% \IndexOpt{ftbsolns} +% Added \texttt{ftbsolns} as an alias for \texttt{vspacewithsolns} +% \changes{v3.0h}{2011/08/17}{% 2011/08/17 v3.0h Added the +% \texttt{vspacewithsolns} option}. This is implemented through +% a Boolean switch \cs{ifvspacewithsolns}, which I'm sorry now I've made +% so long. To make up for that bad decision, I also define +% \DescribeMacro{\ifkeyalt}\cmd{ifkeyalt} to be \cmd{\ifvspacewithsolns} +% with making conditional decisions, of course, one cannot say +% \cs{keyalttrue}. +% \begin{macrocode} +\newif\ifvspacewithsolns\vspacewithsolnsfalse +\def\ifkeyalt{\csname ifvspacewithsolns\endcsname} + \let\keyalttrue\vspacewithsolnstrue + \let\keyaltfalse\vspacewithsolnsfalse +%\def\ifkeyalt{\csname ifvspacewithsolns\endcsname} +\def\ifkeyOrkeyalt{\ifanswerkey + \def\eqe@next{\csname iftrue\endcsname}\else + \ifvspacewithsolns\def\eqe@next{\csname iftrue\endcsname}\else + \def\eqe@next{\csname iffalse\endcsname}\fi\fi\eqe@next} +\DeclareOptionX{vspacewithsolns}{\ifx\thisOpt@OK\eqe@YES + \def\l@stPO{vspacewithsolns}\let\thisOpt@OK\eqe@NO + \eqe@optiont@kenMsg + \vspacewithsolnstrue\expandafter\displayworkareatrue + \else\w@rningBadOpts\fi} +\DeclareOptionX{ftbsolns}{\ExecuteOptionsX{vspacewithsolns}} +% \end{macrocode} +% The \IndexKey{flextended}\opt{flextended} is an (experimental) option +% to allow filler lines (fl) to be superimposed under the solutions, when the \opt{answerkey} +% option is taken. +% \changes{2017/12/05}{v5.0g}{Added option \string\texttt{flextended}.} +% \begin{macrocode} +\DeclareOptionX{flextended}{\AtEndOfPackage{\flextendedInput}} +\def\flextendedInput{\eqe@flextendedtrue + \InputIfFileExists{flextended.def} + {\PackageInfo{eqexam}{Inputting flextended.def for + flextended\MessageBreak option}} + {\eqe@flextendedfalse\PackageWarning{eqexam} + {Cannot find flextended.def for flextended\MessageBreak + option. You should rebuild the package. Removing\MessageBreak + flextended for now}}} +\@ifundefined{ifeqe@flextended} + {\newif\ifeqe@flextended \eqe@flextendedfalse}{} +% \end{macrocode} +% \IndexOpt{useforms} +% Use forms (if online option is taken); otherwise draw rectangles for +% multiple choice/multiple selection questions. +% \begin{macrocode} +\DeclareOptionX{useforms}{\AtEndOfPackage{\def\sqstar{*}}} +% \end{macrocode} +% \IndexOpt{allowcirc4mc} +% This option uses \texttt{lcircle10} to draw circles around multiple choice questions. +% \begin{macrocode} +\newif\ifallowcircmc \allowcircmcfalse +\DeclareOptionX{allowcirc4mc}{\allowcircmctrue} +% \end{macrocode} +% +% \paragraph*{PDF Options} The various options to go beyond paper! +% +% \IndexOpt{online} +% \IndexOpt{pdf} +% \IndexOpt{links} +% \IndexOpt{email} +% Options related to the interactive capability of \textsf{eqexam}. +% \changes{v3.1b}{2012/06/18}{Added \cs{eqe@auto@chk@drivers}} +% For each of the PDF options, we auto-check for \textsf{pdftex} +% and \textsf{xetex}. +% \begin{macrocode} +\def\eqe@auto@chk@drivers{\ifpdf\ExecuteOptionsX{pdftex}\else + \ifxetex\ExecuteOptionsX{xetex}\fi\fi} +\newif\ifeqeonline \eqeonlinefalse +\DeclareOptionX{online}{\eqe@auto@chk@drivers + \let\eq@online\eqe@YES\eqeonlinetrue\ExecuteOptionsX{links}} +\DeclareOptionX{pdf}{\eqe@auto@chk@drivers\let\load@web\eqe@YES} +\DeclareOptionX{links}{\eqe@auto@chk@drivers + \let\load@web\eqe@YES\let\load@exerquiz\eqe@YES} +\DeclareOptionX{email}{\eqe@auto@chk@drivers + \let\use@email\eqe@YES\ExecuteOptionsX{online}} +% \end{macrocode} +% \IndexOpt{obeylocalversions} +% This option is used for multiple versions of a document. +% \begin{macrocode} +\newif\ifeqobeylocalversion \eqobeylocalversionfalse +\DeclareOptionX{obeylocalversions}{\eqobeylocalversiontrue} +% \end{macrocode} +% \IndexOpt{usexkv} +% Causes the \textsf{xkeyval} package to be input, this option extends the +% option list of +% \cs{fillIn}. +% \begin{macrocode} +\DeclareOptionX{usexkv}{\let\eq@usexkeys\eqe@YES} +% \end{macrocode} +%\texttt{2014/12/19} Now, the \texttt{usexkeys} is on by default. +%\changes{v3.5a}{2014/12/19}{Made \texttt{usexkeys} as default} +% \begin{macrocode} +\let\eq@usexkeys\eqe@YES +% \end{macrocode} +% +%\paragraph*{Renditions} Options relating to renditions. +% \IndexOpt{max} +% \IndexOpt{rendition} +% The \texttt{max} and \texttt{rendition} option can be used instead of the +% \verb!\numVersions{2}! and \verb!\forVersion{a}!, respectively. These options +% allow you to set the version information though a package option. This allows us, for +% example, to use a \textsf{cfg} file such as \texttt{rendition.cfg} to dynamically set the version. +% This feature is used primarily by \textsf{AeB Exam Builder}. +% \changes{v2.0}{2010/03/05} +% {% +% Switched over to \textsf{xkeyval}, added max and rendition to be consistent +% with the renditions package, though we don't use the rendition package +% itself. \textsf{eqexam} has a more extensive renditions system already. +% Introduced this mostly for use AeB Exam Builder. +% } +% \begin{macrocode} +\let\eq@renditionOptions\@empty +\let\eq@max@selected\@empty \let\eq@ren@selected\@empty +\DeclareOptionX{max}{\def\eq@max@selected{#1}% + \g@addto@macro\eq@renditionOptions{\numVersions{#1}}} +\DeclareOptionX{rendition}{\def\eq@ren@selected{#1}% + \g@addto@macro\eq@renditionOptions{\forVersion{#1}}} +% \end{macrocode} +% \paragraph*{Randomization} Options relating to randomization. +% \IndexOpt{allowrandomize} +% Use this option to randomize the choices of a multiple choice question. +% \begin{macrocode} +\DeclareOptionX{allowrandomize}{\AtEndOfPackage{\inputRandomizeChoices}} +\def\inputRandomizeChoices{\InputIfFileExists{aebrandom.def} + {\typeout{inputting aebrandom.def}}{cannot find aebrandom.def}} +% \end{macrocode} +% +% \paragraph*{Set Misc. Defaults and Helper Macros.} +% We set some defaults, and define macros for use by the document author. +% \begin{macrocode} +\let\eq@online\eqe@NO +\def\ifisOnline{\ifx\eq@online\eqe@YES} +\let\use@email\eqe@NO +\let\load@web\eqe@NO +\let\load@exerquiz\eqe@NO +\def\sqLinks{\def\sqstar{}}\sqLinks +\def\sqForms{\def\sqstar{*}} +\def\NoSpaceToWork{\let\eq@insertverticalspace\eqe@NO} +\def\SpaceToWork{\let\eq@insertverticalspace\eqe@YES} +\let\eq@nototals\eqe@NO +\let\eq@nosummarytotals\eqe@NO +\let\eq@parttotals\eqe@YES +\let\eqx@separationrule\eqe@YES +\let\eq@insertverticalspace\eqe@YES +\let\eqex@coverpage\relax +\def\@reportpoints{0} +\let\marginpoints\@empty +\let\totalsbox=\hfil +% \end{macrocode} +% +% \subsection{Options from and for \textsf{web}} +% \IndexOpt{forpaper} +% \IndexOpt{forcolorpaper} +% \IndexOpt{forcolorpaper*} +% Here is the list of options of \textsf{exerquiz} we plan to recognize. +% \changes{v4.6a}{2016/06/04}{Added \string\cs{ifequsecolor} to easily distinguish between +% \string\texttt{forpaper} and \string\texttt{forcolorpaper} options.} +% \begin{macrocode} +\@ifundefined{ifequsecolor}{\newif\ifequsecolor\equsecolorfalse}{} +\DeclareOptionX{forpaper}{\equsecolorfalse\eqforpapertrue + \PassOptionsToPackage{monochrome}{\eq@ColorPackage}} +\DeclareOptionX{forcolorpaper}{\equsecolortrue\eqforpapertrue} +\newif\ifForceNoColor\ForceNoColorfalse +\DeclareOptionX{forcolorpaper*}{\equsecolortrue\eqforpapertrue + \ForceNoColortrue} % for print +% \end{macrocode} +% \IndexOpt{preview} +% Preview shows outlines for form fields. +% \begin{macrocode} +\DeclareOptionX{preview}{\previewtrue} +% \end{macrocode} +% \IndexOpt{webOpts} +% Pass options to \textsf{web}, when \texttt{pdf} or higher is used. +% \begin{macrocode} +\define@key{eqexam.sty}{webOpts}[]{\def\eqe@webOpts{#1,\eqDriverName}} +\def\eqe@webOpts{\eqDriverName} +% \end{macrocode} +% +% \subsection{Options from and for \textsf{exerquiz}} +% Options from \textsf{exerquiz} that are useful for this package. +% \IndexOpt{exerquizOpts} +% Pass options to \textsf{exerquiz}, when \texttt{links} or higher is used. +% \begin{macrocode} +\define@key{eqexam.sty}{exerquizOpts}[]{\def\eqe@eqOpts{#1,nodljs}} +\def\eqe@eqOpts{nodljs} +% \end{macrocode} +% \IndexOpt{nosolutions} +% \IndexOpt{nohiddensolutions} +% \IndexOpt{noHiddensolutions} +% \IndexOpt{solutionsafter} +% \changes{v1.7b}{2007/21/07}{Added a \texttt{solutionsonly} option} +% \IndexOpt{solutionsonly} +% Solutions related options +% \begin{macrocode} +\DeclareOptionX{nosolutions}{\ifx\thisOpt@OK\eqe@YES + \def\l@stPO{nosolutions}\let\thisOpt@OK\eqe@NO + \eqe@optiont@kenMsg\eq@nolinktrue\eq@nosolutionstrue + \expandafter\displayworkareatrue + \else\w@rningBadOpts\fi} +\DeclareOptionX{nohiddensolutions}{\eq@globalshowsolutionstrue} +\DeclareOptionX{noHiddensolutions}% + {\eq@globalshowsolutionstrue\AtBeginDocument{\def\Hidesymbol{h}}} +\DeclareOptionX{solutionsafter}{\ifx\thisOpt@OK\eqe@YES + \def\l@stPO{solutionsafter}\let\thisOpt@OK\eqe@NO + \eqe@optiont@kenMsg + \eq@solutionsaftertrue\expandafter + \displayworkareafalse\else\w@rningBadOpts\fi} +\DeclareOptionX{solutionsonly}{\ifx\thisOpt@OK\eqe@YES + \def\l@stPO{solutionsafter}\let\thisOpt@OK\eqe@NO + \eqe@optiont@kenMsg\AtEndOfPackage{\therearesolutionstrue + \let\exerSolnsHeadnToc\relax} + \solutionsonlytrue\answerkeytrue\expandafter + \displayworkareafalse\else\w@rningBadOpts\fi} +% \end{macrocode} +% \IndexOpt{proofing} +% The \texttt{proofing} option sets a switch that controls whether +% the checkbox for multiple choice questions appears, and whether +% the answer for the \cs{fillin} command appears. \cmd{\ifeq@proofing} +% is set to true when the \texttt{answerkey} option is taken. +% \begin{macrocode} +\DeclareOptionX{proofing}{\eq@proofingtrue} +% \end{macrocode} +% We provide two helper commands for turning on or off proofing. These are +% \DescribeMacro{\showproofing}\cmd{\showproofing} for turning on proofing +% and \DescribeMacro{\hideproofing}\cmd{\hideproofing} for turning off proofing. +% There was some reason for defining these two, but can't remember now. +% \begin{macrocode} +\newcommand{\showproofing}{\eq@proofingtrue} +\newcommand{\hideproofing}{\eq@proofingfalse} +% \end{macrocode} +% \IndexOpt{showgrayletters} +% \changes{v1.7c}{2008/08/21} +% { +% Added the \texttt{showgrayletters} option to eqexam +% (ported from exerquiz) +% } +% When this option is in effect, capital letters in gray appear under +% the multiple choice question boxes. +% \begin{macrocode} +\newif\ifaebshowgrayletters\aebshowgraylettersfalse +\DeclareOptionX{showgrayletters}% + {\AtEndOfPackage{\aebshowgrayletterstrue}} +% \end{macrocode} +% +%\changes{v2.0i}{2011/04/17} +%{ +% Added the switch \cs{ifdisplayworkarea} to better control when the +% work area is to be displayed. +%} +%\changes{v5.1.3}{2018/12/13}{\string\cs{ifdisplayworkarea} conditionally defined; +% defined \string\cs{displayworkareaOn} and +% \string\cs{displayworkareaOff}. Consistent with exerquiz.} +% Define \cs{ifdisplayworkarea}\DescribeMacro\ifdisplayworkareaOn\DescribeMacro\ifdisplayworkareaOff\space +% and user commands to turn off and on. +% \begin{macrocode} +\@ifundefined{ifdisplayworkarea}{\newif\ifdisplayworkarea + \displayworkareafalse}{} +\providecommand\displayworkareaOn{\displayworkareatrue} +\providecommand\displayworkareaOff{\displayworkareafalse} +% \end{macrocode} +% +% \paragraph*{Color packages} +% We set the color package, \texttt{xcolor} preferred. +% \begin{macrocode} +\IfFileExists{xcolor.sty}% +{\def\eq@ColorPackage{xcolor}\def\eqe@color@opt{table}% + \PassOptionsToPackage{xcolor}{table}} +{\def\eq@ColorPackage{color}\let\eqe@color@opt\@empty} +% \end{macrocode} +% \DescribeMacro{noxcolor}\texttt{noxcolor} forces the use of the color package. +% \begin{macrocode} +\DeclareOptionX{noxcolor}{\def\eq@ColorPackage{color}} +% \end{macrocode} +% +% \subsubsection{Title page options} +% To\DescribeMacro{useclassmaketitle} support the use of eqexam outside a straight exam document, we allow the +% user to bypass the redefinition of \cs{maketitle}. This is automatic +% with the \texttt{fortextbook} option. +% \begin{macrocode} +\newif\if@eqeuseclassmaketitle \@eqeuseclassmaketitlefalse +\DeclareOptionX{useclassmaketitle}{\@eqeuseclassmaketitletrue} +\newif\if@bypasseqexamheading \@bypasseqexamheadingfalse +\DeclareOptionX{bypasspkgpagestyle}{\@bypasseqexamheadingtrue + \ExecuteOptionsX{nototals}} +% \end{macrocode} +% \subsection{Drivers Recognized} +% These drivers are only relevant when +% a \textsf{PDF} option is taken (\texttt{pdf}, \texttt{links}, \texttt{online}, \texttt{email}). +% For ordinary paper documents, it is not necessary to specify the driver. If you +% put the assignment/homework/test (solns) on the web, suggested option is \texttt{pdf}, +% this inputs hyperref, and the document info dialog is filled in. +% \IndexOpt{dvipsone} +% \IndexOpt{dvips} +% \IndexOpt{pdftex} +% \IndexOpt{dvipdfm} +% \IndexOpt{dvipdfmx} +% \IndexOpt{xetex} +% \IndexOpt{textures} +% \begin{macrocode} +\DeclareOptionX{dvipsone}{% + \def\eqe@drivernum{0}\def\eqDriverName{dvipsone}% + \PassOptionsToPackage{\eq@ColorPackage}{dvipsone}} +\DeclareOptionX{dvips}{\def\eqe@drivernum{0}\def\eqDriverName{dvips}% + \PassOptionsToPackage{\eq@ColorPackage}{dvips}} +\DeclareOptionX{pdftex}{\def\eqe@drivernum{1}\def\eqDriverName{pdftex}% + \PassOptionsToPackage{\eq@ColorPackage}{pdftex}} +\DeclareOptionX{dvipdfm}{% + \def\eqe@drivernum{2}\def\eqDriverName{dvipdfm}% + \PassOptionsToPackage{\eq@ColorPackage}{dvipdfm}} +\DeclareOptionX{dvipdfmx}{\def\eqe@drivernum{2}% + \def\eqDriverName{dvipdfmx}% + \PassOptionsToPackage{\eq@ColorPackage}{dvipdfmx}} +\DeclareOptionX{xetex}{\def\eqe@drivernum{2}\def\eqDriverName{xetex}% + \PassOptionsToPackage{\eq@ColorPackage}{xetex}} +\DeclareOptionX{textures}{% + \def\eqe@drivernum{3}\def\eqDriverName{textures}% + \PassOptionsToPackage{\eq@ColorPackage}{textures}} +\DeclareOptionX*{% + \PassOptionsToPackage{\CurrentOption}{\eq@ColorPackage}} +\def\eqe@drivernum{5} +\let\eqDriverName\@empty +% \end{macrocode} +% If \textsf{exerquiz} is not loaded, when we need to define some of the switches that +% were defined in \textsf{exerquiz}. +% +% The following switches are used in the options above, and are also defined +% in web, exerquiz, or eforms. +% \begin{macrocode} +\newif\ifeq@solutionsafter \eq@solutionsafterfalse +\def\ifsolutionsafter{\csname ifeq@solutionsafter\endcsname} + \let\solutionsaftertrue\eq@solutionsaftertrue + \let\solutionsafterfalse\eq@solutionsafterfalse +\newif\ifsolutionsonly\solutionsonlyfalse +\newif\ifeq@hidesolution \eq@hidesolutionfalse +\newif\ifeq@globalshowsolutions \eq@globalshowsolutionsfalse +\newif\ifeq@nosolutions \eq@nosolutionsfalse +\newif\ifeq@proofing \eq@proofingfalse +\newif\ifeq@nolink \eq@nolinkfalse +\@ifundefined{ifpreview}{\newif\ifpreview \previewfalse}{} +\newif\ifeqforpaper \eqforpaperfalse +% \end{macrocode} +% We define the commands for inputting the CFG files. +% \begin{macrocode} +\def\eqe@csarg#1#2{\expandafter#1\csname#2\endcsname} +\@for\eqe@tmp@i:={},i,ii,iii,iv,v,vi\do{\eqe@csarg + \edef{eqemyconfig\eqe@tmp@i}{\noexpand + \InputIfFileExists{eqexam\eqe@tmp@i.cfg}{}{}}% + \eqe@tmp@exp +} +% \end{macrocode} +% +% \subsection{Bring in Config Files} +% +% First read \texttt{web.cfg}, to possibly get the driver, then input +% \texttt{eqecus.opt}, which is used to create convenient custom options. +% \changes{v1.6e}{2006/05/07}{% +% Added a custom option feature. Just before the options are processed, the +% tex compiler looks for the file \texttt{eqecus.opt}. This file should +% contain one or more custom options. } +% +% Here is an example of usage for defining your own custom options, must be based on +% current options, this code would be in the file \texttt{eqecus.opt}. +%\begin{verbatim} +%\DeclareOptionX{atbdbopts} +%{% +% \ExecuteOptionsX{online} +% \ExecuteOptionsX{forcolorpaper} +% \ExecuteOptionsX{nosolutions} +% \ExecuteOptionsX{nopoints} +% \ExecuteOptionsX{nototals} +% \ExecuteOptionsX{nospacetowork} +% \ExecuteOptionsX{obeylocalversions} +% \ExecuteOptionsX{myconfig} +%} +%\end{verbatim} +% The following config files are input prior to \cs{ProcessOptionsX}, and can, +% therefore, contain declaration of options. \texttt{web.cfg} usually only +% specifies the default driver. \texttt{eqecus.opt} is used by \textsf{@EASE}, +% but can be used locally. +% \begin{macrocode} +\InputIfFileExists{web.cfg}{}{} +\InputIfFileExists{eqecus.opt}{}{} +% \end{macrocode} +%\changes{v2.0}{2010/03/05} +%{ +% Added exambuilder.cfg for use by AeB Exam Builder, to pass the values of the options +% max and rendition to eqexam. +%} +% These two are used by the \textsf{rendition} package and the exam builder utility. +% \begin{macrocode} +\InputIfFileExists{rendition.cfg}{}{} +\InputIfFileExists{exambuilder.cfg}{}{} +% \end{macrocode} +% +% \subsection{Process Options} +% +% Now process the options. +% \begin{macrocode} +\ProcessOptionsX +% \end{macrocode} +% When the online or email option is taken, as well as answserkey, we cancel the \texttt{flextended} option. +% \begin{macrocode} +\ifeqeonline + \ifanswerkey + \def\flextendedInput{\let\turnfl@nskeyMsg\@empty + \PackageWarningNoLine{eqexam} + {You've chosen the online or email option\MessageBreak + with the flextended option. This is not\MessageBreak + supported, removing the flextended option}}\fi +\fi +% \end{macrocode} +% \changes{v3.2c}{2013/02/23}{Added \cs{selectedMC} at end of package} +% The \cs{selectedMC} command contains the choice for the styling for the +% region multiple choice questions: rectangles or circles. The default is +% rectangles. +% \begin{macrocode} +\AtEndOfPackage{\selectedMC} +% \end{macrocode} +% (2015/07/12) Move the inclusion of the color package prior to loading many of the other +% required packages. +% \begin{macrocode} +\edef\eqe@tmpexp{\noexpand +\RequirePackage{\eq@ColorPackage}}\eqe@tmpexp +% \end{macrocode} +% We require a minimal version for \textsf{xcolor}. +%\changes{}{2015/07/21}{add \cs{let}\cs{CT@arc@}\cs{relax}} +% \begin{macrocode} +\@ifpackageloaded{xcolor}{\AtEndOfPackage{\let\CT@cell@color\relax + \let\CT@arc@\relax}% + \@ifpackagelater{xcolor}{2004/07/04}{}{\PackageError{eqexam}{% + *************************************************\MessageBreak + * Your Version of `xcolor.sty' is too old!\MessageBreak + * You need the version from 2004/07/04 or newer\MessageBreak + * or use: \string\usepackage[noxcolor]{eqexam}\MessageBreak + * or \string\documentclass[noxcolor]{article}\MessageBreak + *************************************************}{}% + }% +}{} +% \end{macrocode} +% If \texttt{nocustomdesign} option is taken, we set the switch +% \cmd{\eqcustomdesignfalse}. +% \begin{macrocode} +\if\eqe@nocustomdesign1\eqcustomdesignfalse\fi +% \end{macrocode} +% Define a \cs{immediate}\cs{write} helper macro. +% \begin{macrocode} +\long\def\eqe@IWO#1{\immediate\write#1} +% \end{macrocode} +% \paragraph*{Early definitions for the \texttt{fortextbook} option.} +% \begin{macro}{\showAllAnsAtEnd} +% If the user has chosen the \texttt{vspacewithsolns} option, we must turn +% of all other solution options, namely \texttt{answerkey}. This command is +% used internally. +% \changes{v4.6b}{2016/10/02}{Include \string\cs{eqTopOfSolnPage} from \string\pkg{exerquiz} +% to support copying question to solution page.} +% \medskip\par\noindent +% (2016/10/02) Include \cs{eqTopOfSolnPage} from \pkg{exerquiz} +% to support copying question to solution page. +% \begin{macrocode} +\newcommand{\showAllAnsAtEnd}{% + \makeAnsEnvForSolnsAtEnd\eqTopOfSolnPage + \answerkeytrue\eq@proofingtrue + \eq@solutionsaftertrue\vspacewithsolnstrue + \displayworkareafalse %\withinsoldoctrue % now within \eqTopOfSolnPage +} +% \end{macrocode} +% \begin{macro}{\makeAnsEnvForSolnsAtEnd} +% One user wanted to be able to use the \texttt{answers} environment +% in the solutions section at the end of the document (when the +% \texttt{vspacewithsolns} is used). Here it is. This definition +% is added to the definition of \cmd{\showAllAnsAtEnd}. +% \begin{macrocode} +\newcommand{\makeAnsEnvForSolnsAtEnd}{% +% \end{macrocode} +% \changes{v3.1e}{2012/11/10}{Removed hard-wired \cs{proofingsymbol}} +% \begin{macrocode} +% \proofingsymbol{\ding{52}}% + \let\answers\answers@sq + \let\endanswers\endanswers@sq + \let\manswers\manswers@sq + \let\endmanswers\endmanswers@sq +} +% \end{macrocode} +% \begin{macrocode} +\newcommand{\solAtEndFormatting}[1]{\def\eqeAEFormatting{#1}} +\let\eqeAEFormatting\@empty +% \end{macrocode} +% \cs{writeAllAnsAtEnd} writes the \cs{showAllAnsAtEnd} command to the solutions file. +% \begin{macrocode} +\def\writeAllAnsAtEnd{\ifsolutionsonly\else + \let\quiz@solns\ex@solns + \eqe@IWO\quiz@solns{\string\showAllAnsAtEnd}% + \ifx\eqeAEFormatting\@empty\else + \eqe@IWO\quiz@solns{\string\eqeAEFormatting}\fi + \fi +} +\def\writeWithSolDocTrue{\writeT@SolnFile{\protect\withinsoldoctrue}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\setSolnMargins} +% Sets the value of \cs{eqemargin} in the context of the solution file, +% this command is redefined later. +% \begin{macrocode} +\newcommand{\setSolnMargins}[1]{\setlength\eqemargin{#1}\ignorespaces} +% \end{macrocode} +% \end{macro} +% (2011/05/08) In the new version of \textsf{eqexam}, the one that makes +% the problems within an \texttt{exam} environment, into a list, the +% solutions file that appears at the end of the document also needs to be +% put into a list. Here, we define the command that writes the beginning of +% the \texttt{eqequestions} environment to the beginning of the +% \cs{jobname.sol} file. We hard-wire write \verb!\setSolnMargins{\the\eqemargin}! +% to the solution file, but leave a back door open to write an alternate string. +% (2014/03/20) \DescribeMacro{\altSetSolnMargins}\cmd{\altSetSolnMargins} allows you, +% through its argument to pass an alternate string. +% \changes{v5.1.1}{2018/12/05}{Added \string\cs{eqprior}} +% \begin{macrocode} +\def\altSetSolnMargins#1{\def\alt@SetSolnMargins{#1}} +\let\alt@SetSolnMargins\@empty +\def\writeBeginEqeQuestions{\ifsolutionsonly\else + \ifOKToWriteExamData + \let\quiz@solns\ex@solns + \ifx\alt@SetSolnMargins\@empty + \writeT@SolnFile{\string\setSolnMargins{\the\eqemargin}}\else + \writeT@SolnFile{\alt@SetSolnMargins}\fi + \writeT@SolnFile{\protect\eqgriii\string\noindent + \string\begin{eqequestions}}% + \fi + \fi +} +% \end{macrocode} +% (2011/05/08) We define the command that writes the end of the \texttt{eqequestions} +% environment to the beginning of the \cs{jobname.sol} file. +% \begin{macrocode} +\newcommand{\setBtwnExamSkip}[1]{\gdef\btwnExamSkipAmt{#1}% + \def\btwnExamSkip{\ifdim#1=0pt\else + \vskip#1\relax\fi}} +\setBtwnExamSkip{6pt} +\def\writeEndEqeQuestions{% + \ifsolutionsonly\else + \ifOKToWriteExamData + \let\quiz@solns\ex@solns + \eqe@IWO\quiz@solns{\string\eqgrii + \string\end{eqequestions}^^J}% + \writeT@SolnFile{\string\btwnExamSkip^^J}% + \fi\fi +} +% \end{macrocode} +% If \cs{ifvspacewithsolns} we set the switches need to simulate +% \texttt{nosolutions}. +% \begin{macrocode} +\def\csarg#1#2{\expandafter#1\csname#2\endcsname} +\def\saveIFEQE#1{\def\ARG{#1ifSave}% + \expandafter\csarg\expandafter + \let\expandafter\ARG\csname#1\if#1true\else false\fi\endcsname} +\saveIFEQE{vspacewithsolns}\saveIFEQE{answerkey} +\saveIFEQE{eq@proofing}\saveIFEQE{eq@solutionsafter} +\saveIFEQE{eq@nolink}\saveIFEQE{eq@nosolutions} +\saveIFEQE{displayworkarea} +\def\vpwsSimulateNoSolns{% dps28 + \ifvspacewithsolns + \answerkeyfalse\eq@proofingfalse\eq@solutionsafterfalse + \eq@nolinkfalse\eq@nosolutionsfalse\displayworkareatrue + \fi} +\def\reverseVSWS{\vspacewithsolnsfalse + \answerkeyifSave\eq@proofingifSave + \eq@solutionsafterifSave\eq@nolinkifSave + \eq@nosolutionsifSave\displayworkareaifSave +} +\vpwsSimulateNoSolns +% \end{macrocode} +% +% \subsection{Save Switch Values} +% +% Now, save the current state of the switches defined above. When, and if, +% the packages web, \textsf{exerquiz} and \textsf{eforms} are loaded, they will overwrite the +% choices set by the author, so we save them. +% \begin{macrocode} +\let\savedeq@online\eq@online +\let\savedifeq@solutionsafter\ifeq@solutionsafter +\let\savedifeq@hidesolution\ifeq@hidesolution +\let\savedifeq@globalshowsolutions\ifeq@globalshowsolutions +\let\savedifeq@nosolutions\ifeq@nosolutions +\let\savedifeq@proofing\ifeq@proofing +\let\savedifeq@nolink\ifeq@nolink +\let\savedifpreview\ifpreview +\let\savedifeqforpaper\ifeqforpaper +\let\ifnosolutions\ifeq@nosolutions +% \end{macrocode} +% \section{Required Packages} +% The following are the required packages for \textsf{eqexam}. +% \begin{macrocode} +\RequirePackage{amstext,amssymb} +% \end{macrocode} +% \begin{macrocode} +\@ifundefined{if@fleqn}{\let\fleqnOn\relax\let\fleqnOff\relax} + {\def\fleqnOn{\@fleqntrue}\def\fleqnOff{\@fleqnfalse}} +% \end{macrocode} +% Bring the \texttt{comment} package in early, before \texttt{verbatim}, these two +% clash a bit. +% \changes{v5.1.2}{2018/12/05}{Use version 3.2 of comment style under the name of aeb-comment} +% \changes{v5.1.4}{2019/01/31}{\string\cs{let} \string\cs{comment} and \string\cs{endcomment} to \string\cs{relax} +% we use the definition of the comment environment given in \string\pkg{verbatim}.} +% \begin{macrocode} +\RequirePackage{aeb-comment} +%\let\comment\relax\let\endcomment\relax +\def\eqe@commentChkMsg{\@ifpackageloaded{comment} + {\PackageWarningNoLine{eqexam} + {The comment package is incompatible with the\MessageBreak + aeb-comment package, do not use the comment package}}{}} +\AtBeginDocument{\eqe@commentChkMsg} +% \end{macrocode} +% The macro \cs{includeexersolutions} is defined in \textsf{eqexam.def}. We execute +% the command \cs{include@solutions} before the web package is loaded. The \textsf{web} package +% has a \cs{AtEndDocument} as well, and inserts a new page that we don't want. +% \begin{macrocode} +\AtEndDocument{\includeexersolutions} +% \end{macrocode} +% If user has specified one of the pdf options (pdf, links, online, email), we bring in +% the web package. +% \begin{macrocode} +\@ifpackageloaded{web}{\let\load@web\eqe@YES}{% + \ifx\load@web\eqe@YES\ifnum\eqe@drivernum=5 + \PackageInfo{eqexam}{You have not selected a driver % + for eqexam. Perhaps the \MessageBreak + driver is introduced through web.cfg% + }\fi\expandafter\RequirePackage\expandafter[\eqe@webOpts]{web}% + \edef\@pdfcreator{\@pdfcreator, The eqexam Package}\fi +} +% \end{macrocode} +% If user has specified links, online or email, we bring in the exerquiz package. +% \begin{macrocode} +\@ifpackageloaded{exerquiz}{\let\load@exerquiz\eqe@YES}{% + \let\symbolchoice\@gobble + \ifx\load@exerquiz\eqe@YES\expandafter + \RequirePackage\expandafter[\eqe@eqOpts]{exerquiz}[2011/08/30] +% \end{macrocode} +% We input \textsf{exerquiz} with the \texttt{nodljs}, we don't need all the JavaScript +% to process interactive shortquizzes or quizzes, but we do want the option of +% adding in document JavaScript, so after we input \textsf{exerquiz}, we set the +% switches to allow these features. +% \begin{macrocode} + \let\importdljs\eqe@YES\let\execjs\eqe@YES + \fi +} +\@ifpackageloaded{eforms}{}{% +% \end{macrocode} +% If \textsf{eforms} is not loaded, we define \cs{symbolchoice}, which is +% defined in \textsf{eforms} to gobble up its argument, we don't need it. +% \begin{macrocode} + \let\symbolchoice\@gobble +} +% \end{macrocode} +% Here is a fix to a problem I've been having previewing in \textsf{dviwindo}. I've traced +% the problem down to \cs{@pdfviewparams}. Redefining \cs{@pdfviewparams} as follows. +% \begin{macrocode} +\def\eqDvipsone{dvipsone} +\@ifpackageloaded{hyperref} + {\ifx\eqDriverName\eqDvipsone + \renewcommand\@pdfviewparams{ null null null}\fi + }{\let\textorpdfstring\@firstoftwo} +% \end{macrocode} +% Now that we have possibly input \textsf{web} or \textsf{exerquiz}, we need to restore the authors options. +% \begin{macrocode} +\let\eq@online\savedeq@online +\let\ifeq@solutionsafter\savedifeq@solutionsafter +\def\ifsolutionsafter{\ifeq@solutionsafter} % user interface +\let\ifeq@hidesolution\savedifeq@hidesolution +\let\ifeq@globalshowsolutions\savedifeq@globalshowsolutions +\let\ifeq@nosolutions\savedifeq@nosolutions +\let\ifeq@proofing\savedifeq@proofing +\let\ifeq@nolink\savedifeq@nolink +\let\ifpreview\savedifpreview +\let\ifeqforpaper\savedifeqforpaper +% \end{macrocode} +% Other packages of interest. +% \begin{macrocode} +\RequirePackage{calc} +\RequirePackage{pifont} +\RequirePackage{array} +% \end{macrocode} +% Here, I input the \texttt{verbatim} package after the comment package. +% \begin{macrocode} +\RequirePackage{verbatim} +\@ifundefined{dlcomment}{\typeout{!! defining dlcomment}% + \let\dlcomment\comment + \let\enddlcomment\endcomment + \let\eqSavedComment\dlcomment + \let\endeqSavedComment\enddlcomment +}{} +% \end{macrocode} +% When constructing paper tests, I often use a multi-column format for some of +% the questions, so let's require this package +% \begin{macrocode} +\RequirePackage{multicol} +\setlength\columnseprule{.4pt} +\raggedcolumns\multicolsep=3pt +\newcommand{\setmulticolprob}{% + \setlength{\linewidth}{\linewidth+\eqemargin}} +% \end{macrocode} +% For the \texttt{fortextbook} option, we require \textsf{eso-pic}. +% \begin{macrocode} +\edef\eqe@reqPack{\ifeqfortextbook\noexpand\RequirePackage{eso-pic}\else +\relax\fi} +\eqe@reqPack +% \end{macrocode} +% We've processed the options, I need to detect whether the document author +% has not chosen any solutions options. +% \begin{macrocode} +\ifvspacewithsolns\solutionsAtEndtrue\fi +\ifanswerkey\solutionsAtEndfalse\fi +\ifeq@nosolutions\solutionsAtEndfalse\fi +\ifeq@solutionsafter\solutionsAtEndfalse\fi +% \end{macrocode} +% \section{Page Layout} +% (2011/05/08) The revised version of \texttt{eqexam} allows the document author +% to more easily design the size of the page; the new version makes all content +% inside the \texttt{exam} environment into a list, this gives us better control over the +% margins and spacing. +% \begin{macro}{\eqexammargin} +% (2011/05/08) Use this command to set the margin for the \texttt{exam} environment. +% \begin{macrocode} +\@ifundefined{eqemargin}{\newlength{\eqemargin}}{} +\providecommand{\prbDecPt}[1]{\def\eqe@decPointPrb{#1}} +\def\eqe@decPointPrb{.}\def\eqe@dpsepPrb{\ } +\providecommand{\prbPrtsep}[1]{\def\eqe@prtsepPrb{#1}} +\def\eqe@prtsepPrb{\ } +\providecommand{\prbNumPrtsep}[1]{\def\eqe@hspannerPrb{#1}} +\def\eqe@hspannerPrb{\ } +\newcommand{\eqexammargin}[2][\normalsize\normalfont\bfseries]{% + \settowidth{\eqemargin}{#1#2\eqe@decPointPrb\eqe@hspannerPrb}} +% \end{macrocode} +% (2011/05/08) The default margin for the \textsf{eqexam} environment, two digits and a space. +% \begin{macrocode} +\eqexammargin{00} +% \end{macrocode} +%\changes{v3.0s}{2012/01/01}{% +% Moved a copy of \cs{eqe@spannerSoln} out of the \texttt{ftbsty} to the \texttt{package} section, +% its needed here as well.} +% \begin{macrocode} +\def\eqe@hspannerSoln{\ } % space after prob number +\providecommand{\solNumPrtsep}[1]{\def\eqe@hspannerSoln{#1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\eqeSetExamPageParams} +% (2011/05/08) The default spacing maximizes the amount of space on the page. +% \begin{macrocode} +\newcommand{\eqeSetExamPageParams}{% + \setlength{\headheight}{12pt} + \setlength{\topmargin}{-.5in} + \setlength{\headsep}{20pt} + \setlength{\oddsidemargin}{0pt} + \setlength{\evensidemargin}{0pt} + \setlength{\marginparsep}{11pt} + \setlength{\marginparwidth}{35pt} + \setlength{\footskip}{11pt} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\eqExamPageLayout} +% Set the basic parameters of this exam page package +% \begin{macrocode} +\newcommand{\eqExamPageLayout}{% + \setlength\textwidth\paperwidth + \addtolength{\textwidth}{-2in} + \addtolength{\textwidth}{-\oddsidemargin} + \setlength\textheight{\paperheight} + \addtolength\textheight{-2in} + \addtolength\textheight{-\headheight} + \addtolength\textheight{-\headsep} + \addtolength\textheight{-\topmargin} + \addtolength\textheight{-\footskip} +} +% \end{macrocode} +% (2011/05/08) If \texttt{usecustomdesign} is used it is expected that +% \cs{eqe\-Set\-Exam\-Page\-Params} and \cs{eqeSetExamPageParams} are redefined in he preamble, +% otherwise, we set up the standard parameters; otherwise +% \begin{macrocode} +\ifeqcustomdesign\else +\eqeSetExamPageParams +\eqExamPageLayout +\fi +% \end{macrocode} +% \end{macro} +% A simple page layout scheme for this exam. +% \begin{macrocode} +\newcommand{\ps@eqExamheadings} +{% + \renewcommand{\@oddhead}{% + {\normalfont\normalsize\ifnum\value{page}<2 + \hfil\else\eqExamRunHead\fi}}% + \renewcommand{\@evenhead}{\@oddhead} + \renewcommand{\@oddfoot}{\settotalsbox\runExamFooter} + \renewcommand{\@evenfoot}{\@oddfoot} +} +\raggedbottom +% \end{macrocode} +% \section{Counters, Lengths and Tokens} +% Some counters to keep track of things. \DescribeEnv{eqpointsofar} +% \DescribeEnv{eqpointsthispage} The first two counters keep track, respectively, +% of the total points so far up the current page, and the number of points +% on the current page. \DescribeEnv{eq@numparts} The counter \texttt{eq@numparts} +% holds the number of parts of the multi-part question. +% \begin{macrocode} +\newcount\eqe@tempcnta +\newcounter{eqpointsofar} +\newcounter{eqpointsthispage} +\newcounter{eq@numparts} +\newcounter{eq@count} +\newtoks\partNames \partNames={} +\newlength{\eq@tmplengthA} +\newlength{\eq@tmplengthB} +\newbox{\eq@pointbox} +\newlength{\eq@pointboxtotalheight} +% \end{macrocode} +% Some scratch registers to do calc calculations. +% \begin{macrocode} +\newlength{\eqetmplengtha} +\newlength{\eqetmplengthb} +% \end{macrocode} +% \section{Some Macros to Support the Options} +% We make a few definitions to support various options. +% \begin{macrocode} +\def\PointsOnLeft{\def\@reportpoints{1}\let\marginpoints\eqleftmargin} +\def\PointsOnRight{\def\@reportpoints{2}\relax + \let\marginpoints\eqrightmarginbox} +\def\PointsOnBothSides{\def\@reportpoints{3}\relax + \let\marginpoints\eqbothmargins} +\newif\ifeqe@nopoints \eqe@nopointsfalse +\def\NoPoints{\if\isInExamEnv\eqe@NO + \eqe@nopointstrue\def\@reporttotals{0}\let\totalsbox=\hfil + \let\marginpoints\@empty\let\eq@nosummarytotals\eqe@YES\else + \PackageWarning{eqexam}{The \string\NoPoints\space ignored; + it needs to be executed\MessageBreak outside of an + exam environment}\fi} +\def\TotalsOnLeft{\def\@reporttotals{1}\def\totalsbox{\totalsboxleft}} +\def\TotalsOnRight{\def\@reporttotals{2}\def\totalsbox{\totalsboxright}} +\def\noZeroTotals{\let\eqe@zeroTotalsAllowed\eqe@NO} +\def\allowZeroTotals{\let\eqe@zeroTotalsAllowed\eqe@YES} +\allowZeroTotals +\def\NoTotals{\def\@reporttotals{0}\let\totalsbox=\hfil} +\def\SummaryTotalsOn{\let\eq@nosummarytotals\eqe@NO} +\def\SummaryTotalsOff{\let\eq@nosummarytotals\eqe@YES} +\def\eoeTotalOff{\let\eq@parttotals\eqe@NO} +\def\eoeTotalOn{\let\eq@parttotals\eqe@YES} +\def\separationruleOn{\let\eqx@separationrule\eqe@YES} +\def\separationruleOff{\let\eqx@separationrule\eqe@NO} +\def\AllowFitItIn{\global\let\eq@fititin\eqfititin} +\def\DoNotFitItIn{\global\let\eq@fititin\@gobble} +% \end{macrocode} +%\changes{v3.0p}{2011/09/22}{Added \cs{NoSolutions} to be executed in +%preamble, needed with the fortextbook package.} +% \begin{macrocode} +\def\NoSolutions{\eq@nolinktrue\eq@nosolutionstrue + \displayworkareatrue} +\@onlypreamble\NoSolutions +% \end{macrocode} +% Added \cs{chngToNoSolns}, useful for book authors that want to switch between +% \cs{AnswerKey}, \cs{chngToNoSolns}, and \cs{SolutionsAtEnd}. +% \changes{v5.0o}{2017/12/26}{Added \string\cs{chngToNoSolns}} +% \begin{macrocode} +\def\chngToNoSolns{\solutionsAtEndfalse\answerkeyfalse + \eq@proofingfalse\eq@solutionsafterfalse + \eq@nosolutionstrue\displayworkareatrue} +% \end{macrocode} +% \begin{macro}{\vspacewithkeyOn} +% \begin{macro}{\vspacewithkeyOff} +%\changes{v2.0k}{2011/04/29}{Added user interface to the switch +%\cs{ifkeepdeclaredvspacing}, which is defined in \texttt{eqexam.def}/\textsf{exerquiz}.} +% User interface to keeping the declare vspace, even when +% the \texttt{answerkey} (or \texttt{solutionsafter}) option is taken. The switch +% \cs{ifkeepdeclaredvspacing} is defined in \texttt{eqexam.def}/\textsf{exerquiz}. +% \begin{macrocode} +\def\vspacewithkeyOn{\keepdeclaredvspacingtrue} +\def\vspacewithkeyOff{\keepdeclaredvspacingfalse} +% \end{macrocode} +% \end{macro} +% \end{macro} +%\DescribeMacro{\displayPointsOn}\cmd{\displayPointsOn} displays the points, if not otherwise +% overridden and the command \DescribeMacro{\displayPointsOff}\cmd{\displayPointsOff} turns off the +% display of points. In either case, points are calculated. +% \begin{macrocode} +\newif\ifdispl@yPoints\displ@yPointstrue +\newcommand{\displayPointsOn}{\displ@yPointstrue} +\newcommand{\displayPointsOff}{\displ@yPointsfalse} +\newif\ifl@stDispl@yPoints\l@stDispl@yPointsfalse +% \end{macrocode} +% \begin{macro}{\encloseProblemsWith} +%\changes{v1.7b}{2007/21/07} +%{% +% Added \cs{encloseProblemsWith} to support the \texttt{solutionsonly} option +%} +% \cs{encloseProblemsWith} to support the \texttt{solutionsonly} option +% \begin{macrocode} +\def\encloseProblemsWith#1{% + \ifsolutionsonly\excludecomment{#1}\else + \includecomment{#1}\fi +} +% \end{macrocode} +% \end{macro} +% \section{Colors} +% \begin{macro}{\proofingsymbolColor} +% \begin{macro}{\instructionsColor} +% \begin{macro}{\eqCommentsColor} +% \begin{macro}{\universityColor} +% \begin{macro}{\titleColor} +% \begin{macro}{\authorColor} +% \begin{macro}{\subjectColor} +% \begin{macro}{\linkcolor} +% \begin{macro}{\nolinkcolor} +% \begin{macro}{\fillinColor} +% \begin{macro}{\forceNoColor} +% \begin{macro}{\eqEndExamTotalColor} +% Here we list commands for controlling colors. There are some other +% colors defined in the stand alone code. +% \changes{v1.6e}{2006/05/07} +% { +% Added easy user access to various colors, \cs{proofing\-symbol\-Color}, +% \cs{instructionsColor}, \cs{eqCommentsColor}, \cs{authorColor}, +% \cs{title\-Color}, \cs{universityColor} and \cs{subjectColor} +% } +% \begin{macrocode} +\providecommand{\proofingsymbolColor}[1]{\def\@proofingsymbolColor{#1}} +\proofingsymbolColor{red} +\providecommand{\instructionsColor}[1]{\def\@instructionsColor{#1}} +\instructionsColor{blue} +\providecommand{\eqCommentsColor}[1]{\def\@eqCommentsColor{#1}} +\eqCommentsColor{blue} +\providecommand{\eqCommentsColorBody}[1]{\def\@eqCommentsColorBody{#1}} +\eqCommentsColorBody{black} +\providecommand{\universityColor}[1]{\def\webuniversity@color{#1}} +\universityColor{blue} +\providecommand{\titleColor}[1]{\def\webtitle@color{#1}} +\titleColor{black} +\providecommand{\authorColor}[1]{\def\webauthor@color{#1}} +\authorColor{black} +\providecommand{\subjectColor}[1]{\def\websubject@color{#1}} +\subjectColor{blue} +\providecommand{\linkcolor}[1]{\def\@linkcolor{#1}} +\linkcolor{blue} +\providecommand{\nolinkcolor}[1]{\def\@nolinkcolor{#1}} +\nolinkcolor{black} +\providecommand{\eqEndExamTotalColor}[1]{\def\endexamtotal@color{#1}} +\eqEndExamTotalColor{black} +\newcommand\fillinColor[1]{\def\eq@fillinColor{#1}}\fillinColor{red} +\providecommand{\sectionColor}[1]{\def\web@sectionsColorOld{#1} + \def\aeb@sectioncolor{#1}} +\sectionColor{blue} +\def\forceNoColorSet{\proofingsymbolColor{black}% + \instructionsColor{black}% + \eqCommentsColor{black}\universityColor{black}% + \titleColor{black}\authorColor{black}% + \subjectColor{black}\linkcolor{black}% + \nolinkcolor{black}\fillinColor{black}% + \instructionsColor{black}\eqCommentsColor{black}% + \eqCommentsColorBody{black}% + \eqEndExamTotalColor{black}\ckboxColor{}% + \ckcirColor{}\if\load@web\eqe@YES + \sectionColor{black}\fi +} +\ifForceNoColor + \AtBeginDocument{\forceNoColorSet} +\fi +\newcommand{\forceNoColor}{\ifForceNoColor\else\ForceNoColortrue + \AtBeginDocument{\forceNoColorSet}\fi} +% \end{macrocode} +% The \DescribeMacro{\ckboxColor}\cs{ckboxColor} provides color for the MC and MS boxes, +% then a PDF-related option is not in effect, while \DescribeMacro{\ckcirColor}\cs{ckcirColor} +% provides color for circular checkboxes. Usually, these are black or both the same color. +%\changes{v4.9b}{2017/10/10}{Provides color for check boxes when a PDF-related option +% is not taken} +% \begin{macrocode} +\providecommand{\ckboxColor}[1]{\def\@rgi{#1}\ifx\@rgi\@empty + \let\ckbox@Color\relax\else + \def\ckbox@Color{\color{#1}}\fi}\ckboxColor{} +\providecommand{\ckcirColor}[1]{\def\eq@rgi{#1}\ifx\eq@rgi\@empty + \let\ckcir@Color\relax\else + \def\ckcir@Color{\color{#1}}\fi}\ckcirColor{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \section{Version Control} +% Here are some simple macros use to create two versions, +% version A and version B, of the same test. +% \begin{macro}{\examNum} +% Convenience macro for holding the exam number. It sets the +% value of \cs{nExam}. +% \begin{macrocode} +\def\examNum#1{\def\nExam{#1}} +\examNum{1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Exam} +% \begin{macro}{\sExam} +% Convenience macros for titling the exam. Usage: +%\begin{verbatim} +%\VersionAtext{Test~\nExam--Version A} +%\VersionBtext{Test~\nExam--Version B} +%\shortVersionAtext{T\nExam A} +%\shortVersionBtext{T\nExam B} +% +%\examNum{1} +%\forVersion{c} +%\subject[C3]{Calculus III} +%\title[\sExam]{\Exam} +%\author{Dr.\ D. P. Story} +%\end{verbatim} +% These next two definitions are overwritten by the two +% commands \cs{longTitleText} and \cs{shortTitleText}. +% \begin{macrocode} +\def\Exam{\ifAB{\eq@VersionAtext}{\eq@VersionBtext}} +\def\sExam{\ifAB{\eq@shortVersionAtext}{\eq@shortVersionBtext}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\VersionAtext} +% \begin{macro}{\VersionBtext} +% \begin{macro}{\shortVersionAtext} +% \begin{macro}{\shortVersionBtext} +% Convenience macros for entering the text for the title, long and short +% for versions A and B. +% \begin{macrocode} +\def\VersionAtext#1{\def\eq@VersionAtext{#1}} +\def\VersionBtext#1{\def\eq@VersionBtext{#1}} +\def\shortVersionAtext#1{\def\eq@shortVersionAtext{#1}} +\def\shortVersionBtext#1{\def\eq@shortVersionBtext{#1}} +\VersionAtext{Exam~\nExam--Version A} +\VersionBtext{Exam~\nExam--Version B} +\shortVersionAtext{Exam~\nExam A} +\shortVersionBtext{Exam~\nExam B} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% In this section we introduce a new set of commands that supersedes +% the commands defined above. Those commands were limited to only +% two versions. The ones below can handle up to $26$ versions. +% \begin{macrocode} +\newtoks\eqtemptokena +\newtoks\eqtemptokenb +% \end{macrocode} +% \begin{macro}{\numVersions} +% In the preamble, declare the number of versions for this document +% using \cs{numVersions}, e.g., |\numVersions{3}|. This sets the value +% of \cs{eq@nVersions} +% \begin{macrocode} +\def\numVersions#1{\ifnum#1>26\def\eq@nVersions{26}% + \PackageWarning{eqexam}{The value of \string\numVersions\space is + too large. \MessageBreak Choose a natural number less than 27} + \else\def\eq@nVersions{#1}\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\longTitleText} +% \begin{macro}{\endlongTitleText} +% \begin{macro}{\shortTitleText} +% \begin{macro}{\endshortTitleText} +% Next we state the long and short titles for our document, +% one for each of our declare number of versions given earlier. +% For example, we can use the value \cs{nExam} in out titles. Usage: +%\begin{verbatim} +% \longTitleText +% {Test~\nExam--Version A} +% {Test~\nExam--Version B} +% {Test~\nExam--Make Up} +% \endlongTitleText +% \shortTitleText +% {T\nExam A} +% {T\nExam B} +% {T\nExam MU} +% \endshortTitleText +%\end{verbatim} +% I've added markers that delimit the end of the arguments. In this +% way, the end of the list of titles can be detected, even though +% the number of titles is not the same as what is declared by the +% \cs{numVersions}. +% +% If there are more titles than what is declared, the rest are absorbed (gobbled). +% If there are fewer titles than declared, a {\LaTeX} package error is generated, +% and substitute titles are generated. +% \changes{v1.9f}{2009/10/06} +% { +% Modified \cs{longTitleText}, \cs{shortTitleText} to have an optional +% argument (A--Z;a--z). You can select a particular title from a list +% of titles. If no optional argument is passed, then the title determined +% by \cs{forVersion} is used. +% } +% Modified \cs{longTitleText} and \cs{shortTitleText} to have an optional +% argument (A--Z;a--z). You can select a particular title from a list +% of titles. If no optional argument is passed, then the title determined +% by \cs{forVersion} is used. +% \begin{macrocode} +\newcommand{\longTitleText}[1][]{% + \ifeqglobalversion\let\eq@selectedVersion@save\eq@selectedVersion + \else\let\eq@selectedVersion@save\relax\fi + \uppercase{\def\eqe@localTextTitle{#1}}% + \ifx\eqe@localTextTitle\@empty\else + \expandafter\forVersion\expandafter{\eqe@localTextTitle}\fi + \eqe@contTitleText{\Exam}{\endlongTitleText}% +} +\def\endlongTitleText{l} +\newcommand{\shortTitleText}[1][]{% + \ifeqglobalversion\let\eq@selectedVersion@save\eq@selectedVersion + \else\let\eq@selectedVersion@save\relax\fi + \uppercase{\def\eqe@localTextTitle{#1}}% + \ifx\eqe@localTextTitle\@empty\else + \expandafter\forVersion\expandafter{\eqe@localTextTitle}\fi + \eqe@contTitleText{\sExam}{\endshortTitleText}% +} +\def\endshortTitleText{s} +% \end{macrocode} +% Both title commands, above, call this macro which sets the environment +% for \cs{@gatherTitleText}, which gathers the list of titles. +% \begin{macrocode} +\def\eqe@contTitleText#1#2{% + \setcounter{eq@count}{0}% + \eqtemptokena={}\let\endtitleMarker#2 + \@gatherTitleText{#1}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% This command gathers each title and places it as the argument of a +% \cs{v} command. These are accumulated in token registers +% then saved in \cs{Exam} and \cs{sExam}. +% \begin{macrocode} +\def\@gatherTitleText#1#2{% + \def\eqe@argii{#2} + \if\endtitleMarker\eqe@argii +% \end{macrocode} +% Encountered the end marker. See if we have collected the +% correct number of titles declared. If we have collected too +% few, we note an warning in the log, and create titles. +% \begin{macrocode} + \ifnum\value{eq@count}>\eq@nVersions\let\eqe@next\relax + \else\def\eqe@next{\eq@shortTitlesFix{#1}}\fi + \else + \stepcounter{eq@count} + \eqtemptokenb=\expandafter{#2} + \xdef#1{\the\eqtemptokena\expandafter\noexpand + \csname v\Alph{eq@count}\endcsname{\the\eqtemptokenb}} + \xdef\sExam{\the\eqtemptokena\expandafter\noexpand + \csname v\Alph{eq@count}\endcsname{\the\eqtemptokenb}} + \eqtemptokena=\expandafter{#1} + \ifnum\value{eq@count}<\eq@nVersions + \def\eqe@next{\@gatherTitleText{#1}}% + \else + \def\eqe@next{% + \if\endtitleMarker\endlongTitleText + \expandafter\eqe@absorbTokensLong + \else + \expandafter\eqe@absorbTokensShort + \fi + }% + \fi + \fi + \eqe@next +} +\long\def\eqe@absorbTokensLong#1\endlongTitleText{% + \protected@xdef\Exam{\Exam}\ifx\eq@selectedVersion@save\relax + \eqe@offVersion\else\expandafter\forVersion\expandafter + {\eq@selectedVersion@save}\fi} +\long\def\eqe@absorbTokensShort#1\endshortTitleText{% + \protected@xdef\sExam{\sExam}\ifx\eq@selectedVersion@save\relax + \eqe@offVersion\else\expandafter\forVersion\expandafter + {\eq@selectedVersion@save}\fi} +% \end{macrocode} +% We have reached \cs{endtitleMarker}, but the count is still less than \cs{eq@nVersions}, +% so we'll warn the user, and create titles for user. +% \begin{macrocode} +\def\eq@shortTitlesFix#1{% + \PackageWarning{eqexam}{You have defined an insufficient number + of titles\MessageBreak for the number of versions declared in + \string\numVersions.\MessageBreak Please fix the problem}% + \stepcounter{eq@count}% + \if\endtitleMarker\endlongTitleText + \edef\eqe@tmp{\noexpand\@gatherTitleText{\noexpand#1} + {??---Title \# \the\value{eq@count}---??}% + \noexpand\endlongTitleText} + \else + \edef\eqe@tmp{\noexpand\@gatherTitleText{\noexpand#1} + {T\#\the\value{eq@count}??}\noexpand\endshortTitleText} + \fi + \addtocounter{eq@count}{-1}% + \eqe@tmp +} +% \end{macrocode} +% Here, we define \cs{ifAB} so that document under the old system +% still work properly, I hope. Usage of \cs{ifAB} at this point +% is discouraged. +% \begin{macrocode} +\def\ifAB#1#2{\if\eq@selectedVersion A#1% + \else\if\eq@selectedVersion B#2\fi\fi} +\def\eq@replaceToken#1{#1} +% \end{macrocode} +% \begin{macro}{\forVersion} +% Here is the command that does all the work. It creates alternate +% text macros for each of the versions declared using \cs{numVersions}. +% +% For example, assuming |\numVersions{3}| appeared earlier, the +% command |\forVersion{a}| (or |\forVersion{A}|) defines $3$ text commands \cs{vA}, \cs{vB} and +% \cs{vC}, each taking one argument, the text you want to display: +%\begin{verbatim} +% Name the \vA{place}\vB{date}\vC{year} of the signing of the Declaration +% of independence. +%\end{verbatim} +% Since we said |forVersion{a}| only the \cs{vA} text +% is displayed, the others are gobbled up, etc. But wait, the \cs{forVersion} +% does more than that! It also creates a series of comment environments +% |\begin{verA}/\end{verA}|, |\begin{verB}/\end{verB}|, |\begin{verC}/\end{verC}|, etc., +% where only the version for which this compile applies will be typeset, +% the others are commented out. +%\begin{verbatim} +%\numVersions{3} +%\forVersion{b} +%... +%\begin{document} +%... +% Solve the equation for $\vA{x}\vB{y}\vC{z}$: +%\[ +%\begin{verA} +% 2x + 4 = 7 +%\end{verA} +%\begin{verB} +% 5y + 2 = 4 +%\end{verB} +%\begin{verC} +% 3z - 2 = 2 +%\end{verC} +%\] +%\end{verbatim} +% \changes{1.6b}{2006/04/03} +% { +% Changed the alphabet environments \texttt{A}, \texttt{B}, etc.\ due to a +% conflict with \cs{S}, the control sequence for the \textsf{amsmath} package +% for a section: \cs{S} expands to \S. Names changed to \texttt{verA}, \texttt{verB}, etc. +% } +% \changes{v1.6f}{2006/10/24} +% { +% Fixed a bug in the \cs{eqe@initializeMultiVersions} command, made sure that any +% already defined comment environments are set to relax. +% } +% \begin{macrocode} +\newif\ifeqglobalversion \eqglobalversionfalse +\newif\ifeqlocalversion \eqlocalversionfalse +\newif\if@templocalversion \@templocalversionfalse +\def\eqe@initializeMultiVersions{% + \let\save@message\message\let\message\@gobble + \@tfor\eqe@tmp:=ABCDEFGHIJKLMNOPQRSTUVWXYZ\do{% + \expandafter\let\csname v\eqe@tmp\endcsname\@gobble + \expandafter\excludecomment\expandafter{ver\eqe@tmp}% + \expandafter\let\csname Afterver\eqe@tmp Comment\endcsname\relax + }\let\message\save@message +} +\AtBeginDocument{\let\eqe@initializeMultiVersions\relax} +% \end{macrocode} +% (09/10/04) Trying to fix a bug in the case when the version selected is greater +% then the number of versions available for a given problem; that is, when modular +% arithmetic occurs (in \cs{selectVersion}). +% \begin{macrocode} +\let\eqe@@onVersion\@empty +\def\eqe@onVersion{\g@addto@macro\eqe@@onVersion} +\let\eqe@@offVersion\@empty +\def\eqe@offVersion{\g@addto@macro\eqe@@offVersion} +\let\eqe@@holdTemp\@empty +\def\eqe@holdTemp{\g@addto@macro\eqe@@holdTemp} +% \end{macrocode} +% Two commands to turn on and off versions (the \cs{v} and the \texttt{ver} +% environment). +% +% Throughout the definitions below, we use \cs{csarg}, a command that is defined in the +% \textsf{comment} package. +% \begin{macrocode} +\def\eqe@showArg#1{#1} +\def\eqe@turnOnComment#1{% +% \csarg\let{v#1}\@empty + \csarg\let{v#1}\eqe@showArg + \edef\exp@temp{\noexpand\includecomment{ver#1}}\exp@temp +} +\def\eqe@turnOffComment#1{% + \csarg\let{v#1}\@gobble + \edef\exp@temp{\noexpand\excludecomment{ver#1}}\exp@temp + \csarg\let{Afterver#1Comment}\relax +} +% \end{macrocode} +% Finally, the \cs{forVersion} command. \DescribeMacro{\selVersion}\cmd{\selVersion} +% holds the version selected in upper-case. +% \begin{macrocode} +\def\forVersion#1% +{% + \eqe@initializeMultiVersions + \let\eqe@@onVersion\@empty + \let\eqe@@offVersion\@empty + \global\eqglobalversiontrue + \setcounter{eq@count}{0}% + \uppercase{\edef\eq@selectedVersion{#1}}% + \edef\selVersion{\eq@selectedVersion}% + \@ifundefined{eq@nVersions}{\PackageInfo{eqexam}{% + \string\numVersions\space has not been declared, \MessageBreak + taking the number of versions to be 2.}\def\eq@nVersions{2}}{}% + \loop + \stepcounter{eq@count}% + \expandafter\if\Alph{eq@count}\eq@selectedVersion + \xdef\eq@nSelectedVersion{\the\value{eq@count}}% + \setcounter{eq@count}{27}\fi + \ifnum\value{eq@count}<26\repeat + \ifnum\eq@nSelectedVersion >\eq@nVersions + \PackageError{eqexam} + {The value of \string\forVersion + \space(\eq@selectedVersion)\MessageBreak + exceeds the value of \string\numVersions\space + (\eq@nVersions)}% + {Decrease the value of \string\forVersion.}% + \fi + \setcounter{eq@count}{0}% + \let\save@message\message\let\message\@gobble + \loop + \stepcounter{eq@count}% + \csarg\let{After\Alph{eq@count}Comment}\relax + \lowercase + {% + \if#1\alph{eq@count}% + \eqe@turnOnComment{\Alph{eq@count}}% +% \end{macrocode} +% (09/10/04) Save the commands for turning on the version with +% \cs{eqe@onVersion}, and for turning it off with +% \cs{eqe@offVeresion}. +% \begin{macrocode} + \edef\temp@exp{\noexpand + \eqe@turnOnComment{\Alph{eq@count}}}% + \expandafter\eqe@onVersion\expandafter{\temp@exp}% + \edef\temp@exp{\noexpand + \eqe@turnOffComment{\Alph{eq@count}}}% + \expandafter\eqe@offVersion\expandafter{\temp@exp}% + \else + \eqe@turnOffComment{\Alph{eq@count}}% + \fi + }% + \ifnum\value{eq@count}<\eq@nVersions\repeat + \let\message\save@message +} +% \end{macrocode} +% Let us assume version A initially, user with reset this in document. +%\changes{1.6c}{2006/05/02} +%{% +% At the end of the package, set the initial value of \cs{select\-Version} to +% \string\verb!*+\string\selectVersion{26}+ and set the initial value +% of \cs{forVersion} to \string\verb!*+\string\forVersion{A}+. +%} +% \begin{macrocode} +\AtEndOfPackage{\numVersions{26}\forVersion{A}% + \eq@renditionOptions} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\selectVersion} +% When an exam has questions in which the number of variations are not all the same, +% then you can locally change the version between problems. +% If the first argument is empty, the first variation is chosen. +% The syntax is +%\begin{verbatim} +%\selectVersion{2}{3} +%\end{verbatim} +%This command says that the next problem has 3 variations, and here we select the second one. +%\changes{1.6a}{2006/01/22} +% {% +% added \cs{selectVersion} command, also the command was fixed \cs{forVersion} so that it can be changed +% within the document, added switches to control new selection. +% } +%\changes{v3.7}{2015/02/11}{Worked on the logic} +% \begin{macrocode} +\def\selectVersion#1#2{% #1 \le #2 + \xdef\nLocalSelection{#1}\xdef\nLocalVersions{#2}% +% \end{macrocode} +% If obey local version is in effect and the local selection is not empty, +% no modular arithmetic is needed in the first loop below +% of \cs{nLocalSelection}. +% \begin{macrocode} + \let\needsModArith\eqe@YES + \ifeqobeylocalversion\ifx\nLocalSelection\@empty\else + \let\needsModArith\eqe@NO\fi\fi +% \end{macrocode} +% When the solutions appear at the end of the document, the version may not match +% the version for the question. We need to use a private hook defined in +% \textsf{exerquiz} (and \texttt{eqexam.def}) to reproduce the same settings going into +% each solution at the end. So, we write the \cs{selectVersion} to the solution +% file. +% \begin{macrocode} + \edef\exer@solnheadhook{% + \string\selectVersion{#1}{#2}}% +% \end{macrocode} +% Turn off messaging. +% \begin{macrocode} + \let\save@message\message\let\message\@gobble +% \end{macrocode} +% Reset the selected version, the one selected in the preamble. A previous problem +% may have changed the version due to modular arithmetic. +% \begin{macrocode} + \eqe@@onVersion + \ifx\eqe@@holdTemp\@empty\else +% \end{macrocode} +% If \cs{eqe@holdTemp} is non-empty, this means that modular +% arithmetic was performed on the previous problem. We need to turn +% on the original choice, and turn off the temporary choice, then +% clear the command \cs{eqe@@holdTemp}. +% \begin{macrocode} + \eqe@@onVersion\eqe@@holdTemp + \let\eqe@@holdTemp\@empty + \fi +% \end{macrocode} +% If \cs{eqglobalversion} is \texttt{true}, then a \cs{forVersion} +% has been executed. If the number of versions declared by +% \cs{numVersions} is greater than the number of local versions for +% this problem, then we perform modular arithmetic to get an +% appropriate alternative. It may be necessarily to temporarily put +% \cs{eqobeylocalversion} to true to accomplish, but we use change it +% back at the end. +% \begin{macrocode} +\ifx\needsModArith\eqe@YES + \ifeqglobalversion\ifnum\eq@nSelectedVersion>\nLocalVersions +% \end{macrocode} +% If we perform modular arithmetic, turn off original choice. +% \begin{macrocode} + \eqe@@offVersion +% \end{macrocode} +% Now perform mod arithmetic +% \begin{macrocode} + {\count0=\eq@nSelectedVersion \count2=\count0 + \advance\count0by-1 \divide\count0by\nLocalVersions + \multiply\count0by\nLocalVersions %\count2=\eq@nSelectedVersion + \advance\count2by-\count0 + \xdef\nLocalSelection{\the\count2 }% + \ifeqobeylocalversion\else + \global\@templocalversiontrue + \global\eqobeylocalversiontrue\fi}% + \global\let\eqe@@holdTemp\@empty + \fi\fi +\fi + \ifeqobeylocalversion + \global\eqlocalversiontrue + \setcounter{eq@count}{0}% +% \end{macrocode} +% If local selection is empty, use the version requested by \cs{forVersion}, +% modular arithmetic may have to be performed. +% arithmetic to resolve the matter +% \begin{macrocode} + \ifx\nLocalSelection\@empty + \def\nLocalSelection{\eq@nSelectedVersion}% + \fi +% \end{macrocode} +% If local selection exceeds number of local versions, use modular +% arithmetic to resolve the matter +% \begin{macrocode} + \ifnum\nLocalSelection>\nLocalVersions + {\count0=\nLocalSelection + \count2=\count0 + \advance\count0by-1 \divide\count0by\nLocalVersions + \multiply\count0by\nLocalVersions + \advance\count2by-\count0 + \xdef\nLocalSelection{\the\count2 }}% + \fi + \let\save@message\message\let\message\@gobble + \loop + \stepcounter{eq@count}% + \csarg\let{Afterver\Alph{eq@count}Comment}\relax + \lowercase + {% + \ifnum\value{eq@count}=\nLocalSelection + \eqe@turnOnComment{\Alph{eq@count}}% + \edef\temp@exp{\noexpand + \eqe@turnOffComment{\Alph{eq@count}}}% + \expandafter\eqe@holdTemp\expandafter{\temp@exp}% + \else + \eqe@turnOffComment{\Alph{eq@count}}% + \fi + }% + \ifnum\value{eq@count}<\nLocalVersions\repeat + \let\message\save@message + \fi + \if@templocalversion\global\eqobeylocalversionfalse\fi +% \end{macrocode} +% added 09/10/03 reset back to default +% \begin{macrocode} + \@templocalversionfalse + \let\message\save@message +} +% \end{macrocode} +% \end{macro} +% \section{Title Definitions from Web} +% \begin{macro}{\title} +% \begin{macro}{\subject} +% \begin{macro}{\author} +% \begin{macro}{\email} +% \begin{macro}{\keywords} +% \begin{macro}{\university} +% Make Title Definitions taken from the \texttt{Web} package. This is +% to maintain compatibility with \texttt{Web}. +% \begin{macrocode} +\@ifpackageloaded{web}{}{% + \@ifpackageloaded{hyperref}{}{\let\texorpdfstring\@firstoftwo}% + \let\web@save@title\title + \def\title{\@ifnextchar[{\@web@title}{\@web@title[]}} + \def\@web@title[#1]#2{\gdef\webtitle{#2}% + \@ifundefined{hypersetup}{}{\hypersetup{pdftitle={#2}}}% + \def\webArg{#1}\ifx\webArg\@empty\gdef\shortwebtitle{#2}\else + \gdef\shortwebtitle{#1}\fi\web@save@title{#2}} + \let\web@saved@author\author + \def\author#1{\gdef\webauthor{#1}% + \@ifundefined{hypersetup}{}{\hypersetup{pdfauthor={#1}}}% + \web@saved@author{#1}} + \def\subject{\@ifnextchar[{\@subject}{\@subject[]}} + \def\@subject[#1]#2{\def\webArg{#1}% + \ifx\webArg\@empty\gdef\shortwebsubject{#2}\else + \gdef\shortwebsubject{#1}\fi\gdef\websubject{#2}% + \@ifundefined{hypersetup}{}{\hypersetup{pdfsubject={#2}}}} + \def\email#1{\gdef\webemail{#1}} + \def\keywords#1{\gdef\webkeywords{#1}% + \@ifundefined{hypersetup}{}{\hypersetup{pdfkeywords={#1}}}} + \def\university#1{\gdef\webuniversity{#1}} + \def\copyrightyears#1{\gdef\webcopyrightyears{#1}} + \def\version#1{\gdef\web@version@value{#1}% + \edef\webversion{\ifx\web@version@value\@empty\else + \noexpand\web@versionlabel\noexpand\ + \noexpand\web@version@value\fi}% + } + \let\web@version@value\@empty + \def\versionLabel#1{\def\web@versionlabel{#1}} + \versionLabel{Version} + \def\web@toc{Table of Contents} + \def\web@continued{cont.} +% set some defaults + \title{}\author{}\email{}\subject{}\keywords{}\university{} + \providecommand{\optionalPageMatter}[2][]{% + \def\optionalpagematter{#2}} + \def\optionalpagematter{} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\date} +% {\LaTeX} (\TeX) defines a \cs{date} command that is also used by \textsf{eqexam}. +% \begin{macrocode} +\def\duedate#1{\def\theduedate{#1}} +\duedate{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\duedate} +% In addition to these, we also define a \cs{duedate} macro, may be useful for +% writing assignments with a due date. +% \begin{macrocode} +\def\duedate#1{\def\theduedate{#1}} +\duedate{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thisterm} +% The command \cs{thisterm} can be used in the \cs{date} field to indicate the term +% of this test, for example, \verb!\date{\thisterm, \the\year}! This command may +% be redefined to conform to your own academic terms. +% \begin{macrocode} +\newcommand\thisterm{% +% if prior to June (Jan--May) + \ifnum\month<6Spring\else +% if prior to August (June-July) + \ifnum\month<8Summer\else +% August or later; if Sept--Dec + \ifnum\month>8Fall\else +% Month of August; if after 25th + \ifnum\day>25Fall\else +% if it's 25th or earlier in month of August + Summer\fi\fi\fi\fi +} +% \end{macrocode} +% \end{macro} +% \section{Identification Information} +% We define a series of commands in support of building an exam: Lines to identify +% the student and his/her student id (SID), the instructors email address, the name of the +% test and the course. +%\par\medskip +%\noindent\DescribeMacro{\eqExamName}\DescribeMacro{\examNameLabel} provides a line for the student to enter his/her name into the +% exam. The command \cs{examNameLabel} can be used to define the name label, the default +% is \texttt{Name:} +% +% Will insert a text box as well if the \texttt{option} is taken in addition +% to \texttt{nosolutions} and with \texttt{solutionsafter} not taken. +% This macro defines \cs{eq@ExamName}, which actually contains the code. +% The first (optional) parameter is passed to \cs{insTxtFieldIdInfo}, and can be +% used to change the appearance of the text field created; the second required parameter +% is the width of the field. +% \begin{macrocode} +\newcommand{\examAnsKeyLabel}[1]{% + \def\@examAnsKeyLabel{\ifanswerkey\space #1\fi}} +\examAnsKeyLabel{Answer Key} +\newcommand\examNameLabel[1]{\gdef\@examNameLabel{#1\@examAnsKeyLabel}} +\examNameLabel{Name:} +\newcommand{\idinfoHighlight}[1]{\def\eqe@idinfohl{#1}} +\idinfoHighlight{\underbar} +\newcommand\eqExamName[2][]{% + \def\eqExamName@argi{#1}\def\eqExamName@argii{#2}} +\def\eq@ExamName{\bgroup + \settowidth\eq@tmplengthA{\@examNameLabel\ }% + \@tempdima=\eqExamName@argii\relax + \advance\@tempdima by-\eq@tmplengthA + \eqe@idinfohl{\makebox[\eqExamName@argii][l]{\@examNameLabel}}% + \expandafter\insTxtFieldIdInfo\expandafter[\eqExamName@argi]% + {\@tempdima}{IdInfo.Name}\egroup} +% \end{macrocode} +% Here we set the field to be a required field with width of $2.25$ inches +% \begin{macrocode} +\eqExamName[\Ff\FfRequired]{2.25in} +% \end{macrocode} +% \DescribeMacro{\eqSID} provides a line for the student to enter his/her ID number (SID). +% +% Will insert a text box as well if the \texttt{option} is taken in addition +% to \texttt{nosolutions} and with \texttt{solutionsafter} not taken. +% The first (optional) parameter is passed to \cs{insTxtFieldIdInfo}, and can be +% used to change the appearance of the text field created; the second required parameter +% is the width of the field. +% \begin{macrocode} +\newcommand\examSIDLabel[1]{\gdef\@examSIDLabel{#1}} +\examSIDLabel{SID:} +\newcommand\eqSID[2][]{\def\eqSID@argi{#1}\def\eqSID@argii{#2}} +\def\eq@SID{\bgroup\settowidth\eq@tmplengthA{\@examSIDLabel\ }% + \@tempdima=\eqSID@argii\relax\advance\@tempdima by-\eq@tmplengthA + \eqe@idinfohl{\makebox[\eqSID@argii][l]{\@examSIDLabel}}% + \expandafter\insTxtFieldIdInfo\expandafter[\eqSID@argi]% + {\@tempdima}{IdInfo.SID}\egroup} +% \end{macrocode} +% Here we set the field to be a required field with width of $2.25$ inches +% \begin{macrocode} +\eqSID[\Ff\FfRequired]{2.25in} +% \end{macrocode} +% \DescribeMacro{\eqEmail} provides a line for the student +% to enter his/her email address. Useful for documents submitted by email, the +% instructor can reply. +% +% Will insert a text box as well if the \texttt{option} is taken in addition +% to \texttt{nosolutions} and with \texttt{solutionsafter} not taken. +% The first (optional) parameter is passed to \cs{insTxtFieldIdInfo}, and can be +% used to change the appearance of the text field created; the second required parameter +% is the width of the field. +% \begin{macrocode} +\newcommand\examEmailLabel[1]{\gdef\@examEmailLabel{#1}} +\examEmailLabel{Email:} +\newcommand\eqEmail[2][]{% + \def\eqExam@argi{#1}\def\eqEmail@argii{#2}} +\gdef\eq@Email{\bgroup\settowidth\eq@tmplengthA{\@examEmailLabel\ }% + \@tempdima=\eqEmail@argii\relax\advance\@tempdima by-\eq@tmplengthA + \underbar{\makebox[\eqEmail@argii][l]{\@examEmailLabel}}% + \expandafter\insTxtFieldIdInfo\expandafter[\eqEmail@argi]% + {\@tempdima}{IdInfo.email}\egroup} +% \end{macrocode} +% Here we set the field to be a field with width of $2.25$ inches. (Not set to be a required field.) +% \begin{macrocode} +\eqEmail{2.25in} +% \end{macrocode} +% \DescribeMacro{\insTxtFieldIdInfo} The above macros (\cs{eqExamName}, \cs{eqSID} and \cs{eqEmail}) +% all call this macro, which inserts a Acroforms text field if the \texttt{option} is taken in addition +% to \texttt{nosolutions} and with \texttt{solutionsafter} not taken. +% +% The first (optional) parameter is used to change the appearance of the text field. +% The second parameter is the width of the field, and the third is the field name. +% \begin{macrocode} +\def\insTxtFieldIdInfo[#1]#2#3{% + \@ifundefined{@quiz}{}{\if\eq@online\eqe@YES + \ifeq@nosolutions\ifeq@solutionsafter\else + \raisebox{-1bp}{\makebox[0pt][r]{% + \textField[\BC{}#1]{#3}{#2}{11bp}}}% + \fi\fi\fi + }% +} +% \end{macrocode} +% \DescribeMacro{\SubmitInfo} is required when the \texttt{email} option is taken, +% and should appear in the preamble. The first argument is the URL to the \textsf{eqAttach.asp} +% code on the server, and the second is the email of the instructor is to receive the results. +% (Multiple recipients can be specified by separating each with a comma.) +% \begin{macrocode} +\def\SubmitInfo#1#2{% + \def\EqExam@SubmitURL{#1}\def\@EmailInstr{#2}% +} +% \end{macrocode} +% \DescribeMacro{\EmailCourseName} is used to specify the course name of the course. The default +% value for this is \cs{websubject}, obtained from the \cs{subject} macro used in the preamble; however, +% if you want a different name in the email, perhaps with more information included, you can redefine +% the value using this macro. +% \begin{macrocode} +\def\EmailCourseName#1{\def\@EmailCourseName{#1}} +% \end{macrocode} +% Here's the default value. +% \begin{macrocode} +\EmailCourseName{\websubject} +% \end{macrocode} +% \DescribeMacro{\EmailExamName} is used to specify the exam name of the course. The default +% value for this is \cs{webtitle}, obtained from the \cs{title} macro used in the preamble; however, +% if you want a different name in the email, perhaps with more information included, you can redefine +% the value using this macro. +% (Multiple recipients can be specified by separating each with a comma.) +% \begin{macrocode} +\def\EmailExamName#1{\def\@EmailExamName{#1}} +% \end{macrocode} +% Here's the default value. +% \begin{macrocode} +\EmailExamName{\webtitle} +% \end{macrocode} +% \DescribeMacro{\EmailSubject} The document author mail want a custom subject in the email, instead +% of the standard one. By using this macro, he can design his own email subject. +% \begin{macrocode} +\def\EmailSubject#1{\def\@EmailSubject{#1}} +% \end{macrocode} +% Here's the default value, which generates no custom subject line. +% \begin{macrocode} +\EmailSubject{} +% \end{macrocode} +% In this case \textsf{eqAttach.asp} inserts the standard one. +%\begin{verbatim} +%Exam Results: \webtitle of \websubject +%\end{verbatim} +% The email would read like ``\texttt{Exam Results:~Test 1 of Calculus I}'', for example. +% +% \DescribeMacro{\ServerRetnMsg} Unless submitted in \texttt{silent} mode, the \textsf{eqAttach.asp} +% returns a message acknowledging the receipt of the data. \cs{ServerRetnMsg} is used to customize +% this message. +% \begin{macrocode} +\def\ServerRetnMsg#1{\def\@ServerRetnMsg{#1}} +% \end{macrocode} +% Here's the default value, which generates no custom return message +% \begin{macrocode} +\ServerRetnMsg{} +% \end{macrocode} +% \noindent\DescribeMacro{\SubmitButtonLabel} is the label that appears on the submit button. +% \begin{macrocode} +\def\SubmitButtonLabel#1{\def\@SubmitButtonLabel{#1}} +% \end{macrocode} +% Here's the default value. +% \begin{macrocode} +\SubmitButtonLabel{Submit} +% \end{macrocode} +% \DescribeMacro{\SubmitButton} is the macro that provides the submit button +% when the \texttt{email} option is taken. It appears automatically at the top of +% the first page of the exam, and appears only if \texttt{nosolutions} has has been +% taken, and \texttt{solutionsafter} has not been taken. +% \begin{macrocode} +\let\priorSubmitJS\@gobble +\let\postSubmitJS\@empty +\def\SubmitButton +{% + \ifx\use@email\eqe@YES\ifeq@nosolutions\ifeq@solutionsafter\else + \makebox[0pt][l]{\pushButton + [\CA{\@SubmitButtonLabel}\A{\JS{% + var _eqEok2Submit = true;\r + var aSubmitFields = new Array("eqexam", "IdInfo");\r + \priorSubmitJS\r + if(_eqEok2Submit) this.submitForm("\EqExam@SubmitURL", + true, false, aSubmitFields);\r + \postSubmitJS + }}]{Submit}{1.5in}{16bp}}% + \makebox[0pt][l]{\textField[\F\FHidden\DV{\@EmailInstr} + \V{\@EmailInstr}]{IdInfo.mailTo}{11bp}{11bp}}% + \makebox[0pt][l]{\textField[\F\FHidden\DV{\@EmailCourseName} + \V{\@EmailCourseName}]{IdInfo.courseName}{11bp}{11bp}}% + \makebox[0pt][l]{\textField[\F\FHidden\DV{\@EmailExamName} + \V{\@EmailExamName}]{IdInfo.examName}{11bp}{11bp}}% + \makebox[0pt][l]{\textField[\F\FHidden\DV{\@EmailSubject} + \V{\@EmailSubject}]{IdInfo.subject}{11bp}{11bp}}% + \makebox[0pt][l]{\textField[\F\FHidden\DV{\@ServerRetnMsg} + \V{\@ServerRetnMsg}]{IdInfo.retnmsg}{11bp}{11bp}}% + \fi\fi\fi +} +% \end{macrocode} +% \begin{macrocode} +\def\thequizno{\if\probstar*\Alph{quizno}\else\alph{quizno}\fi} +\def\linkContentFormat{% + \if\probstar*\Alph{quizno}\else\alph{quizno}\fi} +\def\linkContentWrapper{(\hfil\linkContentFormat\hfil)}% +\def\Ans@r@l@Defaults +{% + \BC{}\S{S}\W{1}\Ff{\FfNoToggleToOff} + \textSize{12}\textColor{0 g} +} +% \end{macrocode} +% (2014/03/12) Added \verb!\eq@hspanner\ignorespaces!, in the next two commands. Fixes +% problems with spacing following the choice box. +% \begin{macrocode} +\newcommand{\optsRadioBtnf}[1]{\def\eqe@optsRadiof{#1}} +\newcommand{\optsRadioBtnl}[1]{\def\eqe@optsRadiol{#1}} +\let\eqe@optsRadiof\@empty\let\eqe@optsRadiol\@empty +\def\eqExam@Ans@sq@l{\leavevmode + \if\eq@listType1\stepcounter{quizno}\else\ifwithinsoldoc + \stepcounter{quizno}\else\refstepcounter{quizno}\fi\fi + \PBS\raggedright\settowidth{\eq@tmplength}{\eq@lw@l}% + \sbox{\eq@tmpbox}{\eq@l@l}\eq@tmpdima=\wd\eq@tmpbox + \def\link@@Content{\linkContentWrapper}% + \hangindent=\eq@tmplength\hangafter=1\relax + \edef\fieldName{% + \if\probstar*eqexam.\curr@quiz.\theeqquestionnoi.part\thepartno% + \else + eqexam.\curr@quiz.\theeqquestionnoi% + \fi + }% + \if\eq@online\eqe@YES\relax + \makebox[0pt][l]{% + \radio@@Button{\presets{\eqe@optsRadiol}}{\fieldName}% + {\eq@tmpdima}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% + {\eq@protect\A}{\eq@setWidgetProps\eq@l@check@driver}% + {\Ans@r@l@Defaults\every@RadioButton\every@qRadioButton}}% + \else + \edef\@linkcolor{\@nolinkcolor}% + \fi + \ifeq@nosolutions\edef\@linkcolor{\@nolinkcolor}\fi + \textcolor{\@linkcolor}{\makebox[\eq@tmpdima]{\link@@Content}}% + \Ans@proofing{\eq@tmpdima}% + \eq@hspanner\ignorespaces +} +\def\eqExam@Ans@sq@f{\if\eq@listType1\stepcounter{quizno}\else + \ifwithinsoldoc\stepcounter{quizno}\else\refstepcounter{quizno}\fi\fi + \PBS\raggedright\settowidth{\eq@tmplength}{\eq@lw@f}% + \eq@tmpdima=\wd\eq@tmpbox% + \hangindent=\eq@tmplength\hangafter=1\relax + \if\eq@online\eqe@NO\previewtrue + \insertGrayLetters + \Ans@sq@f@driver + \else + \ifanswerkey\previewtrue + \Ans@sq@f@driver + \else + \edef\fieldName{% + \if\probstar*eqexam.\curr@quiz.\theeqquestionnoi.% + part\thepartno% + \else + eqexam.\curr@quiz.\theeqquestionnoi% + \fi + }\insertGrayLetters + \radio@@Button{\presets{\eqe@optsRadiof}}% + {\fieldName}{\RadioFieldSize}% + {\RadioFieldSize}{\Ans@choice\alph{quizno}}{\eq@protect\A}% + {\eq@setWidgetProps\eq@RadioCheck@driver}% + {\@@Ans@sq@f@Defaults\Ans@sq@f@Actions\every@RadioButton + \every@sqRadioButton\insert@circlesymbol}% + \fi + \fi + \Ans@proofing{\RadioFieldSize}% + \eq@hspanner\ignorespaces +} +\newcommand{\optsCkBxf}[1]{\def\eqe@optscbf{#1}} +\newcommand{\optsCkBxl}[1]{\def\eqe@optscbl{#1}} +\let\eqe@optscbl\@empty\let\eqe@optscbf\@empty +\def\eqExam@Ans@ck@sq@l{\leavevmode + \if\eq@listType1\stepcounter{quizno}\else + \ifwithinsoldoc\stepcounter{quizno}\else\refstepcounter{quizno}\fi\fi + \PBS\raggedright\settowidth{\eq@tmplength}{\eq@lw@l}% + \sbox{\eq@tmpbox}{\eq@l@l}\eq@tmpdima=\wd\eq@tmpbox + \def\link@@Content{\linkContentWrapper}% + \hangindent=\eq@tmplength\hangafter=1\relax + \edef\fieldName{% + \if\probstar*eqexam.\curr@quiz.\theeqquestionnoi.% + part\thepartno.\alph{quizno}% + \else + eqexam.\curr@quiz.\theeqquestionnoi.\alph{quizno}% + \fi + }% + \if\eq@online\eqe@YES\relax + \makebox[0pt][l]{\check@@Box{\presets{\eqe@optscbl}}{\fieldName}% + {\eq@tmpdima}{\RadioFieldSize}{\Ans@choice\alph{quizno}}% + {\eq@protect\A}{\eq@setWidgetProps\eq@l@check@driver}% + {\Ans@r@l@Defaults\every@RadioButton\every@qRadioButton}}% + \else + \edef\@linkcolor{\@nolinkcolor}% + \fi + \ifeq@nosolutions\def\@linkcolor{\@nolinkcolor}\fi + \textcolor{\@linkcolor}{\makebox[\eq@tmpdima]{\link@@Content}}% + \Ans@proofing{\eq@tmpdima}% + \eq@hspanner\ignorespaces +} +\def\eqExam@Ans@ck@sq@f{\if\eq@listType1\stepcounter{quizno}\else + \ifwithinsoldoc\stepcounter{quizno}\else\refstepcounter{quizno}\fi\fi + \PBS\raggedright\settowidth{\eq@tmplength}{\eq@lw@f}% + \eq@tmpdima=\wd\eq@tmpbox% + \hangindent=\eq@tmplength\hangafter=1\relax + \if\eq@online\eqe@NO\previewtrue + \insertGrayLetters + \Ans@sq@f@driver + \else + \ifanswerkey\previewtrue + \Ans@sq@f@driver + \else + \edef\fieldName{% + \if\probstar*eqexam.\curr@quiz.\theeqquestionnoi.% + part\thepartno.\alph{quizno}% + \else + eqexam.\curr@quiz.\theeqquestionnoi.\alph{quizno}% + \fi + }\insertGrayLetters + \mbox{\check@@Box{\presets{\eqe@optscbf}}{\fieldName}% + {\RadioFieldSize}{\RadioFieldSize}% + {\Ans@choice\alph{quizno}}{\eq@protect\A}% + {\eq@setWidgetProps\eq@RadioCheck@driver}% + {\@@Ans@sq@f@Defaults\Ans@sq@f@Actions\every@RadioButton + \every@sqRadioButton}}% + \fi + \fi + \Ans@proofing{\RadioFieldSize}% + \eq@hspanner\ignorespaces +} +% \end{macrocode} +% \DescribeMacro{\optsMlTextField} is used to pass options to the multiline +% text field. +% \begin{macrocode} +\def\optsMlTextField#1{\def\eqe@optsmltf{#1}} +\let\eqe@optsmltf\@empty +\def\eqExamPriorVspace#1{% + \edef\fieldName{% + \if\probstar*eqexam.\curr@quiz.% + \theeqquestionnoi.part\thepartno.solution% + \else + eqexam.\curr@quiz.\theeqquestionnoi.solution% + \fi + }% + \nobreak\noindent\textField[\BC{}\presets{\eqe@optsmltf} + \Ff\FfMultiline]{\fieldName}{\linewidth}{#1}\@gobble +} +% \end{macrocode} +% +% Test to see if \texttt{exerquiz} is loaded. If not, we input +% the `stand alone', \texttt{eqalone.def}, followed by \texttt{eqexam.def}. The latter +% definition file is maintained in \texttt{exerquiz.dtx} under the \texttt{eqexam} option. +% +% \begin{macrocode} +\@ifpackageloaded{exerquiz}{% + \let\Ans@sq@l\eqExam@Ans@sq@l + \let\Ans@sq@f\eqExam@Ans@sq@f + \let\Ans@ck@sq@l\eqExam@Ans@ck@sq@l + \let\Ans@ck@sq@f\eqExam@Ans@ck@sq@f + \def\eqexheader@wrapper{\makebox[0pt][r]{% + \hypertarget{qex.\the@exno}{\eqexheader}}}% + \if\eq@online\eqe@YES\relax + \newcounter{@cntfillin}% + \let\eqPriorVspace\eqExamPriorVspace + \fi +}% +{% + \input{eqalone.def} + \input{eqexam.def} +% \end{macrocode} +% \changes{v4.9}{2017/03/16}{Updated \string\pkg{eqexam} to reflect changes in \string\texttt{eqexam.def}.} +% \begin{macrocode} + \@ifl@ter{def}{eqexam}{\eqexamdefReq}{} + {\PackageWarningNoLine{eqexam} + {This version of eqexam requires eqexam.def\MessageBreak + dated \eqexamdefReq\space or later}} + \def\eqexheader@wrapper{\makebox[0pt][r]{\eqexheader}} +} +% \end{macrocode} +% We wrote \verb!\begin{eqequestions}! to the top of the solutions file (\cs{jobname.sol}. +% \begin{macrocode} +%\writeBeginEqeQuestions +% \end{macrocode} +% If the \texttt{vspacewithsolns} is in effect, we write solutions to the end of the document. +% \begin{macrocode} +\AtBeginDocument{% + \ifvspacewithsolns\writeAllAnsAtEnd\else + \ifeqfortextbook\writeAllAnsAtEnd\else + \writeWithSolDocTrue\fi\fi +} +% \end{macrocode} +% We execute \cs{vspacewithkeyOff}, which sets \cs{ifkeepdeclaredvspacing} to false, +% the default behavior of \textsf{eqexam} before the new feature. +% \begin{macrocode} +\vspacewithkeyOff +% \end{macrocode} +% \begin{macrocode} +% +% \end{macrocode} +% \section{Stand alone Code} +% +% \begin{macrocode} +%<*standalone> +% \end{macrocode} +% Now we begin the listing of the stand alone code. This code is necessary if +% \textsf{exerquiz} has not been loaded, which is the case if there is no \textsf{PDF} options +% or if the \texttt{pdf} option is taken. +% +% Many of the following definitions are given in \texttt{eforms}, which was recently separated +% from \texttt{exerquiz} and is now maintained as a separate package. +% \begin{macrocode} +\ProvidesFile{eqalone.def} + [2012/25/01 v3.0t Minimal code used by eqexam (dps)] +\@ifundefined{eq@tmpbox}{\newsavebox{\eq@tmpbox}}{}% defined in eforms +\@ifundefined{eq@tmpdima}{\newdimen\eq@tmpdima}{} % defined in eforms +\def\RadioFieldSize{11bp} +% \end{macrocode} +% \begin{macrocode} +\newdimen\eqcenterWidget +% \end{macrocode} +% This macro is used to vertically center the response box on the line. Seems to +% work well. +% \begin{macrocode} +\def\centerWidget +#1{% + \eqcenterWidget=#1 + \eqcenterWidget=.5\eqcenterWidget + \advance\eqcenterWidget by-4bp +} +% \end{macrocode} +% \DescribeMacro{\eqe@Bbox}When the \texttt{preview} option has been used, draw a frame box +% around the bounding rectangle. +% \begin{macrocode} +\def\eqe@BboxRect#1#2{\hbox{\ckbox@Color\vbox{\hrule width #1 + \hbox to#1{\vrule height#2\hfill\vrule height#2}\vfill\hrule}}} +\def\useRectForMC{\let\Bbox\eqe@BboxRect} +\def\selectedMC{\useRectForMC} +% \end{macrocode} +% \DescribeMacro{\Rect} is used internally to color a link. +% \begin{macrocode} +\def\Rect#1{\textcolor{\@linkcolor}{#1}} +% \end{macrocode} +% The auxiliary file \texttt{eqexam.def}, created by \textsf{exerquiz}, writes +% \DescribeMacro{\ReturnTo}\cs{ReturnTo} to the \textsf{SOL} file +% in the form \verb!\ReturnTo{page.1}{\mbox{}}!. We want to remove the +% \cs{mbox} because it causes, at times, more vertical space that is wanted +% in an exam document. +% \begin{macrocode} +\def\eqe@striphbox\mbox#1{#1} +\newcommand{\ReturnTo}[2]{\eq@fititin{\eqe@striphbox#2}} +% \end{macrocode} +%\section{Switching proofing symbols} +% \DescribeMacro{\proofingsymbol} The definition of the proofing symbol, this +% symbol marks the correct answer of a multiple choice question when the +% \texttt{proofing} option is used. +% \begin{macrocode} +\newcommand{\proofingsymbol}[1]{% + \def\@proofingsymbol{\textcolor{\@proofingsymbolColor}{#1}}} +% \end{macrocode} +% This is the answers macro for the link-style and is called from the \texttt{eqexam.def} file. +% \begin{macrocode} +% +% \end{macrocode} +% \begin{macrocode} +%<*package> +% \end{macrocode} +% In response to the \texttt{allowcircmc}, we load \texttt{lcircle10} and use the `h' and `x' +% glyph. +% \begin{macrocode} +\def\selectedMC{\useRectForMC} +\ifallowcircmc + \font\eqe@lcir=lcircle10 at 12pt + \bgroup +% \end{macrocode} +% Get the width of the `h', the circle has zero height and depth. Set the +% diameter and radius of the circle. +% \begin{macrocode} + \setbox0=\hbox{\eqe@lcir h} + \xdef\eqe@cirDiam{\the\wd0} + \@tempdima=.5\wd0 + \xdef\eqe@cirRadius{\the\@tempdima} + \egroup +% \end{macrocode} +% A command to use the circle (h) and the filled circle (x). +% \begin{macrocode} + \def\circ@Glyph#1#2{\hbox{\smash{\raisebox{\eqe@cirRadius}% + {\makebox[\eqe@cirDiam]{\llap{\ckcir@Color + \rlap{\eqe@lcir#1}\hskip#2\relax}}}}}} +% \end{macrocode} +% Added preview color to the circle version of the bounding box. The color +% accessed through \cs{previewColor}, its default is \texttt{black}. +% \begin{macrocode} + \def\eqe@BboxCirc#1#2{\hbox{\ckcir@Color{\circ@Glyph{h}{0pt}}}} +% \end{macrocode} +% For proofing purposes, prepare the filled circle in the form of the command +% \cs{circProofingForCirc}. +% \begin{macrocode} + \def\circProofingForCirc{\centerWidget\RadioFieldSize + \lower\eqcenterWidget\circ@Glyph{x}{1.4pt}} + \if\eq@online\eqe@YES +% \end{macrocode} +% If online (\texttt{online} or \texttt{email} option), we cancel these commands. +% \begin{macrocode} + \def\useCircForMC{\let\Bbox\eqe@BboxCirc\useMCCircles} + \def\selectedMC{\useCircForMC} + \@ifundefined{eqe@BboxRect} + {\def\useRectForMC{\let\Bbox\ef@Bbox\useMCRects}} + {\def\useRectForMC{\let\Bbox\eqe@BboxRect\useMCRects}} +% \let\useRectForMC\relax + \else % if not online + \@ifundefined{eqe@BboxRect} + {\def\useRectForMC{\let\Bbox\ef@Bbox}} + {\def\useRectForMC{\let\Bbox\eqe@BboxRect}} + \def\useCircForMC{\let\Bbox\eqe@BboxCirc} + \def\selectedMC{\useCircForMC} + \fi + \def\useCircForProof{\symbolchoice{circle}% + \proofingsymbol{\circProofingForCirc}} +\else +% \end{macrocode} +% If \texttt{allowcircmc} is not taken +% \begin{macrocode} + \if\eq@online\eqe@YES + \def\useCircForMC{\let\Bbox\eqe@BboxCirc\useMCCircles} + \@ifundefined{eqe@BboxRect} + {\def\useRectForMC{\let\Bbox\ef@Bbox\useMCRects}} + {\def\useRectForMC{\let\Bbox\eqe@BboxRect\useMCRects}} + \else + \@ifundefined{eqe@BboxRect} + {\def\useRectForMC{\let\Bbox\ef@Bbox}} + {\def\useRectForMC{\let\Bbox\eqe@BboxRect}} + \def\useCircForMC{\useRectForMC} + \def\selectedMC{\useRectForMC} + \fi + \let\useCircForProof\relax +\fi +% \end{macrocode} +%\DescribeMacro{\useRectForMS}\cmd{\useRectForMS} When declared, rectangles are +% used for multiple selection, similarly, \DescribeMacro{\useCircForMS}\cmd{\useCircForMS} +% uses circles if \texttt{allowcirc4mc} is in effect. +% \begin{macrocode} +\newif\ifuserectforms +\def\useRectForMS{\userectformstrue} +\def\useCircForMS{\userectformsfalse} +% \end{macrocode} +% \changes{v3.1e}{2012/11/10}{Changed default for \cs{proofingsymbol}} +% \begin{macrocode} +\newcommand{\useCheckForProof}{\symbolchoice{check}% + \proofingsymbol{\ding{52}}} +\useCheckForProof +% \end{macrocode} +% Similarly, for a cross, we get a nice `handwritten' cross \verb!\ding{56}!, !when we latex +% the document; for the \texttt{online} or \texttt{email} option, we get a simple cross in the +% active radio button field. +% \begin{macrocode} +\newcommand{\useCrossForProof}{\symbolchoice{cross}% + \proofingsymbol{\raisebox{-1pt}{\rlap{\kern-1pt\Large\ding{56}}}}} +% \end{macrocode} +% +% \section{The Main Code} +% We now continue with the main package. Mostly, we define macros specific to the +% \texttt{eqexam} package: define the \texttt{problem} and \texttt{problem*} environments, +% macros for calculating totals per page, etc. +% +% \begin{macrocode} +\def\MCcolor{black} +\def\Ans@sq@l@driver{\edef\@linkcolor{\MCcolor}% + \Rect{\makebox[\eq@tmpdima]{\linkContentWrapper}}% + \Ans@proofing{\eq@tmpdima}% +} +% \end{macrocode} +% This is the answers macro for the form-style and is called from the \texttt{eqexam.def} file. +% \begin{macrocode} +\def\Ans@sq@f@driver{% + \centerWidget\RadioFieldSize + \leavevmode\lower\eqcenterWidget\Bbox %\eqe@Bbox + {\RadioFieldSize}{\RadioFieldSize}% + \Ans@proofing{\RadioFieldSize}% +} +% \end{macrocode} +% Write quiz solutions to the exercise solutions file +% \begin{macrocode} +\def\eq@sqsllabel{\string\textbf{Solution to Quiz:}} +\def\sqsllabel{\eq@sqsllabel} +% \end{macrocode} +% \begin{macro}{\writeToSolnFile} +% General purpose command for writing to the solution file. +% \begin{macro}{\preExamSolnHead} +% Executed just before a user friendly name +% \begin{macro}{\examSolnHeadFmt} +% Format for the user friendly name +% \begin{macro}{\postExamSolnHead} +% Executed just after a user friendly name +% \begin{macrocode} +\let\quiz@solns\ex@solns +\newcommand{\preExamSolnHead}{\goodbreak\noindent} +\newcommand{\examSolnHeadFmt}[1]{\textbf{#1}} +\newcommand{\postExamSolnHead}{\par\medskip} +% \end{macrocode} +% Write to solution file if \emph{not} \textsf{solutions-only} +% \changes{v5.1.3}{2018/12/13}{Write to solution file if not \string\textsf{solutions-only}} +% \begin{macrocode} +\@ifundefined{ifOKToWriteExamData}{\newif\ifOKToWriteExamData + \OKToWriteExamDatatrue}{} +\newcommand{\writeToSolnFile}[1]{% + \ifsolutionsonly\else\ifOKToWriteExamData + \let\quiz@solns\ex@solns + \set@display@protect + \eqe@IWO\quiz@solns{#1}% + \set@typeset@protect + \fi\fi} +\let\writeT@SolnFile\writeToSolnFile +% \end{macrocode} +% We will write all solutions to the \texttt{.sol} auxiliary file. +% \begin{macrocode} +\def\eqe@writetoSolns#1{% dpsD17 + \ifsolutionsonly\else + \ifOKToWriteExamData + \set@display@protect + \eqe@IWO\quiz@solns{\string\preExamSolnHead + \string\examSolnHeadFmt{#1}\string\postExamSolnHead}% + \set@typeset@protect\fi\fi} +\def\eqe@writetoAux#1{% + \set@display@protect + \eqe@IWO\@auxout{#1}% + \set@typeset@protect} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% Turn off interactivity of short quiz. +\def\Ans@sq@l@Actions{} +\def\Ans@sq@f@Actions{} +% \begin{macrocode} +% \end{macrocode} +% This macro is defined in \texttt{exerquiz}, but has a little different definition for \textsf{eqexam}. +% \begin{macrocode} +\def\Ans@proofing +#1{% + \ifeq@proofing\if\Ans@choice1\relax + \llap{\rlap{\,\@proofingsymbol}\hskip#1\relax}% + \fi\fi +} +% \end{macrocode} +% This macro \DescribeMacro\eq@ExamLastPage gets the page number of the last page of the exam. It is read in through +% a macro definition made and written to the \texttt{.aux} file. +% \begin{macrocode} +\def\eq@ExamLastPage{\csname eqExamLastPage\endcsname} +% \end{macrocode} +% \DescribeMacro\nPagesOnExam is the number of pages in the exam. +% \begin{macrocode} +\newcommand{\nPagesOnExam}{\csname eqExamLastPage\endcsname} +% \end{macrocode} +% \DescribeMacro\nPagesOnQues is the number of pages in the questions. +% \begin{macrocode} +\newcommand{\nPagesOfQues}{\ifvspacewithsolns + \csname eqExamQuesLastPage\endcsname\else + \csname eqExamLastPage\endcsname\fi} +% \end{macrocode} +% \DescribeMacro\nPagesOnSols is the number of pages of solutions. +% \begin{macrocode} +\newcommand{\nPagesOfSols}{\def\eqExamNumPagesSolns{0}% + \csarg\ifx{eqExamLastPage}\relax\else + \csarg\ifx{eqExamLastPage}\relax\else + {\count\z@=\nPagesOnExam\relax\advance + \count\z@-\nPagesOfQues\relax + \xdef\eqExamNumPagesSolns{\the\count\z@}}\fi\fi + \eqExamNumPagesSolns} +% \end{macrocode} +% \begin{macro}{\lastPageOfExam} +%\changes{v2.0l}{2011/05/05}{% +% Returns the page number of the end of the exam with a given name. +%} +% Returns the page number of the end of the exam with a name of \texttt{\#1}. +% \begin{macro}{\firstPageOfExam} +%\changes{v2.0l}{2011/05/05}{% +% Returns the page number of the beginning of the exam with a given name. +%} +% Returns the page number of the beginning of the exam with a name of \texttt{\#1}. +% \begin{macrocode} +\newcommand{\lastPageOfExam}[1]{\pageref{#1PageEnd}} +\newcommand{\firstPageOfExam}[1]{\pageref{#1PageBegin}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% The last two commands are meant to produce typeset numbers; however, there +% is a need to convert these to numbers that tex's registers can manipulate. +% Here goes. \DescribeMacro{\eqe@defNumRefii}\cmd{\eqe@defNumRefii} takes +% its argument and strips away the other arguments of \cs{pageref}; it picks +% off the second of two or five, depending if \textsf{hyperref} is loaded. +% It defines a macro |\csname nRefii@#1\endcsname| whose value is a page +% number of the referenced object. +% \begin{macrocode} +\newcommand{\eqe@defNumRefii}[1]{% + \@ifundefined{hyperref}{\let\@getsecondOf\@secondoftwo} + {\let\@getsecondOf\@secondoffive}% + \@ifundefined{r@#1}{% +% \end{macrocode} +% If the reference \texttt{r@\#1} is undefined, define the value to be 0 +% \begin{macrocode} + \csarg\gdef{nRefii@#1}{0}}{% +% \end{macrocode} +% If the reference \texttt{r@\#1} is defined, define the value to be +% the second argument of \cs{r@\#1} expanded +% \begin{macrocode} + \expandafter\xdef\csname nRefii@#1\endcsname + {\expandafter\expandafter\expandafter + \@getsecondOf\csname r@#1\endcsname}% + }% +} +% \end{macrocode} +% \DescribeMacro{\eqe@numRefii} takes one argument, the control +% name. Its value is zero or \cs{nRefii@\#1}. This expands to a number +% in all cases. It can be used in tex comparisons. +% \begin{macrocode} +\def\eqe@numRefii#1{% + \csarg\ifx{nRefii@#1}\relax 0\else + \@nameuse{nRefii@#1}\fi} +% \end{macrocode} +% \begin{macro}{\numLastPageOfExam} +% \begin{macro}{\numFirstPageOfExam} +% This is the user-interface to acquiring the first and last page +% numbers of the exam with name \texttt{\#1}. These can be used +% in comparisons, e.g. +%\begin{verbatim} +% \rfooteqe{\ifnum\value{page}<\numLastPageOfExam{}% +% \textbf{Test Continues}\fi} +%\end{verbatim} +% \begin{macrocode} +\newcommand{\numLastPageOfExam}[1]{\eqe@numRefii{#1PageEnd}} +\newcommand{\numFirstPageOfExam}[1]{\eqe@numRefii{#1PageBegin}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macrocode} +\newcommand{\makeRefsNums}{% + \@ifundefined{thePartNames}{}{\begingroup + \def\\##1{\PackageInfo{eqexam}{processing exam: ##1}% + \eqe@defNumRefii + {##1PageEnd}\eqe@defNumRefii{##1PageBegin}}% + \thePartNames + \endgroup}% +} +% \end{macrocode} +% \begin{macrocode} +\AtBeginDocument{\makeRefsNums} +% \end{macrocode} +% \subsection{Running Heads and Feet} +% We develop a series of macros for creating running headers and footers for the exam. +% \begin{macro}{\lheadeqe} +% \begin{macro}{\cheadeqe} +% \begin{macro}{\rheadeqe} +%\changes{2.0a}{2010/05/06}{ +% Changed the definitions of \cs{lhead}, \cs{chead}, and \cs{rhead} so they don't clash +% with the \textsf{fancyhdr} package. If \textsf{fancyhdr} is not loaded at the time \textsf{eqexam} is loaded, we +% \cs{let} the old names to the new names. Therefore, when \textsf{fancyhdr} is loaded first use +% the new definitions. +%} +% Set the left, center, and right running headers. +% \begin{macrocode} +\newcommand{\lheadeqe}[1]{\def\eq@lhead{#1}} +\lheadeqe{\shortwebsubject/\shortwebtitle} +\newcommand{\cheadeqe}[1]{\def\eq@chead{#1}} +\cheadeqe{-- Page \arabic{page} of {\nPagesOnExam} --} +\newcommand{\rheadeqe}[1]{\def\eq@rhead{#1}} +% \end{macrocode} +% The default is \cs{eq@ExamName}, which is defined by \cs{eqExamName}, the default displays the word \texttt{"Name"} +% and an underlined horizontal space for the student to enter his/her name. +% \begin{macrocode} +\rheadeqe{\eq@ExamName} +% \end{macrocode} +% \begin{macro}{\lhead} +% \begin{macro}{\chead} +% \begin{macro}{\rhead} +% These are the original names for the headers, we'll keep them if +% \textsf{fancyhdr} is not already loaded to maintain compatibility +% with previous versions of \textsf{eqexam}. The use of these commands +% is \emph{discouraged}. +% \begin{macrocode} +\@ifpackageloaded{fancyhdr}{}{% + \let\lhead\lheadeqe + \let\chead\cheadeqe + \let\rhead\rheadeqe +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\runExamHeader} +% \begin{macro}{\eqExamRunHead} +% The running header of the exam, may be redefined. +% \begin{macrocode} +\newcommand{\runExamHeader}{\eq@lhead\hfill\eq@chead\hfill\eq@rhead} +\newcommand\eqExamRunHead{% + \addtolength\textwidth{\oddsidemargin}% + \noindent\hspace*{-\oddsidemargin}\makebox[\textwidth] + {\runExamHeader}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \paragraph*{Running footers.} +% One or two users wanted to use running footers, so +% here they are. +% \begin{macro}{\lfooteqe} +% \begin{macro}{\cfooteqe} +% \begin{macro}{\rfooteqe} +% There has been some demand for running footers. You have to be +% a little careful, \textsf{eqexam} uses the footer for the +% command \cmd{\settotalsbox}, which puts in the totals for the pages +% either on the left (\texttt{totalsonleft}) or right (\texttt{totalsonright}) side, depending on the option. +% \begin{macrocode} +\newcommand{\lfooteqe}[1]{\def\eq@lfoot{#1}} +\lfooteqe{} +\newcommand{\cfooteqe}[1]{\def\eq@cfoot{#1}} +\cfooteqe{} +\newcommand{\rfooteqe}[1]{\def\eq@rfoot{#1}} +\rfooteqe{} +% \end{macrocode} +% \DescribeMacro{\runExamFooter}Considering the defaults for the left, center, and right footer elements, +% the default footer contributes nothing, except inserting +% \cmd{\settotalsbox} (see the definition of \cs{@oddfoot}) +% \begin{macrocode} +\newcommand{\runExamFooter}{\eq@lfoot\hfill\eq@cfoot\hfill\eq@rfoot} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \paragraph*{Running headers for solutions.} +% We provide a special set of headers for the solution pages. +% The document author needs to manage running footers for the solution +% pages. +% \begin{macro}{\lheadSol} +% \begin{macro}{\cheadSol} +% \begin{macro}{\rheadSol} +% \begin{macro}{\runExamHeaderSol} +% \begin{macro}{\eqsolutionshook} +% The running header of the exam, when solutions are included at the end of +% the document, perhaps for posting the solutions to the exam, or +% publication of a ``pretest''. Note that \cs{eqsolutionshook} is defined +% in \texttt{exerquiz/eqexam.def}. May be redefined. +% \begin{macrocode} +\newcommand{\lheadSol}[1]{\def\eq@lheadSol{#1}} +\lheadSol{\shortwebsubject/\shortwebtitle} +\newcommand{\cheadSol}[1]{\def\eq@cheadSol{#1}} +\cheadSol{-- Page \arabic{page} of {\eq@ExamLastPage} --} +\newcommand{\rheadSol}[1]{\def\eq@rheadSol{#1}} +\rheadSol{SOLUTIONS} +% \end{macrocode} +% The \cs{runExamHeaderSol} distributes the three solution headers across +% the page. +% \begin{macrocode} +\newcommand{\runExamHeaderSol} + {\eq@lheadSol\hfill\eq@cheadSol\hfill\eq@rheadSol} +% \end{macrocode} +% The solutions headers are inserted using the \cs{eq@solutionshook}, see +% the definition of \cmd{\exerSolnInput}. +% \begin{macrocode} +\def\eq@solutionshook +{% + \gdef\eqExamRunHead{\addtolength\textwidth{\oddsidemargin}% + \noindent\hspace*{-\oddsidemargin}\makebox[\textwidth] + {\runExamHeaderSol}}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \subsection{\texorpdfstring{\protect\cs{maketitle}}{\textbackslash{maketitle}} definitions} +% \begin{macro}{\maketitle} +% \begin{macro}{\maketitledesign} +% \begin{macro}{\altTitle} +% Standard {\LaTeX} macro, but this time it is used to create the header at the top of the first +% page of the exam. Typically, consisting of two rows of info. (1) first row has course name, exam name, and +% a place for the student to put his/her name. (2) second row has date and instructor. May be redefined. +% +% Modify the title by redefining \cs{maketitledesign}, the \cs{maketitle} command +% itself has {\LaTeX} commands in it that should not be changed. +% \changes{v1.6i}{2007/09/18} +%{ +% Added the command \cs{altTitle} as an alternate title for the exam +% document. This alternate title appear centered under the title +% of the document. +%} +% \begin{macrocode} +\newcommand\maketitledesign +{% + \makebox[\textwidth]{\normalsize + \shortstack[l]{\strut\websubject\\\@date}\hfill + \shortstack[c]{\webtitle\\\strut\@altTitle}\hfill + \shortstack[l]{\strut\eq@ExamName\\\webauthor}}% +} +\def\altTitle#1{\def\@altTitle{#1}} +\let\@altTitle\@empty +\def\eqemaketitle +{% +% \end{macrocode} +% \cs{EQEcalculateAllTotals}: We don't actually calculate all totals, just +% some of them. We do calculate the grade total of all the \texttt{exam} +% environments in the document, we also calculate the percentage that each +% exam contributes to to the total. If \cs{maketitle} is not used, for +% whatever reason, this command should be calculated explicitly just after +% |\begin{document}|. +% \changes{v3.0y}{2012/04/20}{Moved \cs{EQEcalculateAllTotals} from the bottom +% to the top of \cs{eqemaketitle}. In case the author wants the grand total +% of the exam in the title, we need to make all calculations before +% \cs{maketitledesign.}} +% \begin{macrocode} + \EQEcalculateAllTotals + \begingroup +% \addtolength\textwidth{\oddsidemargin}% + \noindent%\hspace*{-\oddsidemargin}% + \raisebox{.7in}[0pt][0pt]{\SubmitButton}% + \maketitledesign + \endgroup +} +% \end{macrocode} +% If the \texttt{fortextbook} option is not taken, we set up the usual \cs{maketitle} definition. +% If the \texttt{useclassmaketitle} option is taken, we don't redefine either. +% \begin{macrocode} +\ifeqfortextbook + \@ifpackageloaded{web}{\let\maketitle\web@save@maketitle}{}% +\else + \if@eqeuseclassmaketitle + \@ifpackageloaded{web}{\let\maketitle\web@save@maketitle}{}% + \else + \let\maketitle\eqemaketitle + \fi +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \subsection{The cover page definitions} +% \begin{macro}{\eqexcoverpage} +% The \texttt{eqexam} package allows for the possibility of a cover page, if the \texttt{coverpage} +% option is taken. +% \begin{macro}{\placeCoverPageLogo} +% A simple command to insert a logo on the cover page. The logo can be used to cover the +% score in the next page, if the instructor places the score under the logo. Example of usage +%\begin{verbatim} +% \placeCoverPageLogo{5in}{-1.5in}{\includegraphics{nwfsc_logo}} +%\end{verbatim} +% Working from the upper left corner, the first parameter is the amount to move to logo +% to the right, the second parameter is the amount to move the logo vertically. The +% Third parameter is the content; perhaps an \cs{includegraphics} command. +%\changes{v1.9b}{2009/09/29}{Added \cs{placeCoverPageLogo} to insert a logo on the cover page.} +% \begin{macrocode} +\newcommand\placeCoverPageLogo[3]{% + \def\eqe@insertLogo{\hbox to0pt{% + \hspace*{#1}\smash{\raisebox{#2}{#3}}\hss}}} +\let\eqe@insertLogo\relax +% \end{macrocode} +% Define \cs{eqexcoverpage}, this command places \cs{eqe@insertLogo} and +% \cs{eqex\-cover\-page\-design} in a group. It is this command that gets executed when +% the user calls for the \texttt{coverpage} option. +% \begin{macrocode} +\def\eqexcoverpage{% + \begingroup + \pagenumbering{roman} + \eqe@insertLogo + \eqexcoverpagedesign + \endgroup\newpage + \pagenumbering{arabic} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\eqexcoverpagedesign} +% The \texttt{eqexam} package allows for the possibility of a cover page, +% if the \texttt{coverpage} option is taken. This macro can and should be +% redefined to fit your needs. The definition below is just a +% representative example. +% \begin{macro}{\coverpagesubject} +% \begin{macro}{\coverpageUniversityFmt} +% \begin{macro}{\coverpageSubjectFmt} +% \begin{macro}{\coverpageTitleFmt} +% The following four commands are used with the cover page. +% The \cs{cover\-page\-sub\-ject} is used to provide a special subject +% for the cover page, different from \cs{websubject}. The others +% are used for formatting. +%\changes{v1.9a}{2009/28/09}{Added these various Fmt commands for coverpage.} +% \begin{macrocode} +\newcommand{\coverpagesubject}[1]{\def\coverpage@subject{#1}} +\let\coverpage@subject\@empty +\def\eqexamsubject{\ifx\coverpage@subject\@empty\websubject + \else\coverpage@subject\fi} +\newcommand{\coverpageUniversityFmt}[1]{% + \def\eqex@coverpageUniversityFmt{#1}} +\coverpageUniversityFmt{\bfseries\large} +\newcommand{\coverpageSubjectFmt}[1]{% + \def\eqex@coverpageSubjectFmt{#1}} +\coverpageSubjectFmt{\bfseries\large} +\newcommand{\coverpageTitleFmt}[1]{% + \def\eqex@coverpageTitleFmt{#1}} +\coverpageTitleFmt{\bfseries\large} +\newcommand\cpCID[1]{\def\cp@@CID{#1}} +\let\cp@@CID\@empty +%\newcommand\coverpageCID[1]{\def\cpCID@argi{#1}} +\newcommand{\cpSetCIDWidth}[1]{\bgroup\setlength{\@tempdima}{#1} + \xdef\cpCID@argi{\the\@tempdima}\egroup} +\def\cp@CID{\bgroup\settowidth\eq@tmplengthA{\cp@@CID}% + \@tempdima=\cpCID@argi\relax + \advance\@tempdima-\eq@tmplengthA + \eqe@idinfohl{\makebox[\cpCID@argi][l]{\cp@@CID}}\egroup} +\cpSetCIDWidth{2.25in} +%\coverpageCID{2.25in} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% When \texttt{coverpage} and \texttt{coverpagesumry} are used, an \textbf{Exam Record} +% is generated, just a summary may appear beneath the name and ID section of the cover +% page (\DescribeMacro{\qeSumryVert}\cmd{\qeSumryVert}) or to the right +% (\DescribeMacro{\eqeSumryHoriz}\cmd{\eqeSumryHoriz}). +% \begin{macrocode} +\def\eqeSumryVert{\def\eqe@SumryVert{\par\vfill}% + \let\eqe@SumryHoriz\relax + \def\eqe@@SumryVert{\vspace{\stretch{-1}}\bigskip}} +\def\eqeSumryHoriz{\def\eqe@SumryHoriz{\hfill}\let\eqe@SumryVert\relax + \let\eqe@@SumryVert\relax} +% \end{macrocode} +% The default is a horizontal orientation. +% \begin{macrocode} +\eqeSumryHoriz +% \end{macrocode} +% We can name the components of the \textbf{Exam Record} by page or by parts. For the case +% they are named by parts, there are three options: You can used the exam name (the default); +% you can use the friendly name of the exam (the optional argument), executing +% \DescribeMacro{\useUIPartNames}\cmd{\useUIPartNames} invokes this option; you can use +% custom names (useful if the friendly names are too long), execute the command +% \DescribeMacro{\useCustomPartNames}\cmd{\useCustomPartNames} for this option. +% \begin{macrocode} +\def\eqe@coverPageNaming{0} +\newcommand{\useUIPartNames}{\def\eqe@coverPageNaming{1}} +\newcommand{\useCustomPartNames}{\def\eqe@coverPageNaming{2}} +% \end{macrocode} +% When there is custom naming (\cmd{\customNaming}), we need to provide the user with a +% way of defining these custom names. \DescribeMacro{\customNaming}\cmd{\customNaming} +% provides that mechanism. The command takes two arguments, the first is +% \meta{name}, the exam name, the second is the associated \meta{text} the text that is to appear +% in the \textbf{Exam Record} +% \begin{macrocode} +\newcommand{\customNaming}[2]{\@namedef{userCustom#1}{#2}} +% \end{macrocode} +% \begin{macrocode} +\newcommand{\cpSetNameAndIDWidth}[1]{\bgroup + \setlength{\@tempdima}{#1}% + \xdef\cp@SetNameAndIDWidth{\the\@tempdima}\egroup} +\cpSetNameAndIDWidth{.45\textwidth} +\newcommand{\cpEnclNameAndID}[1]{\def\cp@EnclNameAndID{#1}} +\let\cp@EnclNameAndID\@empty +\newcommand{\cpSetHghtFrstLn}[1]{\def\cp@HghtFrstLn{#1}} +\def\cp@HghtFrstLn{0pt} +\def\cp@setHghtFrstLn{\rule[\cp@HghtFrstLn]{0pt}{0pt}} +\newcommand\cpNameAndID{\noindent + \edef\eqExamName@argii{\cp@SetNameAndIDWidth}% + \edef\eqSID@argii{\cp@SetNameAndIDWidth}% + \edef\cpCID@argi{\cp@SetNameAndIDWidth}% + \cp@EnclNameAndID{\parbox[b]{\cp@SetNameAndIDWidth}{\parindent0pt + \cp@setHghtFrstLn\eq@ExamName\\[2ex] + \ifx\cp@@CID\@empty\eq@SID\else\cp@CID\fi\\[2ex] + \ifx\use@email\eqe@YES\eq@Email\\[2ex]\fi + \textcolor{\webauthor@color}{\webauthor}, \@date\vskip0pt}}} +% \end{macrocode} +% Now we present the definition of \cs{eqexcoverpagedesign}. +% \begin{macrocode} +\newcommand{\eqexcoverpagedesign} +{% + \begingroup + \parindent0pt + \thispagestyle{empty} +% \addtolength\textwidth{\oddsidemargin} + \vspace*{.1\textheight} + \noindent%\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\eqex@coverpageUniversityFmt + \color{\webuniversity@color}% + \centering\webuniversity}} + \par\vspace{.1\textheight} + \noindent%\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\eqex@coverpageSubjectFmt + \color{\websubject@color}% + \centering\eqexamsubject}} + \par\vspace{\bigskipamount} + \noindent%\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\eqex@coverpageTitleFmt + \color{\webtitle@color}% + \centering\webtitle}} + \par\vspace{\stretch{1}} + \optionalpagematter + \par\vspace{\stretch{1}}\cpNameAndID + \eqe@SumryHoriz\eqe@SumryVert + \sumryAnnots + \endgroup +} +% \end{macrocode} +% \end{macro} +% The following are various local strings used in the \textbf{Exam Record}, the +% default is to use English words. +% \begin{macro}{\cpSumryHeader} +% The header that appears at the top of the box +% \begin{macro}{\cpSumryPts} +% The formatting for the number of points +% \begin{macro}{\cpSumryPage} +% The word for ``Page'' +% \begin{macro}{\cpSumryTotal} +% The word for ``Total'' +% \begin{macro}{\cpSumryGrade} +% The word for ``Grade'' +% \begin{macro}{\cpSetSumryWidth} +% The width of the summary box +% \begin{macro}{\cpUsefbox} +% Enclose in an \cs{fbox}? The default is yes +% \begin{macro}{\cpNofbox} +% Do not enclose in an \cs{fbox} +% \begin{macrocode} +\newcommand{\cpSumryHeader}{\textbf{Exam Record}} +\newcommand{\cpSumryPts}{\,\text{pts}} +\newcommand{\cpSumryPage}{Page} +\newcommand{\cpSumryTotal}{Total:} +\newcommand{\cpSumryGrade}{Grade:} +\newcommand{\cpSetSumryWidth}[1]{\bgroup\setlength{\@tempdima}{#1} + \xdef\cp@SetSumryWidth{\the\@tempdima}\egroup} +\cpSetSumryWidth{.5\textwidth} +\newcommand{\cpUsefbox}{\let\cp@Usefbox\fbox} +\cpUsefbox +\newcommand{\cpNofbox}{\let\cp@Usefbox\mbox} +\newcommand{\cprulelength}{1.5in} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% A helper command used in \cs{cpSumybyparts} +% \begin{macrocode} +\def\cp@IsertNaming#1{% + \ifcase\eqe@coverPageNaming + #1\or\@nameuse{userFriendly#1}\or + \@nameuse{userCustom#1}\else#1\fi +} +% \end{macrocode} +% \DescribeMacro{\cpSumrybyparts} +% The routine for building the summary box, where we list the statistics +% for each part. +% \begin{macrocode} +\newcommand{\cpSumrybyparts}{% + \eqe@@SumryVert\cp@Usefbox{% + \ifx\cp@Usefbox\fbox + \def\cp@sumryWdth{\cp@SetSumryWidth-2\fboxrule-2\fboxsep}\else + \def\cp@sumryWdth{\cp@SetSumryWidth}\fi + \begin{minipage}[b]{\cp@sumryWdth}\kern0pt + \begin{flushleft} + \setlength{\eqetmplengtha}{\cprulelength}% + \edef\eqe@cprulelength{\the\eqetmplengtha}% + \csarg\ifx{NumberOfParts}\relax + \else + \count2=0 + \medskip + \cpSumryHeader\par\parskip\bigskipamount + \def\\##1{\advance\count2by\csname ##1total\endcsname + \underbar{\makebox[0pt][l]{% + \cp@IsertNaming{##1}}\hspace*{\eqe@cprulelength}}% + / $\eqe@ptsFmt{\csname ##1total\endcsname}% + \cpSumryPts$\par}\thePartNames + \fi + \underbar{\makebox[0pt][l]{\cpSumryTotal}% + \hspace{\eqe@cprulelength}}/ + $\eqe@ptsFmt{\the\count2\relax}\cpSumryPts$ \par + \underbar{\makebox[0pt][l]{\cpSumryGrade}% + \hspace{\eqe@cprulelength}}% + \ifx\cp@Usefbox\fbox\medskip\fi + \end{flushleft}\kern0pt + \end{minipage}}\par +} +% \end{macrocode} +% \DescribeMacro{\cpSumrybypages} +% The routine for building the summary box, where we list the statistics +% for each page. +% \begin{macrocode} +\newcommand{\cpSumrybypages}{% + \eqe@@SumryVert\cp@Usefbox{% + \ifx\cp@Usefbox\fbox + \def\cp@sumryWdth{\cp@SetSumryWidth-2\fboxrule-2\fboxsep}\else + \def\cp@sumryWdth{\cp@SetSumryWidth}\fi + \begin{minipage}[b]{\cp@sumryWdth}\kern0pt + \begin{flushleft} + \setlength{\eqetmplengtha}{\cprulelength}% + \edef\eqe@cprulelength{\the\eqetmplengtha}% + \csarg\ifx{NumberOfParts}\relax + \else\medskip\count0=0\relax\count2=0\relax + \cpSumryHeader\par\parskip\bigskipamount + \ifsolutionsAtEnd + \@ifundefined{eqExamQuesLastPage}{\def\NUMPAGES{0}} + {\edef\NUMPAGES{\@nameuse{eqExamQuesLastPage}}}% + \else + \@ifundefined{eqExamLastPage}{\def\NUMPAGES{0}} + {\edef\NUMPAGES{\@nameuse{eqExamLastPage}}}% + \fi + \@whilenum\count0<\NUMPAGES\relax\do{% + \advance\count0by1\relax + \@ifundefined{Page\the\count0total}{\count4=0\relax} + {\count4=\@nameuse{Page\the\count0total}\relax}% + \csarg\ifx{Page\the\count0spilltotal}\relax + \else\advance\count4by\csname% + Page\the\count0spilltotal\endcsname\relax\fi + \advance\count2by\count4\relax\underbar{% + \makebox[0pt][l]{\cpSumryPage~\the\count0}% + \hspace*{\eqe@cprulelength}}/ + $\eqe@ptsFmt{\the\count4\relax}% + \cpSumryPts$\csarg\ifx{Page\the\count0spilltotal}\relax + \else\ $(\@nameuse{Page\the\count0spilltotal}% + \cpSumryPts+\@nameuse{Page\the\count0total}% + \cpSumryPts)$\fi\par + }% while + \fi + \underbar{\makebox[0pt][l]{\cpSumryTotal}% + \hspace{\eqe@cprulelength}}/ + $\eqe@ptsFmt{\the\count2\relax}\cpSumryPts$\par + \underbar{\makebox[0pt][l]{\cpSumryGrade}% + \hspace{\eqe@cprulelength}}% + \ifx\cp@Usefbox\fbox\medskip\fi + \end{flushleft}\kern0pt + \end{minipage}}\par +} +% \end{macrocode} +% If the author takes the \texttt{coverpage} option, \cs{eqex@coverpage} is set equal +% to \cs{eqexcoverpagedesign}, otherwise, it is set equal to \cs{relax}. +% \begin{macrocode} +\AtBeginDocument{\eqex@coverpage} +% \end{macrocode} +% \subsection{Insert Points in Margins and Compute Page Totals} +% Here we attempt to place point values of a problem in the margins and +% to compute the page totals. +% +%\begin{macro}{\probvalue} +% This is a fundamental macro for keeping track of the points of the problem. +% It increments the counter \texttt{eqpointvalue}, which keeps a running total +% of the points of the current part of the exam, puts the value in the margins, +% and sets a \texttt{mark}, so that at the end of the page, we can compute the +% number of points on the current page. This macro is used in several situations, +% for example, in the \texttt{problem} environment, \cs{manualcalcparts} and in +% \cs{autocaleparts}. \textbf{Should not be redefined}. +%\begin{flushleft} +%Parameters +%\begin{verbatim} +%#1 = total points for this problem +%#2 = 0 if total points, otherwise, #2 is the number of points each +% problem. +%\end{verbatim} +%\end{flushleft} +% \begin{macrocode} +\def\@marktotalvalue{\global\let\eqe@innermarkpts\relax + \if@bypasseqexamheading\else\def\eqe@marktxt{% + \theeqpointvalue\@nameuse{eqExam}\theeq@numparts}% + \ifx\endparts\endexercise@parts@tabular + \xdef\eqe@innermarkpts{\noexpand\mark{\eqe@marktxt}}\else + \mark{\eqe@marktxt}\fi\fi} +\def\probvalue#1#2{\addtocounter{eqpointvalue}{#1}% + \ifdispl@yPoints\marginpoints{#1}{#2}\fi + \@marktotalvalue} +% \end{macrocode} +% \end{macro} +% \DescribeMacro{\widthtpboxes} is the width of the box in the margins that +% contains the points or totals. The design of the box keys off this width. +% \begin{macrocode} +\newcommand{\widthtpboxes}{35pt} +% \end{macrocode} +% \DescribeMacro{\marginboxdesign} is the basic box that encloses the points +% on the right, and the totals. This box may be redefined as desired, in which case, +% \cs{measurePtBoxHt} should be re-executed. +% \begin{macrocode} +\newcommand{\marginboxdesign}[2][]{% + \parbox{\widthtpboxes}{\tabcolsep=0pt\relax + \begin{tabular}{|c|}\hline + \vrule height15pt width0pt#1\\\hline + \makebox[\widthtpboxes-2\fboxrule]{#2}\\\hline + \end{tabular}% + }% +} +% \end{macrocode} +% \begin{macro}{\eqleftmarginbox} +% This macro places the problem value in the left margin, can be redefined, if you dare. +%\begin{flushleft} +% Parameters +%\begin{verbatim} +%#1 = total points for this problem +%#2 = 0 if total points, otherwise, #2 is the number of points each +% problem. +%\end{verbatim} +%\end{flushleft} +% Currently, this macro is not used so I'll make it into verbatim text. +%\begin{verbatim} +\newcommand{\eqleftmarginbox}[2]{\makebox[0pt][r]{% + \setlength\tabcolsep{0pt}% + \raisebox{-.5\height}[0pt][0pt]{% + \marginboxdesign{\marginpointsboxtext{#1}{#2}}% + }\hspace*{\marginparsep}\hspace*{\eqemargin}}% +} +%\end{verbatim} +% \end{macro} +% \paragraph*{Formatting the points} +% \begin{macro}{\ptsLabel} +% \begin{macro}{\eachLabel} +% \begin{macro}{\pointsLabel} +% The following three convenience commands can be used to localize some of +% the strings to other languages. +% \begin{macrocode} +\providecommand{\ptsLabel}[1]{\def\eqptsLabel{#1}}\ptsLabel{pts} +\providecommand{\ptLabel}[1]{\def\eqptLabel{#1}}\ptLabel{pt} +\newcommand{\eachLabel}[1]{\def\eqeachLabel{#1}}\eachLabel{ea.} +% \end{macrocode} +% These next two are used by the \texttt{instructions} environment to display +% the points for the exam. +% \begin{macrocode} +\newcommand{\pointsLabel}[1]{% + \def\eqpointsLabel{#1}}\pointsLabel{points} +\newcommand{\pointLabel}[1]{% + \def\eqpointLabel{#1}}\pointLabel{point} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \paragraph*{pointsonleft or pointsonboth} +% \begin{macro}{\marginpointtext} +% Creates the text for \cs{eqleftmargin} to use. From the macro definition, +% if \texttt{\#2} is 0, then we write the points for the problem, else, we write +% the points each for the problem. \DescribeMacro{\leftmarginPtsTxt}\cmd{\leftmarginPtsTxt} +% is the formatting for the total points for the problem; while +% \DescribeMacro{\leftmarginPtsEaTxt}\cmd{\leftmarginPtsEaTxt} is the formatting +% for the \verb!{problem*}{ea}!-type problems. +% +% \begin{macro}{\pointsAsText} +% We begin by giving the user a choice, typeset +% the points in math mode (the default) or typeset in the normal font. +% \begin{macrocode} +\def\pointsAsText{\def\eqe@ptsFmt{\text}} +\let\eqe@ptsFmt\relax +\@onlypreamble\pointsAsText +% \end{macrocode} +% \end{macro} +% \DescribeMacro{\marginpointtext} determines, based on \texttt{\#2} +% whether the points are `points each' or not, and calls either +% \cmd{\leftmarginPtsTxt} or \cmd{\leftmarginPtsTxt}, as appropriate. +% \begin{macrocode} +\newcommand{\marginpointtext}[2]{\ifnum#2=0\leftmarginPtsTxt{#1}\else + \leftmarginPtsEaTxt{#2}\fi +} +% \end{macrocode} +% \DescribeMacro{\leftmarginPtsTxt} displays points in the left margin: +% \mbox{(\small$\texttt{\#1}^{\mbox{\scriptsize{pt}}}$)} or +% \mbox{(\small$\texttt{\#1}^{\mbox{\scriptsize{pts}}}$)}, +% where \texttt{\#1} is the number of points for this problem. +% \begin{macrocode} +\newcommand{\leftmarginPtsTxt}[1]{(\small$\eqe@ptsFmt{#1}^{\text{% + \ifnum#1=1\relax\eqptLabel\else\eqptsLabel\fi}}$)} +% \end{macrocode} +% \DescribeMacro{\leftmarginPtsEaTxt} displays `points each' in the left margin: +% \mbox{(\small$\texttt{\#1}_{\mbox{\scriptsize{ea.}}}^{\mbox{\scriptsize{pt}}}$)} or +% \mbox{(\small$\texttt{\#1}_{\mbox{\scriptsize{ea.}}}^{\mbox{\scriptsize{pts}}}$)}, +% where \texttt{\#1} is the number of points for each part of this problem. +% \begin{macrocode} +\newcommand{\leftmarginPtsEaTxt}[1]{(\small$\eqe@ptsFmt{#1}_{\text{% + \eqeachLabel}}^{\text{\ifnum#1=1\relax\eqptLabel\else + \eqptsLabel\fi}}$)} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\eqleftmargin} +% Places the number of points (or points each) in the left margin. Can be redefined as +% desired. This macro is used when author chooses the \texttt{pointsonleft} +% or \texttt{pointsonbothsides} option. The text for the points is defined above, +% \cmd{\marginpointtext}. +% \begin{macrocode} +\newcommand{\eqleftmargin}[2]{\makebox[0pt][r]{\marginpointtext{#1}{#2}% + \setlength{\@tempdima}{\marginparsep+\eqemargin}% + \hspace*{\@tempdima}}} +% \end{macrocode} +% \end{macro} +% \paragraph*{pointsonright or pointsonboth} +% \begin{macro}{\marginpointsboxtext} +% When the author selects \texttt{pointsonright} or \texttt{pointsonbothsides}, a box +% appears in the right margin containing problem totals, this is the text for the box. +% \begin{macrocode} +\newcommand{\marginpointsboxtext}[2]{\small$\eqe@ptsFmt{#1}\,\text{% + \ifnum#1=1\relax\eqptLabel\else\eqptsLabel\fi}$} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\eqrightmarginbox} +% When the author selects \texttt{pointsonright} or \texttt{pointsonbothsides}, a box +% appears in the right margin containing problem totals, this is the box that appears. +% \begin{macro}{\insertPointsBoxPDF} +% \begin{macro}{\insertTotalsBoxPDF} +% These two commands are \cmd{\let}ing them be either a form field (that the +% document author can fill in during online grading, or as \cs{relax}. It depends +% on whether the \texttt{email} option is taken or not. +% \begin{macrocode} +\def\@insertPointsBoxPDF +{ + \def\fieldName{pointsgiven.\curr@quiz.page\thepage.% + \theeqquestionnoi}% + \calcTextField[\F\FHidden\BC{}\Q1\textColor{1 0 0 rg}] + {\fieldName}{\widthtpboxes}{15pt}% +} +\def\@insertTotalsBoxPDF +{ + \def\fieldName{pagetotals.\curr@quiz.page\thepage}% + \calcTextField[\F\FHidden\BC{}\Q1\textColor{1 0 0 rg} + \AA{\AACalculate{AFSimple_Calculate("SUM", + new Array("pointsgiven.\curr@quiz.page\thepage"));}}] + {\fieldName}{\widthtpboxes}{15pt}% +} +\ifx\use@email y + \let\insertPointsBoxPDF\@insertPointsBoxPDF + \let\insertTotalsBoxPDF\@insertTotalsBoxPDF +\else + \let\insertPointsBoxPDF\@empty + \let\insertTotalsBoxPDF\@empty +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% The points box that appears in the left margin, may be re-defined, if you dare. +% At the bottom of the box goes the points for the problem, if the \texttt{email} option +% is used, in the top, a text field is inserted. +% \begin{macrocode} +\newcommand{\eqrightmarginbox}[2]{\makebox[0pt][l]{% + \setlength\tabcolsep{0pt}% +% \end{macrocode} +% (2011/05/08) new calculation for the right point box. +% \begin{macrocode} + \setlength{\@tempdima}{\textwidth-\eqemargin+\marginparsep}% + \hspace*{\@tempdima}% + \raisebox{-.5\height}[0pt][0pt]{% + \marginboxdesign[\insertPointsBoxPDF]% + {\marginpointsboxtext{#1}{#2}}% + }\hfil + }% +} +% \end{macrocode} +% At the end of each exam \verb!\end{exam}! the part totals can be optionally +% displayed on the right. This is the box for doing that. +% \begin{macrocode} +\newcommand{\eqeomarginboxright}[2]{\makebox[0pt][l]{% + \setlength\tabcolsep{0pt}% + \setlength{\@tempdima}{\textwidth+\marginparsep-\parindent}% + \hspace*{\@tempdima}% + \raisebox{-.5\height}[0pt][0pt]{% + \marginboxdesign[\insertTotalsBoxPDF]% + {\marginpointsboxtext{#1}{#2}}% + }\hfil + }% +} +% \end{macrocode} +% At the end of each exam \verb!\end{exam}! the part totals can be optionally +% displayed on the left. This is the box for doing that. +% \begin{macrocode} +\newcommand{\eqeomarginboxleft}[2]{\noindent\makebox[0pt][r]{% + \raisebox{-.5\height}[0pt][0pt]{% + \marginboxdesign[\insertTotalsBoxPDF]% + {\marginpointsboxtext{#1}{#2}}% + }{\settowidth{\@tempdimb}{\eqe@hspannerPrb}% + \setlength{\@tempdima}{\marginparsep+\eqemargin-\@tempdimb}% + \hspace*{\@tempdima}}}\hfil +} +% \end{macrocode} +% \DescribeMacro{\measurePtBoxHt} We measure the height of our point/total boxes and store it +% in the length \cs{eq@pointboxtotalheight}, which is used +% to separate the boxes so they don't overlap. +% \begin{macrocode} +\newcommand{\measurePtBoxHt}{\setbox\eq@pointbox\hbox{% + \marginboxdesign{\marginpointsboxtext{00}{0}}% + }\setlength\eq@pointboxtotalheight{.5\ht\eq@pointbox}% + \xdef\halfHtPtBox{\the\eq@pointboxtotalheight}% + \setlength\eq@pointboxtotalheight{\dp\eq@pointbox+\ht\eq@pointbox}% + \xdef\totHtPtBox{\the\eq@pointboxtotalheight}% + \xdef\dpPtBox{\the\dp\eq@pointbox}% + \xdef\htPtBox{\the\ht\eq@pointbox}% +} +\measurePtBoxHt +% \end{macrocode} +% \end{macro} +% A helper command to set both margin boxes. +% \begin{macrocode} +\newcommand{\eqbothmargins}[2]{\eqleftmargin{#1}{#2}% + \eqrightmarginbox{#1}{#2}} +% \end{macrocode} +% The macro \cs{probvalue}, defined above, says +%\begin{verbatim} +%\mark{\theeqpointvalue\csname eqExam\endcsname\theeq@numparts} +%\end{verbatim} +% so the \cs{botmark} contains the point value of this page and the part number for +% this page. +% \begin{macrocode} +\def\lastparttotaled{0} +% \end{macrocode} +% The \texttt{botmark} looks like \texttt{18\string\eqExam0}, where $18$ will be the total number of +% points accumulated for this exam part. We need to retrieve these number, I don't remember why +% I save them this way. +% +% \DescribeMacro{\parsetotals} +% The \cs{parsetotals} macro is called in \cs{settotalsbox} to retrieve the ongoing point values +% from \cs{botmark}, and returns two parameters, contained in \cs{argi} and \cs{argiii}. +% \DescribeMacro{\stripeqExam} +% Whereas, \cs{stripeqExam} just retrieves the first parameter only. +% \begin{macrocode} +\def\parsetotals#1\eqExam#2\end{\def\argi{#1}\def\argii{#2}} +\def\stripeqExam#1\eqExam{\def\argii{#1}} +% \end{macrocode} +% \begin{macro}{\settotalsbox} +% This is the box containing the page total, it may appear on the left or right side bottom +% corner. +% \begin{macrocode} +\def\settotalsbox{% + \expandafter\parsetotals\botmark\eqExam\end + \ifx\argi\@empty\hfil + \else\ifx\argii\@empty\hfil + \else + \expandafter\stripeqExam\argii +% \end{macrocode} +% Set \texttt{eqpointsthispage} equal to \cs{argi}, which should be the accumulated total +% for this part of the test so far. +% \begin{macrocode} + \setcounter{eqpointsthispage}{\argi}% +% \end{macrocode} +% This subtract \texttt{eqpointsofar}, which should be the total for this test part through the +% previous page. The difference is the number of points for this page. +% \begin{macrocode} + \addtocounter{eqpointsthispage}{-\value{eqpointsofar}}% +% \end{macrocode} +% Now we set \texttt{eqpointsofar} to the new accumulated total \cs{argi}. +% \begin{macrocode} + \setcounter{eqpointsofar}{\argi}% +% \end{macrocode} +% And save to the auxiliary file for later usage. +% \begin{macrocode} + \xdef\lastparttotaled{\argii}% + \eqe@IWO\@auxout{\string\csarg\string + \gdef{Page\thepage total}% + {\theeqpointsthispage}}% +% \end{macrocode} +% Finally, place the totals box. +% \begin{macrocode} + \totalsbox + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% \DescribeMacro{\totalsboxtext} This is the text that appears in the totals boxes +% \begin{macrocode} +\newcommand\totalsboxtext{\small$ + \eqe@ptsFmt{\theeqpointsthispage}\,\text{% + \ifnum\theeqpointsthispage=1\relax\eqptLabel\else + \eqptsLabel\fi}$} +% \end{macrocode} +% \DescribeMacro{\eqevtranstotbox}\cmd{\eqevtranstotbox} is a length +% that can be used to raise or lower the position of the total boxes +% in the left/right bottom corner. The default is \texttt{0pt}. +% \begin{macrocode} +\newlength\eqevtranstotbox +\setlength{\eqevtranstotbox}{0pt} +% \end{macrocode} +% \DescribeMacro{\totalsboxleft}\DescribeMacro{\totalsboxright} There are two totals boxes, one for the left and one +% for the right side. These can be redefined as desired. +% \begin{macrocode} +\def\eqe@chkZeroTotals{\let\eqe@allow\eqe@YES + \ifx\eqe@zeroTotalsAllowed\eqe@NO + \ifnum\theeqpointsthispage=0 \let\eqe@allow\eqe@NO\fi\fi} +\newcommand{\totalsboxleft}{\eqe@chkZeroTotals + \ifx\eqe@allow\eqe@YES + \makebox[0pt][r]{\setlength\tabcolsep{0pt}% + \raisebox{-\height+\eqevtranstotbox}[0pt][0pt]{% + \marginboxdesign[\insertTotalsBoxPDF]{\totalsboxtext}% + }\hspace*{\marginparsep}% + }\fi\hfil +} +\newcommand{\totalsboxright}{\eqe@chkZeroTotals + \ifx\eqe@allow\eqe@YES + \makebox[0pt][l]{\setlength\tabcolsep{0pt}% + \hspace*{\textwidth}\hspace*{\marginparsep}% + \raisebox{-\height+\eqevtranstotbox}[0pt][0pt]{% + \marginboxdesign[\insertTotalsBoxPDF]{\totalsboxtext}% + }% + }\fi\hfil +} +% \end{macrocode} +% We begin the document by declaring the current part is part 0 with 0 points. This is the default, +% in case the author writes a document with no parts or points! +% \begin{macrocode} +\ifeqe@nopoints\else\if@bypasseqexamheading\else +\AtBeginDocument{\mark{0\csname eqExam\endcsname0}} +\fi\fi +% \end{macrocode} +% At the end of the document, we write out the number of parts for this test, and +% the names of the parts the author has given each part. +% \begin{macrocode} +\AtEndDocument{% + \eqe@IWO\@auxout{\string\csarg\string\gdef{NumberOfParts}% + {\arabic{eq@numparts}}}% + \eqe@IWO\@auxout{\string\csarg\string\gdef{thePartNames}% + {\the\partNames}}% + \clearpage\addtocounter{page}{-1}\writelastpage\relax + \addtocounter{page}{1}% +} +% \end{macrocode} +% \begin{macro}{\theGrandTotal} +% When an exam has multiple parts, the total of each part is computed +% and the grand total is computed with \cs{theGrandTotal}. +% \begin{macrocode} +\newcommand\theGrandTotal{% + $\eqe@ptsFmt{\csname eqeGrandTotal\endcsname}$} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\totalForPart} +% User access to the total for a exam environment, one argument, the name of the exam. +% \begin{macro}{\percentForPart} +% Attempts to calculate the percent of the total that the referenced exam (\texttt{\#1}) +% contributes to the grand total. +% \begin{macrocode} +\newcommand{\totalForPart}[1]{$\eqe@ptsFmt{\csname#1total\endcsname}$} +\def\tot@lForPart#1{\csname#1total\endcsname} +\newcommand{\percentForPart}[1]{$\eqe@ptsFmt + {\csname#1percent\endcsname}$\%} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +%\subsection{Computing Number of Points within a Segment of the Exam} +% +% We add some commands for calculating number of points in a segment of the exam. +% A segment being defined subset of consecutive problems within an exam. We can +% define segments by placing markers (using \cs{placeMarkerHere}) between problems. We can +% then calculate the total number of points between markers. +% +% The counter below is a scratch counter for making the calculations. We assume the +% \texttt{calc} package is loaded, it does the work for us. +% +% \begin{macrocode} +\newcounter{markerCnt} +% \end{macrocode} +% \begin{macro}{\placeMarkerHere} +% Placed outside of any \texttt{problem}/\texttt{problem*} environment, this command +% takes one argument, the symbolic name for this marker. We write to the auxiliary file +% and define a command whose name is based on \texttt{\#1}, and whose value is +% the cumulative total \cs{theeqpointvalue}. +%\changes{v1.8}{2008/11/02} +%{ +% Added a set of commands \cs{placeMarkerHere}, \cs{calcFromMarkers}, +% and \cs{markerTotalFmt} to enable the calculation of totals of segments +% of the exam. +%} +% \begin{macrocode} +\def\placeMarkerHere#1{% + \eqe@IWO\@auxout{\string\csarg\string\gdef + {#1SaveTotalHere}{\theeqpointvalue}}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\calcFromMarkers} +% Once the markers are in place, we can calculate the number of points defined between +% two such markers. The \cs{calcFromMarkers} takes three arguments, \texttt{\#2} and +% \texttt{\#3} are the symbolic names of the two markers. While, \texttt{\#1} is an optional +% argument for formatting the calculation. The default is \cs{@markerTotalFmt}, defined +% below in \cs{markerTotalFmt}. The value of the total is \cs{themarkerCnt}. +% \begin{macrocode} +\newcommand{\calcFromMarkers}[3][\@markerTotalFmt]{% + \@ifundefined{#2SaveTotalHere}{}% + {\@ifundefined{#3SaveTotalHere}{}{\setcounter{markerCnt}% + {\@nameuse{#2SaveTotalHere}-\@nameuse{#3SaveTotalHere}}% + \ifnum\value{markerCnt}<0\relax + \setcounter{markerCnt}{-\value{markerCnt}}\fi#1}}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\markerTotalFmt} +% Used to set the global format of the marker totals. The value of the marker total +% is \cs{themarkerCnt}. The default follows the definition of \cs{markerTotalFmt} +% \begin{macrocode} +\newcommand{\markerTotalFmt}[1]{\def\@markerTotalFmt{#1}} +\markerTotalFmt{\space(\themarkerCnt\space points)} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\calcQsBtwnMarkers} +% \changes{v3.1}{2012/05/16}{Added \cs{calcQsBtwnMarkers}} +% \cs{calcQsBtwnMarkers[\meta{Mrk2}]}|{|\meta{Mrk1}|}| does a number of things; primarily, +% it determines the range of the questions between the two marks. The names of the +% commands produced are all based in the first marker name \meta{Mrk1}. +% \DescribeMacro{ \bslash\meta{Mrk1}Start}\cs{\meta{Mrk1}Start} is the first question number that follows the +% the placement of \cs{calcQsBtwnMarkers}. Similarly, +% \DescribeMacro{ \bslash\meta{Mrk1}End}\cs{\meta{Mrk1}End} +% is the last question number between the two marks \meta{Mrk1} and \meta{Mrk2}. +% +% We also calculate \DescribeMacro{ \bslash\meta{Mrk1}nQs}\cs{\meta{Mrk1}nQs}, the number of questions appearing between +% \meta{Mrk1} and \meta{Mrk2}. +% \begin{macrocode} +\newcommand{\calcQsBtwnMarkers}[2][]{\setcounter{markerCnt}{0}% + \def\eqe@argi{#1}% +% \end{macrocode} +% \cs{\meta{Mrk1}thisQnum} is the question number in effect at the point where +% the command \cs{calcQsBtwnMarkers} is inserted. +% \begin{macrocode} + \eqe@IWO\@auxout{\string\csarg\string\gdef + {#2thisQnum}{\theeqquestionnoi}}% +% \end{macrocode} +% \cs{\meta{Mrk1}Start} is 0 if undefined. +% \begin{macrocode} + \@ifundefined{#2thisQnum}{\csarg\xdef{#2Start}{0}% + \eqe@IWO\@auxout{\string\csarg\string\gdef + {#2Start}{0}}% + }{% +% \end{macrocode} +% \cs{\meta{Mrk1}Start} is the current question number plus 1. +% \begin{macrocode} + \setcounter{markerCnt}{\value{eqquestionnoi}+1}\csarg + \xdef{#2Start}{\the\value{markerCnt}}% + \eqe@IWO\@auxout{\string\csarg\string\gdef + {#2Start}{\@nameuse{#2Start}}}% + } +% \end{macrocode} +% Using now both \meta{Mrk1} and \meta{Mrk2} we calculate the difference +% in the two. Result held in \texttt{markerCnt}. If there is no optional parameter, \meta{Mrk2}, +% do not produce the \cs{\meta{Mrk1}thisQnum}. +% \begin{macrocode} + \ifx\eqe@argi\@empty\else + \@ifundefined{#2thisQnum}{\setcounter{markerCnt}{0}}% + {\@ifundefined{#1thisQnum}{\setcounter{markerCnt}{0}}{% + \setcounter{markerCnt}% + {\@nameuse{#1thisQnum}-\@nameuse{#2thisQnum}}% + }}% + \fi +% \end{macrocode} +% \cs{\meta{Mrk1}nQs} is the number of questions that appear between +% \meta{Mrk1} and \meta{Mrk2}. +% \begin{macrocode} + \csarg\xdef{#2nQs}{\the\value{markerCnt}}% + \eqe@IWO\@auxout{\string\csarg\string\gdef + {#2nQs}{\the\value{markerCnt}}}% +% \end{macrocode} +% \cs{\meta{Mrk1}End} is 0 if undefined. If there is no optional parameter, \meta{Mrk2}, +% do not produce the \cs{\meta{Mrk1}End} +% \begin{macrocode} + \ifx\eqe@argi\@empty\else + \@ifundefined{#1thisQnum}{\csarg\xdef{#2End}{0}% + \eqe@IWO\@auxout{\string + \csarg\string\gdef{#2End}{0}}% + }{% +% \end{macrocode} +% \cs{\meta{Mrk1}End} is \cs{\meta{Mrk2}thisQnum}. +% \begin{macrocode} + \csarg\xdef{#2End}{\@nameuse{#1thisQnum}}% + \eqe@IWO\@auxout{\string\csarg\string\gdef + {#2End}{\@nameuse{#2End}}}% + }% + \fi +} +% \end{macrocode} +% \begin{macro}{\markStartFor} +% \begin{macro}{\markEndtFor} +% \begin{macro}{\markNumQsFor} +% We provide a user interface to the three macros defined above. The required +% parameter is a mark (a name that was used as the first argument of +% \cmd{\calcQsBtwnMarkers}). +% \begin{macrocode} +\newcommand{\markStartFor}[1]{\@nameuse{#1Start}} +\newcommand{\markEndFor}[1]{\@nameuse{#1End}} +\newcommand{\markNumQsFor}[1]{\@nameuse{#1nQs}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Useful Commands to Write Problems} +% +% \subsubsection{The \texorpdfstring{\cs{placeAtxy}}{\textbackslash{placeAtxy}} command} +% \begin{macro}{\placeAtxy} +% Use to place material within the solutions area that is visible to the student +% on the test document. Syntax: +% \begin{quote}\switchCats\ttfamily +% \string\placeAtxy{\meta(x\_dim)}{\meta(y\_dim)}{\meta(content)} +% \end(quote) +% \cs{placeAtxy} goes immediately after \verb!\end{solution}! +% \begin{macrocode} +\newcommand{\placeAtxy}[3]{{% + \par\nointerlineskip + \ifdisplayworkarea + \ifx\eq@insertverticalspace\eqe@YES + \makebox[0pt][l]{\hspace*{-\parindent}\hspace*{#1}% + \raisebox{#2}[0pt][0pt]{#3}}\fi + \fi +}} +% \end{macrocode} +% \end{macro} +% \subsubsection{The \texttt{workarea} environment} +% As of this writing, 2012/12/09, this segment of code has been re-written. The +% \texttt{splitsolution} and \texttt{panel} environments have a new syntax. I've never +% gotten any feedback from user who use these environments, so I suspect the impact +% of these changes are minimal. +% \begin{environment}{workarea} +% A work area is an environment used when we display vertical space such as when the +% \texttt{nosolutions} and \texttt{vspacewithsolns} options are in effect. +% \DescribeMacro{\workareasb}\cmd{\workareasb} is a save box used in the +% argument of \texttt{lrbox} to save the contents of the \texttt{minipage}. +% \begin{quote}\switchCats\ttfamily +% \string\begin{workarea}[\meta(width)]{\meta(depth)}\\ +% ...\\ +% \string\end{workarea} +% \end(quote) +% \begin{macrocode} +\newsavebox{\workareasb} +% \end{macrocode} +% \changes{v5.0}{2017/11/08}{Added \string\cs{workareaVadj}} +% \DescribeMacro{\workareaVadj}\hskip-\marginparsep\darg{\ameta{skip}} adjusts the vertical skip +% of the first line that appears in the \env{workarea} environment. +% \begin{macrocode} +\def\workareaVadj#1{\bgroup\def\eqe@rgi{#1}\ifx\eqe@rgi\@empty + \def\eqe@rgi{0pt}\fi\setlength{\@tempdima}{\eqe@rgi}% + \xdef\workareaV@dj{\the\@tempdima}\egroup +} % dps1 +\workareaVadj{3pt} +\def\workareaCmds#1{\def\@rgi{#1}\ifx\@rgi\@empty + \let\work@reaCmds\relax\else + \def\work@reaCmds{#1}} +\let\work@reaCmds\relax +\def\priorworkareaCmds#1{\def\@rgi{#1}\ifx\@rgi\@empty % dpsj6 + \let\priorWorkAreaCmds\relax\else + \def\priorWorkAreaCmds{#1}\fi} +\let\priorWorkAreaCmds\relax +% \end{macrocode} +% \begin{macrocode} +\newenvironment{workarea}[2][\linewidth] +{% + \removelastparskip + \edef\workareadepth{\if\currhideopt H0pt\else#2\fi}% + \begin{lrbox}{\workareasb}\setlength{\eqetmplengtha}{#1}% +% \end{macrocode} +% A change in support of \cs{fillTypeGrid}. When \cs{ifforceEqualCells} is true, +% we adjust the width of this \env{minipage} to conform to the shorter line +% produced by the grid. +% \changes{v5.0}{2017/11/08}{Changes in \string\env{workarea} to support +% \string\cs{fillTypeGrid}} +% \begin{macrocode} + \ifx\makeVgrid\relax\else % dps2 + \ifforceEqualCells + \ifx\fillLinesLineWidth\@empty\else + \setlength{\eqetmplengtha}{\fillLinesLineWidth}\fi + \fi + \fi + \begin{minipage}[b][\workareadepth][t]{\eqetmplengtha}% +% \end{macrocode} +% Apply vertical skip \cs{workareaV@dj} here, set by \cs{workareaVadj}. +% \begin{macrocode} + \vglue\workareaV@dj +% \end{macrocode} +% Adjust \cs{leftskip} when the problem is a lead-in. +% \changes{v5.0}{2017/11/08}{Within \string\env{workarea}, adjust \string\cs{leftskip} +% when the problem is a lead-in type} +% \begin{macrocode} + \@ifundefined{leadinIndentPrtSep}{}{\ifx\solutionparshape\@empty + \else\leftskip\leadinIndentPrtSep\fi}\work@reaCmds +}{% + \end{minipage}\end{lrbox}% +% \end{macrocode} +% \texttt{4/5/11} Changed the logic here, so the \texttt{workarea} is available +% for the \texttt{vspace\-with\-solns} option. +% \changes{v5.1.3}{2018/12/13}{added \string\textsf{solutions-after} condition to +% displaying \string\texttt{workarea}} +% \begin{macrocode} + \ifeq@solutionsafter\else + \par\ifdisplayworkarea + \ifx\eq@insertverticalspace\eqe@YES + \removelastparskip + \vglue-\baselineskip + \if\currhideopt H\else + \noindent\strut\smash{\usebox{\workareasb}}% + \fi\fi + \fi\fi +} +% \end{macrocode} +% \end{environment} +% \subsubsection{The \texttt{splitsolution} environment} +% \begin{environment}{splitsolution} +%\changes{v3.2}{2012/12/10}{Rewrote splitsolution and related code to change the syntax.} +% This is a special solution environment designed for use with the +% \texttt{online} or \texttt{email} options, but it is compatible with all other options +% as well.\par\medskip\noindent +%\begin{minipage}{.55\linewidth} +%\textbf{New Syntax}\\[3pt] +%\begingroup\small +% \switchCats\ttfamily +% \string\begin{splitsolution}[\meta(width)][\meta(depth)]\\ +% \string\begin{panel}[l\string|r]\\ +% ...\\ +% \string\end{panel}\\ +% \string\begin{solution}\\ +% ...\\ +% \string\end{solution}\\ +% \string\end{splitsolution} +%\par\endgroup +%\end{minipage}\hfil +%\begin{minipage}{.45\linewidth} +%\textbf{Old Syntax}\\[3pt] +%\begingroup\small +% \switchCats\ttfamily +% \string\begin{splitsolution}{\meta(depth)}\\ +% \string\begin{panel}[l\string|r]{\meta(width)}\\ +% ...\\ +% \string\end{panel}\\ +% \string\begin{solution}\\ +% ...\\ +% \string\end{solution}\\ +% \string\end{splitsolution} +%\par\endgroup +%\end{minipage} +%\par\medskip\noindent +% The \texttt{panel} writes its contents to a CUT file, then inputs it back +%in to get its dimensions, it places the contents in the box +%\cs{eqpanelbox}. +% +% Below is an example of the use of the \texttt{splitsolution} environment +% (which is defined well below here). +%\begin{verbatim} +%\begin{problem}[5] +%This is a question worth $5$ points. +%\begin{splitsolution} +%\begin{panel}\relax +%\includegraphics[scale=.2]{fig1} +%\end{panel} +%\begin{solution} +%This a really good solution and worthy of a $5$ points. +%\end{solution} +%\end{splitsolution} +%\end{problem} +%\end{verbatim} +% Here, we include a graphic. We put it into a box, \cs{eqpanelbox} to get its dimensions. +% The \texttt{splitsolution} environment has one required argument, the total height of the +% solution. We then place the graphic in the \texttt{panel} environment, and write the solution +% in the usual way. +%\par\medskip\noindent +% We arrive at the \DescribeEnv{splitsolution}\texttt{splitsolution} environment. +% \begin{macrocode} +\def\splitsolution{% + \@ifnextchar[{\splitsolutioni}% + {\splitsolutioniii{\panelwidth}{\panelheight}}% +} +\def\splitsolutioni[#1]{% + \@ifnextchar[{\splitsolutionii{#1}} + {\splitsolutioniii{\panelwidth}{#1}}% +} +\def\splitsolutionii#1[#2]{% + \splitsolutioniii{#1}{#2}% +} +\def\splitsolutioniii#1#2{% + \@ifundefined{panel@write}{\newwrite\panel@write}{}% + \gdef\ss@Argiii{#1}\gdef\ss@Argii{#2}% +% \end{macrocode} +% Here, we \cs{let} \cs{solution} to \cs{@sssolution} and replace it with +% \cs{@ssSolution} +% \begin{macrocode} + \let\@sssolution\solution + \let\end@sssolution\endsolution + \let\solution\@ssSolution + \let\endsolution\end@ssSolution + \par\noindent\ignorespaces +% \end{macrocode} +% The \texttt{panel} environment should appear next, just after the \verb!\begin{splitslution}! +% \begin{macrocode} +} +\def\endsplitsolution{% + \ifeq@solutionsafter\solutionsafterSkip\fi % dpsj10 + \ifx\solutionparshape\@empty\else + \advance\linewidth-\leadinIndentPrtSep\fi %%dps + \edef\eqe@workwidth{\if\ss@Argi l\noexpand\ss@Argiii + \else\noexpand\linewidth\fi}% + \edef\eqe@workfill{\if\ss@Argi l\else\hfill\fi}% + \ifeq@solutionsafter\else + \begin{workarea}[\eqe@workwidth]{\eqedepth}% + \let\panelGetDimen\relax% + \eqe@workfill\input{panel\thepanel@cnt.cut}% + \end{workarea} + \fi\ifeq@solutionsafter\else\solutionsafterSkip\fi +} +% \end{macrocode} +% \end{environment} +%\par\medskip\noindent +% \DescribeMacro{\panelgap}\cs{panelgap} is the separation between solution area +% and the panel. \DescribeMacro{\eqpanelbox} is a box to put things into, to measure their +% dimensions. The user accessible commands \DescribeMacro{\panelwidth}\cs{panelwidth} returns the +% width and \DescribeMacro{\panelheight}\cs{panelheight} the height. There is a special counter +% \DescribeMacro{panel@cnt}\texttt{panel@cnt} to keep track of the panels generated. +% \begin{macrocode} +\newcommand\panelgap{3pt} +\newsavebox{\eqpanelbox} +\newdimen\eqepanelwidth +\newdimen\eqepanelheight +% \end{macrocode} +% The \DescribeMacro{\getDimSSPanel}\cs{getDimSSPanel} is an internal command. It +% places it argument in the box \cs{eqpanelbox} and gets its dimensions. It +% save the dimensions as \cs{eqepanelwidth} and \cs{eqepanelheight} (the total height). +% \begin{macrocode} +\newcommand{\getDimSSPanel}[1]{% + \sbox{\eqpanelbox}{#1}% + \eqepanelwidth=\wd\eqpanelbox + \eqepanelheight=\ht\eqpanelbox + \advance\eqepanelheight by\the\dp\eqpanelbox +} +% \end{macrocode} +% \DescribeMacro{\panelwidth}\cs{panelwidth} and \DescribeMacro{\panelheight}\cs{panelheight} +% are aliases for the dimension registers. This is for compatibility with previous versions. +% \begin{macrocode} +\def\panelwidth{\eqepanelwidth} +\def\panelheight{\eqepanelheight} +\newcounter{panel@cnt} +% \end{macrocode} +% \DescribeMacro{panel} environment goes inside the \texttt{splitsolution} +% environment. Permissible values of the first parameter are \texttt{r} and +% \texttt{l}, the default being \texttt{l}. This is the alignment parameter. +% The second argument is the width of the panel. +% \begin{macrocode} +\def\panel{\def\eqe@panelir{\eqe@paneli[r]}% + \@ifnextchar[{\eqe@paneli} + {\@ifnextchar\relax{\expandafter\eqe@panelir\@gobble}% + {\eqe@paneli[r]}}% +} +% \end{macrocode} +% We continue the \texttt{panel} environment. +% \begin{macrocode} +\def\eqe@paneli[#1]{% + \gdef\ss@Argi{#1}\def\eqe@l{l}\def\eqe@r{r}% + \ifx\ss@Argi\@empty\gdef\ss@Argi{r}\else + \ifx\eqe@l\ss@Argi\else\ifx\eqe@r\ss@Argi\else + \PackageError{eqexam}{Permissible arguments for panel are l and r} + {Use l or r for the argument of panel.}\fi\fi\fi + \stepcounter{panel@cnt}% + \immediate\openout \panel@write panel\thepanel@cnt.cut +% \end{macrocode} +% Manage the \texttt{h}, \texttt{H}, and global overrides. +% \begin{macrocode} + \if\currhideopt H% + \eqe@IWO\panel@write{\vfill}% + \immediate\closeout\panel@write + \gdef\ss@Argii{0pt}% + \else + \if\currhideopt h\ifeq@solutionsafter\else + \ifeq@globalshowsolutions\else + \eqe@IWO\panel@write{\vfill}% + \immediate\closeout\panel@write + \gdef\ss@Argii{0pt}% + \fi\fi + \fi + \fi + \begingroup +% \end{macrocode} +% Write the contents of this environment to the file +% \texttt{panel\string\thepanel@cnt.cut}. +% \begin{macrocode} + \let\verbatim@out\panel@write +% \end{macrocode} +% We begin by writing \verb!\panelGetDimen{%! to the CUT file +% \begin{macrocode} + {\lccode`C=`\%\lccode`P=`\{ + \lowercase{\eqe@IWO\verbatim@out{\string\panelGetDimen PC}}}% +% \end{macrocode} +% Followed by the verbatim listing of the \texttt{panel} environment. +% \begin{macrocode} + \verbatimwrite +} +\def\endpanel{% + \endverbatimwrite +% \end{macrocode} +% After the verbatim write, we write \verb!}! to close off the argument +% of \cs{panelGetDimen}. +% \begin{macrocode} + {\lccode`P=`\}\lowercase{\eqe@IWO\verbatim@out{P}}}% + \immediate\closeout\panel@write + \endgroup +% \end{macrocode} +% The command \cs{eqePANEL} cut does all the work at the end of this environment. +% We first \cs{let} \cs{panelGetDimen} to \cs{getDimenSSPanel} and input the +% CUT file. This loads the panel contents into \cs{eqpanelbox}, and gets their +% dimensions. We set the value of \cs{ss@Argiii} which is the width parameter +% of the \texttt{splitsolution} environment. \cs{mp@Width} calculates the width. +% \begin{macrocode} + \gdef\eqePANELCUT{% + \let\panelGetDimen\getDimSSPanel + \input{panel\thepanel@cnt.cut}% + \setlength{\eq@tmpdima}{\ss@Argiii}% + \xdef\ss@Argiii{\the\eq@tmpdima}% + \xdef\mp@Width{\ifeq@solutionsafter\linewidth + \else\linewidth-\ss@Argiii-\panelgap\fi}% + }\aftergroup\eqePANELCUT +} +% \end{macrocode} +% \cs{eqe@IW} is a macro that either writes verbatim text (\texttt{\#1}), or +% it gobbles the argument, depending on whether have \texttt{solutionsafter}, \texttt{nosolutions}, +% hidden or not hidden. +% \begin{macrocode} +\long\def\eqe@IW#1{% + \ifeq@solutionsafter + \let\eqe@next\@empty + \else + \def\eqe@next{\eqe@IWO\verbatim@out{#1}}% + \ifeq@nosolutions\else + \if\currhideopt H% + \gdef\ss@Argii{0pt}\let\eqe@next\@empty + \else + \if\currhideopt h% + \ifeq@globalshowsolutions\else + \gdef\ss@Argii{0pt}\let\eqe@next\@empty + \fi + \fi + \fi + \fi + \fi + \eqe@next +} +% \end{macrocode} +% The \texttt{splitsolution} environment \cs{let}s the solution environment +% to the internal \texttt{@ssSolution} environment. It performs various tasks +% then turns it over to the old solution environment, which has been \cs{let} +% to \cs{@sssolution}. +% \begin{macrocode} +\newenvironment{@ssSolution}[1][\ss@Argii]% +{% + \def\eqe@argi{#1}\ifx\eqe@argi\@empty\else + \let\soln@keys@nLines\@empty + \edef\panelheight{\the\panelheight}% + \edef\panelwidth{\the\panelwidth}% + \edef\temp@exp{\noexpand + \setkeys*{soln@keys}{#1}}\temp@exp + \ifx\soln@keys@nLines\@empty + \edef\ss@Argii{\XKV@rm}% + \else + \@tempdima\wlVspace\relax + \@tempdima=\soln@keys@nLines\@tempdima + \edef\ss@Argii{\the\@tempdima}% + \ifx\XKV@rm\@empty\else + \if@equsedim\edef\ss@Argii{\XKV@rm}\fi\fi + \fi + \setlength{\eq@tmpdima}{\ss@Argii}% +% \ifx\sameVspace\@empty\gdef\sameVspace{0pt}\fi +% \end{macrocode} +% If the \texttt{panelheight} is greater than the requested height, +% we make the requested height equal to \texttt{panelheight}. +% \begin{macrocode} + \ifdim\eqepanelheight>\eq@tmpdima + \eq@tmpdima\eqepanelheight\fi + \xdef\ss@Argii{\the\eq@tmpdima}% + \fi +% \end{macrocode} +% We calculate the depth of the solutions; this is generally the values +% passed to use as the optional argument, and encapsuled by \cs{ss@Argii}. +% \begin{macrocode} + \xdef\eqedepth{% + \ifvspacewithsolns\ss@Argii\else + \ifeq@nosolutions\ss@Argii\else + \ifeq@solutionsafter\ss@Argii\else0pt\fi\fi\fi}% +% \end{macrocode} +% The width is either \cs{linewidth} or \verb!\linewidth-\ss@Argiii-\panelgap!, +% where \cs{ss@Argiii} is the width of the panel. +% \begin{macrocode} + \xdef\mp@Width{\ifeq@solutionsafter\noexpand\linewidth\else + \noexpand\linewidth-\ss@Argiii-\panelgap\fi}% +% \end{macrocode} +% If its a left panel\dots +% \begin{macrocode} + \if\ss@Argi l% + \ifeq@solutionsafter + \def\eqe@lPanel{\parbox[b][\eqedepth][t]{\ss@Argiii} +% \end{macrocode} +% Here, and elsewhere, we \cs{let} \cs{panelGetDimen} to \cs{relax} when we +% want to purely input the CUT file in the solution. +% \begin{macrocode} + {\let\panelGetDimen\relax + \input{panel\thepanel@cnt.cut}\vfill}\hfill}% + \def\eqe@rPanel{\@empty}% + \else +% \end{macrocode} +% For the left panel, we need to subtract \cs{eqemargin} +% \begin{macrocode} + \def\eqe@subleftgutter{-\string\eqemargin}% + \def\eqe@lPanel{% + \string\parbox[b][\string\eqedepth]{\ss@Argiii}% + {\string\let\string\panelGetDimen\string\relax + \string\input{panel\thepanel@cnt.cut}% + \string\vfill}\string\hfill^^J}% + \def\eqe@rPanel{\@empty}% + \fi + \else +% \end{macrocode} +% If its a right panel\dots +% \begin{macrocode} + \ifeq@solutionsafter + \def\eqe@lPanel{\@empty}% + \def\eqe@rPanel{% + \hfill\parbox[b][\eqedepth][t]{\ss@Argiii} + {\let\panelGetDimen\relax + \hfill\input{panel\thepanel@cnt.cut}\vfill}}% + \else +% \end{macrocode} +% For the right panel, we do not to subtract \cs{eqemargin} as above. +% \begin{macrocode} + \let\eqe@subleftgutter\@empty + \def\eqe@lPanel{\@empty}% + \def\eqe@rPanel{% + \string\hfill\string\parbox[b][\string\eqedepth]% + {\ss@Argiii}{\string\endgraf% + \string\noindent\string\hfill% + \string\let\string\panelGetDimen\string\relax + \string\input{panel\thepanel@cnt.cut}% + \string\vfill}}% + \fi + \fi + \let\verbatim@out\ex@solns + \par\ifeq@solutionsafter\smallskip\fi +% \end{macrocode} +% Since everything is put a box, we set the \cs{linewidth}, and +% set \cs{solutionparshape} to \cs{@empty}. +% \begin{macrocode} + \ifx\solutionparshape\@empty\else + \advance\linewidth-\leadinIndentPrtSep\fi %%dps + \let\solutionparshape\@empty + \noindent\minipage{\linewidth}% + \if\ss@Argi l\noindent\parbox[b][\eqedepth][t]{\ss@Argiii}% + {\vfill}\hfill\fi + \minipage[b][\eqedepth][t]{\mp@Width}% + {\lccode`C=`\%\lowercase{\eqe@IW{% + \string\def\string\panelgap{\panelgap}% + \string\setlength{\string\panelwidth}{\ss@Argiii}% + \string\def\string\eqedepth + {\ifeq@nosolutions\ss@Argii\else\ss@Argii\fi}C}}}% + {\lccode`C=`\%\lowercase{\eqe@IW{% + \string\strut\string\noindent% +% \string\strut\par\string\nobreak\string\noindent% + \string\hbox\space to\string\linewidth\bgroup^^J% + \eqe@lPanel\string\minipage[b][\string\eqedepth][t]% + {\string\linewidth\eqe@subleftgutter% + -\string\panelwidth-\string\panelgap}C + }}}% + \ifeq@solutionsafter + \noindent\strut\hbox to\linewidth\bgroup + \eqe@lPanel + \minipage[b][\eqedepth][t]{\linewidth-\ss@Argiii-\panelgap}% + \def\solutionsafterSkip{}% + \fi +% \end{macrocode} +% Here, we start the original definition of the solutions environment, which was \cs{let} +% to \cs{@sssolution}. +% \begin{macrocode} + \ifx\soln@keys@nLines\@empty + \edef\passedss@Argii{\ss@Argii}\else + \edef\passedss@Argii{\ss@Argii,nLines=\soln@keys@nLines}\fi +% \end{macrocode} +% For a split solution, cannot allow align left +% \begin{macrocode} + \if\ss@Argi l\fillerLinesAlignDef\fi % dpsj10 +% \end{macrocode} +% I cannot get the filler lines to work when the anserkey is in effect. The next +% few lines locally turns off filler lines for this problem. +% \begin{macrocode} + \ifanswerkey % dpsj10 + \gdef\p@ssToFLs{\let\eq@insertverticalspace\eqe@NO + \@eqlinedfillerfalse}\fi % dpsj10 + \eqe@flextendedfalse + \expandafter\@sssolution\expandafter[\passedss@Argii]% +}{% + \eqe@IW{\string\endminipage\eqe@rPanel\egroup}% + \ifeq@solutionsafter\endminipage\eqe@rPanel\egroup\fi + \end@sssolution + \endminipage\endminipage +} +% Redefine the \cs{paragraph} command +% \begin{macrocode} +\renewcommand{\paragraph} + {\@startsection{paragraph}{4}{0pt}{12pt}{-3pt}{\bfseries}} +% \end{macrocode} +% \begin{macro}{\defaultInstructions} +% For the \texttt{instructions} environment, defined next, the default string +% for the instructions is \cs{eq@default@Instructions}, this command is +% defined using \cs{defaultInstructions}. +% \begin{macrocode} +\newcommand{\defaultInstructions}[1]{\def\eq@default@Instructions{#1}} +\defaultInstructions{Instructions.} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{instructions} +% Each test, or a part of a test usually have instructions. This \texttt{instruction} +% environment is used in this purpose. Normally, the number of points for the part is +% displayed following the heading (the default is \textbf{Instructions.}). You can +% eliminate the total points from the instructions by taking the \texttt{nosummarytotals} +% option. +% +% \begin{macrocode} +\newcommand{\beforeInstrSkip}{1ex} +\newcommand{\afterInstrSkip}{-0em} +\newcommand\hInstrSpace{\ } +\newcommand\styleInstr{\bfseries} +\newenvironment{instructions}[1][\eq@default@Instructions]{% +% \end{macrocode} +% If \cs{summaryPointTotal} is zero, show no summary points. +% \begin{macrocode} + \@ifundefined{\thisexamlabel total}{\let\eq@nosummarytotals\eqe@YES} + {\ifnum\summaryPointTotal=0 \let\eq@nosummarytotals\eqe@YES\fi}% + \expandafter\def\expandafter\eq@argi\expandafter{#1}% + \def\hsi{\hInstrSpace}% +% \end{macrocode} +% We start a paragraph environment +% \begin{macrocode} + \@startsection{paragraph}{4}{\z@}% + {\beforeInstrSkip\space\@plus1ex \@minus.2ex}% + {\afterInstrSkip}{\normalfont\normalsize\styleInstr}*% + {\textcolor{\@instructionsColor}{#1}\normalcolor% + \ifx\eq@nosummarytotals\eqe@YES\else\ifx\eq@argi\@empty\else\hsi\fi + {\normalfont\summaryTotalsTxt}\hsi\fi}\hskip-\lastskip + \ifx\eq@nosummarytotals\eqe@YES\ifx\eq@argi\@empty\else\hsi\fi\fi + \normalfont\normalsize\ignorespaces +}{\par\vskip\beforeInstrSkip\relax} +% \end{macrocode} +% \cmd{\summaryPointTotal}\DescribeMacro{\summaryPointTotal} contains the total points +% for the current exam; the command \cmd\summaryTotalsTxt\DescribeMacro\summaryTotalsTxt\ defines its the formatting +% for the points. The command \cmd\nQuesInExam\DescribeMacro\nQuesInExam\ is the total number +% of questions in the exam. +% \begin{macrocode} +\newcommand\summaryPointTotal{\csname\thisexamlabel total\endcsname} +\newcommand\summaryTotalsTxt{($\eqe@ptsFmt{\summaryPointTotal}\,\text{% + \@ifundefined{\thisexamlabel total}{\eqpointsLabel}% + {\ifnum\summaryPointTotal=1\relax\eqpointLabel\else + \eqpointsLabel\fi}}$)} +\newcommand{\nQuesInExam}[1][\thisexamlabel]{% + \def\eqe@argi{#1}% + \ifx\thisexamlabel\@empty\ifx\eqe@argi\thisexamlabel + \PackageError{eqexam}{The optional argument for + \string\nQuesInExam\MessageBreak must be specified}{}\fi\fi + \csname#1nQuestions\endcsname} +% \end{macrocode} +% \end{environment} +% Make this definition for \texttt{hyperref}, so its anchors will be unique. Useful +% when there are multiple parts of the test. +% \begin{macrocode} +\ifx\hyper@anchor\@undefined\else + \renewcommand\theHeqquestionnoi + {\curr@quiz.\theeqquestionnoi\eqe@fpmrk} + \renewcommand\theHquizno{% + \if\probstar*\curr@quiz.% + \theeqquestionnoi.part\thepartno.\arabic{quizno}% + \else + \curr@quiz.% + \theeqquestionnoi.\arabic{quizno}% + \fi + } + \renewcommand\theHpartno{\curr@quiz.% + \theeqquestionnoi.part\thepartno} +\fi +% \end{macrocode} +% \begin{environment}{eqComments} +% Often, I want to make additional instructions between problems, you can use +% this comment environment. +% \begin{macrocode} +\newcommand{\beforeCommentSkip}{1.25ex} +\newcommand{\afterCommentSkip}{-1ex} +\newcommand\hCommSpace{\ } +\newcommand\styleComm{\bfseries} +\newenvironment{eqComments}[1][\strut]{\removelastskip + \def\eqe@argi{#1}\def\eqe@Strut{\strut}\def\hsc{\styleComm}% + \@startsection{paragraph}{4}{\z@}% + {\beforeCommentSkip\space\@plus1ex \@minus.2ex}% + {\afterCommentSkip}{\normalfont\normalsize\styleComm}*% + {\textcolor{\@eqCommentsColor}{#1}}% + \ifx\eqe@argi\eqe@Strut\hskip\afterCommentSkip + \else\ifx\eqe@argi\@empty\hskip\afterCommentSkip\else + \hsc\strut\fi\fi\normalfont\normalsize + \color{\@eqCommentsColorBody}\ignorespaces +}{\par\vskip\beforeCommentSkip\space\@plus1ex \@minus.2ex} +% \end{macrocode} +% \end{environment} +% \subsection{The \texttt{exam} Environment} +% Each part of the exam is enclosed in an \texttt{exam} environment. The environment is +% a customized version of the \texttt{shortquiz} environment. +% \begin{macro}{\exambegdef} +% Some definitions that are executed at the beginning of each exam environment. +% \begin{macrocode} +\let\tb@beginexam@code\relax +\def\partialspillovertotals{0} +\def\exambegdef +{% + \csname\thisexamlabel pagemark\endcsname + \@ifundefined{partialtotalpg}{}{% + \ifnum\partialtotalpg=\arabic{page}% + {\count0=\partialspillovertotals + \advance\count0by\partialtotaleoe + \xdef\partialspillovertotals{\the\count0}% + \eqe@IWO\@auxout{\string\csarg\string\gdef + {Page\partialtotalpg spilltotal}{\partialtotaleoe}}% + }% + \fi + }% + \csarg\ifx{\thisexamlabel pageno}\relax + \else + \csarg\ifx{pagenofirstprob\thisexamlabel}\relax + \else + \csarg\ifnum{\thisexamlabel pageno} + < \@nameuse{pagenofirstprob\thisexamlabel}% + \else + \csarg\ifx{\thisexamlabel pagemark}\relax + \else + \ifnum\value{page}=% + \csname\thisexamlabel pageno\endcsname + \eqe@IWO\@auxout{\string\csarg\string\gdef + {\thisexamlabel pagemark}{\string\newpage}}% + \fi + \fi + \fi + \fi + \fi + \setcounter{eqquestionnoi}{0}\setcounter{eqpointvalue}{0}% + \setcounter{eqpointsofar}{0}\setcounter{eqpointsthispage}{0}% + \setcounter{eq@count}{0}% +% \end{macrocode} +% We wrote \verb!\begin{eqequestions}! to the top of the solutions file (\cs{jobname.sol}. +% \begin{macrocode} + \writeBeginEqeQuestions +% \end{macrocode} +% \begin{macrocode} + \label{\thisexamlabel PageBegin}% + \eqe@IWO\@auxout{\string\csarg\string\gdef + {\thisexamlabel pageno}{\thepage}}% +% \let\sq@priorhook\@empty + \ifeqfortextbook + \global\examenvtrue\tb@beginexam@code + \fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\examenddef} +% Some definitions that are executed at the end of each exam environment. +% We place a totals box to report the total since the last page. +% \begin{macrocode} +\def\tb@insmargmark{\ifisinstred\ifismarginans + \insMidMarg{\mark{}}\fi\fi} +\def\eqe@adjForSepRule{\if\eq@parttotals\eqe@YES + \eq@pointboxtotalheight\halfHtPtBox\relax + \advance\eq@pointboxtotalheight\dpPtBox\relax + \advance\eq@pointboxtotalheight\pointsmarginparpush + \vspace*{\eq@pointboxtotalheight}\fi} +\def\eqe@afterexamsepcode{% + \if\eq@parttotals\eqe@YES + \@actionsAtPageBreak{\global\let\@spacetobreak1}% + {\global\let\@spacetobreak0}% + \ifx\@spacetobreak0\relax + \bgroup\@tempdima=\pagetotal + \advance\@tempdima\eq@pointboxtotalheight + \ifdim\@tempdima>\pagegoal\aftergroup\newpage + \else\ifnum\arabic{eq@count}>0\relax + \removelastskip\vskip6pt\kern0pt + \if\@reportpoints\eqe@One\else\@checkSpacing{0}\fi + \textcolor{\endexamtotal@color}% + {\eqeomarginbox{\arabic{eq@count}}{0}}\fi + \ifx\eqx@separationrule\eqe@YES + \separationrule\eqe@adjForSepRule\fi + \fi\egroup + \fi + \else\ifx\eqx@separationrule\eqe@YES + \separationrule\eqe@adjForSepRule\fi + \fi +} +\def\examenddef +{% + \global\let\partialtotaleoe\relax + \global\let\partialtotalpg\relax + \global\let\afterexamsepcode\relax + \csarg\ifx{NumberOfParts}\relax + \else + \ifnum\value{eq@numparts}<\NumberOfParts + \setcounter{eq@count}{\value{eqpointvalue}}% + \addtocounter{eq@count}{-\value{eqpointsofar}}% + \xdef\partialtotaleoe{\arabic{eq@count}}% + \xdef\partialtotalpg{\arabic{page}}% +% \end{macrocode} +% See if there is enough room at the bottom of the page to place the end of exam +% totals and to start a new exam, if any. If not, forget it, and start a new page. +% \begin{macrocode} + \global\let\afterexamsepcode\eqe@afterexamsepcode + \fi + \fi + \ifeqfortextbook\global\examenvfalse\fi +% \end{macrocode} +% (2011/05/08) Just before the file is closed and input, we write the end +% of the \texttt{eqequestions} environment, \verb!\end{eqequestions}!. +% \begin{macrocode} + \writeEndEqeQuestions +% \end{macrocode} +% \begin{macrocode} + \writetotalstoaux + \addtocounter{page}{-1}% + \writelastpage[\thisexamlabel]\addtocounter{page}{1}% + \ifeqfortextbook\tb@insmargmark\fi +} +\def\@actionsAtPageBreak#1#2{% + \bgroup\@tempdima\pagegoal\advance\@tempdima-\pagetotal + \@tempdimb\@fvsizeskip\vsize + \ifdim\@tempdima < \@tempdimb #1\else #2\fi\egroup +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\separationrule} +% For an exam with multiple parts, a separation rule is created, unless absorbed +% into a page break. The command \cs{separationrule} defines this separation rule, +% it can be redefined as desired. +% \changes{v1.7a}{2007/12/10} +%{ +% Added \cs{separationrule} so user's can redesign the separation rule +% that is created between two parts of an exam. +%} +% \begin{macrocode} +\newcommand{\separationrule}{\makebox[\linewidth-\eqemargin][c]% + {\rule{.67\linewidth}{.4pt}}} +% \end{macrocode} +% \end{macro} +% (2011/05/08) This is a new environment that makes an exam into a list of problems. +% This is an attempt to expand the use of \textsf{eqexam} to {\LaTeX} +% documents. We give control over the page layout so an eqexam document +% can be used within a textbook. +% \begin{macrocode} +\def\eqe@hspannerPrb{\ } +\@ifundefined{ifwithinsoldoc}{\newif\ifwithinsoldoc\withinsoldocfalse}{} +\newcommand{\eqequestopsep}[1]{\def\eqeques@topsep{#1}} +\providecommand{\eqequesparsep}[1]{\def\eqeques@parsep{#1}} +\newcommand{\eqequesitemsep}[1]{\def\eqeques@itemsep{#1}} +\newcommand{\eqequeslistparindent}[1]{\def\eqeques@listparindent{#1}} +\eqequestopsep{0pt} +\eqequesparsep{0pt} +\eqequesitemsep{0pt} +\eqequeslistparindent{0pt} +\newif\iffirstitem +\def\eqeSolnItemMngt{\iffirstitem\global\firstitemfalse + \let\eqe@next\@empty\else\let\eqe@next\item\fi\eqe@next\relax} +\newenvironment{eqequestions}{% + \begin{list}{}{% + \ifwithinsoldoc\let\solnItemMngt\eqeSolnItemMngt\fi + \setlength{\labelwidth}{\eqemargin}% + \setlength{\parsep}{\eqeques@parsep}% + \setlength{\itemsep}{\eqeques@itemsep}% + \setlength{\topsep}{\eqeques@topsep}% + \setlength{\itemindent}{0pt}% + \setlength{\listparindent}{\eqeques@listparindent}%dps% + \ifwithinsoldoc\settowidth{\labelsep}{\eqe@hspannerSoln}\else + \settowidth{\labelsep}{\eqe@hspannerPrb}\fi + \setlength{\leftmargin}{\labelwidth}% + }\ifwithinsoldoc\global\firstitemtrue\fi\item\relax}{\end{list}} +% \end{macrocode} +% \begin{environment}{exam} +% Each part of the exam is enclosed in an \texttt{exam} environment. The one +% required parameter is the name of the part, for example, `Part1', `Part2'. +% These should be one word, no white spaces, just letters and possibly numbers. +% \begin{macrocode} +\def\setDefaultfvsizeskip#1{\def\default@fvsizeskip{#1}% + \def\@fvsizeskip{#1}} +\def\default@fvsizeskip{.3} +\edef\@fvsizeskip{\default@fvsizeskip} +\newcommand{\fvsizeskip}[1]{\def\@fvsizeskip{#1}} +\def\autoExamName{exam\the\value{eq@numparts}} +\def\nNumberOfP@rts{\csname NumberOfParts\endcsname} +\abovesqskip{} +\let\eqeWrtExamTitleToSolns\eqe@YES +\def\wrtExamTitleInSolns{\let\eqeWrtExamTitleToSolns\eqe@YES} +\def\noExamTitleInSolns{\let\eqeWrtExamTitleToSolns\eqe@NO} +\let\thisexamlabel\@empty +\let\isInExamEnv\eqe@NO +% \end{macrocode} +% \DescribeMacro{\RecordThisExamOff} causes \pkg{eqexam} to place \cs{iffalse} and \cs{fi} +% around the solutions to this exam in the solution file. This makes the solution results +% of this exam invisible. \cs{RecordThisExamOff} sets an internal switch \cs{ifDoNotRecordThisExam} +% to \texttt{true}. This switch is set back to \texttt{false} at the end of the environment. +% \changes{v5.1d}{2018/02/02}{Added \string\cs{RecordThisExamOff}} +% \begin{macrocode} +\newif \ifDoNotRecordThisExam \DoNotRecordThisExamfalse % dpsf02 +\def\RecordThisExamOff{\DoNotRecordThisExamtrue} % dpsf02 +\def\bIFFalseWrtSolns{\writeT@SolnFile{\protect\iffalse^^J}} +\def\eIFFalseWrtSolns{\writeT@SolnFile{\protect\fi^^J}} +% \end{macrocode} +% The beginning of the \env{exam} environment. +% \begin{macrocode} +\newenvironment{exam}[2][] +{% + \ifDoNotRecordThisExam % dpsf02 + \expandafter\bIFFalseWrtSolns\fi + \makeRoomForProb{\@fvsizeskip\textheight}{0}% + \let\isInExamEnv\eqe@YES + \stepcounter{eq@numparts}% +% \end{macrocode} +% If \texttt{\#2} is empty, use \cs{autoExamName} +% \begin{macrocode} + \def\eqexamargii{#2}\ifx\eqexamargii\@empty + \edef\eqexamargii{\autoExamName}\fi + \xdef\thisexamlabel{\eqexamargii}\xdef\curr@quiz{\eqexamargii}% + \def\eqexamargi{#1}\ifx\eqexamargi\@empty + \edef\eqexamargi{\eqexamargii}\fi + \expandafter\gdef\expandafter\thisUFexamlabel + \expandafter{\eqexamargi}% + \edef\eq@tmp{\the\partNames\string\\{\eqexamargii}}% + \global\partNames=\expandafter{\eq@tmp}% + \csarg\ifx{NumberOfParts}\relax\else +\ifx\eqeWrtExamTitleToSolns\eqe@YES + \ifnum\nNumberOfP@rts=1\relax\else + \def\eqe@argi{#1}\ifx\eqe@argi\@empty + \eqe@writetoSolns{\eqexamargii}\eqe@writetoAux{\string + \csarg\string\gdef{userFriendly\eqexamargii}{\eqexamargii}} + \else + \eqe@writetoSolns{#1}\eqe@writetoAux{\string + \csarg\string\gdef{userFriendly#2}{#1}} + \fi + \fi\fi +\fi + \exambegdef + \edef\temp@Exp{\noexpand\shortquiz\sqstar[\eqexamargii]}\temp@Exp +% \expandafter\shortquiz\sqstar[\eqexamargii]% +}{% + \examenddef +% \end{macrocode} +% \changes{v4.4}{2015/05/24}{Finish with a \cs{vskip} to clear the last +% item or problem.} +% \begin{macrocode} + \vskip\eqeques@parsep\relax\kern0pt %dps88 + \endshortquiz + \aftergroup\afterexamsepcode + \par\penalty-100\vskip0pt + \ifDoNotRecordThisExam % dpsf02 + \expandafter\eIFFalseWrtSolns\fi + \global\DoNotRecordThisExamfalse +} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\EQEcalculateAllTotals} +% (4/22/11) Added the command \cs{EQEcalculateAllTotals}. The command is executed +% as part of the \cs{maketitle} command. If \cs{maketitle} is not used for some reason +% \cs{EQEcalculateAllTotals} can be executed just after \verb~\begin{document}~. +% \begin{macrocode} +\newcommand{\EQEcalculateAllTotals}{% + \begingroup +% \end{macrocode} +% We calculate the grand total of all the parts of the \texttt{exam} environments, +% and we define \cs{eqeGrandTotal}, which contains the total. +% \begin{macrocode} + \count\z@=0\relax + \def\\##1{\csarg\ifx{##1total}\relax\else + \advance\count\z@\csname##1total\endcsname +% \end{macrocode} +% \cs{thePartNames} list all named exam environments in the document, e.g., +%\begin{verbatim} +% \\{Part1}\\{Part2}...\\{LastPart} +%\end{verbatim} +% \begin{macrocode} + \fi}\csname thePartNames\endcsname + \xdef\eqeGrandTotal{\the\count\z@}% + \ifnum\eqeGrandTotal=0 \else +% \end{macrocode} +% If there is a nonzero grandtotal, we move on to calculate +% the percentages. +% \begin{macrocode} + \def\\##1{\eqe@calc@percent{##1}}% + \csname thePartNames\endcsname\fi + \endgroup +} +% \end{macrocode} +% +% \begin{macro}{\eqe@calc@percent} +% We go through the parts listed in \cs{thePartNames} and create a +% calculation of the percentage for that part, and leave it in +% \verb!\csname#1percent\endcsname!, which can be accessed +% through the \cs{percentForPart} command, for example +% \verb!\percentForPart{}! might expand to \texttt{45.6\%}. +% \begin{macro}{\nPctDecPts} +% The number of decimal points to carry in the representation of the +% percentage. +% \begin{macrocode} +\newcommand{\nPctDecPts}{1} +\def\eqe@calc@percent#1{\@ifundefined{#1total}{% + \csarg\gdef{#1percent}{??}}{% +% \end{macrocode} +% If the \textsf{fp} package is not loaded, we use register arithmetic, +% percentages are truncated to integers. +% \begin{macrocode} + \csarg\ifx{FPdiv}\relax + \count2=\tot@lForPart{#1}% + \edef\expGT{\csname eqeGrandTotal\endcsname}% + \multiply\count2by100\relax\divide\count2by\expGT\relax + \csarg\xdef{#1percent}{\the\count2 }\else +% \end{macrocode} +% If the \textsf{fp} package is loaded, we use this package to calculate +% the percentage, accurate to one decimal place. +% \begin{macrocode} + \FPdiv{\eqe@pForPart}{\csname#1total\endcsname}% + {\csname eqeGrandTotal\endcsname}% + \FPmul{\eqe@pForPart}{\eqe@pForPart}{100}% + \FPround{\eqe@pForPart}{\eqe@pForPart}{\nPctDecPts}% + \csarg\xdef{#1percent}{\eqe@pForPart}\fi + }% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macrocode} +\def\writetotalstoaux{\eqe@IWO\@auxout{\string + \csarg\string\gdef{\thisexamlabel total}{\theeqpointvalue}}% + \eqe@IWO\@auxout{\string\csarg + \string\gdef{\thisexamlabel nQuestions}{\theeqquestionnoi}}% +} +\newcommand{\writelastpage}[1][]{\def\eqe@argi{#1}% + \ifx\eqe@argi\@empty\else\label{#1PageEnd}\fi + \eqe@IWO\@auxout{\string\csarg + \string\gdef{eqExamLastPage}{\arabic{page}}}% +} +\def\exlabel{} +\def\sqlabel{} +\def\exsolafter{\textit{Solution}:} +\def\sqsolafter{\textit{Solution}:} +% \end{macrocode} +% The exercise labels in the body of the text. (2015/02/27) changed +% the command \cs{exlabelformatwp} to incorporate other parameters. +% \begin{macrocode} +%\def\exlabelformat{\textbf{\theeqquestionnoi.\ }} +\def\exlabelformat{\textbf{% + \theeqquestionnoi\eqe@decPointPrb\eqe@hspannerPrb}} +\def\exlabelformatwp{\exlabelformat} +% \end{macrocode} +% The exercise labels for solutions at the end of the document +% \begin{macrocode} +\def\exsllabelformat + {\string\makebox[0pt][r]{\string\textbf{% + \theeqquestionnoi\eqe@decPointPrb\eqe@hspannerSoln}}} +\def\exsllabelformatwp + {\string\makebox[0pt][r]{\string\textbf{% + \theeqquestionnoi\eqe@decPointPrb\eqe@hspannerSoln}}% + (\thepartno)\eqe@hspannerSoln} +\ifanswerkey + \def\exrtnlabelformat{} + \def\exrtnlabelformatwp{} + \def\eq@sqslrtnlabel{} +\else + \def\exrtnlabelformat{$\square$} + \def\exrtnlabelformatwp{$\square$} + \def\eq@sqslrtnlabel{$\square$} +\fi +\def\sqslrtnlabel{\eq@sqslrtnlabel} +% \end{macrocode} +% (2010/08/21) Enable some localizations of strings +% \begin{macrocode} +\newcommand{\exsectitletext}{Solutions to \webtitle} +\def\exsectitle{\normalsize\exsectitletext} +%\def\exsectitle{\normalsize\hspace* +% {-\oddsidemargin}\exsectitletext} +\@ifpackageloaded{exerquiz}{%{Solutions to \websubject} + \renewcommand{\exsecrunhead}{}}{\newcommand{\exsecrunhead}{}} +%\providecommand{\exsecrunhead}{Solutions to \websubject}% +\def\eq@sqslsectitle{} +\def\eq@sqslsecrunhead{} +\def\eq@sqsllabel{{\string\llap{\string\textbf{\theeqquestionnoi.\ }}}} +\def\eq@sqlabel{} +\let\include@quizsolutions\relax +\let\solnhspace\@empty +% \end{macrocode} +% \subsection{\texttt{problem} Environments} +% A single question is posed with the \texttt{problem} environment, and a question with +% multiple parts with the \texttt{problem*} environment. +% \begin{macro}{\fillin} +% This macro is used for fill-in type questions. The first argument is the length +% of the underline blank to leave to fill-in, the second argument is the correct answer. +% \begin{macrocode} +\newcommand{\optsFillIn}[1]{\def\eqe@optsFillIn{#1}} +\let\eqe@optsFillIn\@empty +\newcommand{\fillin}[3][u]{% + \ifx#1u\let\@fillinFmt\underbar + \else\ifx#1b\let\@fillinFmt\relax + \else\let\@fillinFmt\relax\fi\fi + \ifeq@proofing + \@fillinFmt{\makebox[#2]{% + \strut\hfil\bfseries\color{red}#3\hfil}}% + \else + \@fillinFmt{\makebox[#2]{\strut\hfil}}% + \@ifundefined{@quiz}{}{% + \if\eq@online\eqe@YES\relax + \ifeq@nosolutions + \ifeq@solutionsafter\else + \ifx\eq@insertverticalspace\eqe@YES\relax + \stepcounter{@cntfillin}% + \edef\fieldName{% + \if\probstar*eqexam.\curr@quiz.fillin.% + \theeqquestionnoi.part\thepartno.% + fi\the@cntfillin% + \else + eqexam.\curr@quiz.fillin.% + \theeqquestionnoi.fi\the@cntfillin% + \fi + }\makebox[0pt][r]{\textField[\BC{} + \presets{\eqe@optsFillIn}]{% + \fieldName}{#2}{11bp}}% + \fi + \fi + \fi + \fi + }% + \fi\space\ignorespaces} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\TF} +% A specialized version of \cs{fillin} for True/False questions. +% \begin{macrocode} +\newcommand\defaultTFwidth{30pt} +\newcommand\TF[2][\defaultTFwidth]{% + \def\eqe@next{\fillin{#1}{#2}}% + \ifdim\eq@extralabelsep=0pt\relax\else + \if\probstar*\relax\if\exerwparts@cols0 + \def\eqe@next{\makebox[0pt][r]{% + \fillin{#1}{#2}}\ignorespaces}% + \fi\fi\fi +\eqe@next} +\def\fillinWidth#1{% + \if\probstar* + \settowidth{\eq@tmplengthA}{\normalfont\ }% + \addtolength{\eq@tmplengthA}{#1}% + \edef\eq@extralabelsep{\the\eq@tmplengthA}% + \fi +} +\let\fillInFormatDefault\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Do} +% The following commands supports the optional argument \texttt{{\string\Do}}. +% When I teach senior or graduate-level classes, I often give a problem with +% multiple parts (each of equal value) and ask them to ``do 3 of the following 5'' +% parts. +% \begin{macrocode} +\def\eqe@DoWarning#1{\PackageWarning{eqexam}{\string#1\space + requires the first argument\MessageBreak of problem* to be ea}} +\def\eqe@DoNum{\textbf{??}\eqe@DoWarning{\DoNum}} +\def\eqe@nDoNum{\textbf{??}\eqe@DoWarning{\nDoNum}} +\let\DoNum\eqe@DoNum +\let\nDoNum\eqe@nDoNum +\def\makeDoNum#1{\xdef\nDoNum{#1}% + \def\ifc@sewrap{\ifcase#1??\or}% + \xdef\DoNum{\expandafter\ifc@sewrap\eqe@wordNums\else + \eqe@wordNumbsError\fi}} +\def\makeOutOfNum#1{\xdef\nOutOfNum{#1}% + \def\ifc@sewrap{\ifcase#1??\or}% + \xdef\OutOfNum{\expandafter\ifc@sewrap\eqe@wordNums\else + \eqe@wordNumbsError\fi}} +\def\eqe@OutOfNum{\textbf{??}\eqe@DoWarning{\OutOfNum}} +\def\eqe@nOutOfNum{\textbf{??}\eqe@DoWarning{\nOutOfNum}} +\let\OutOfNum\eqe@OutOfNum +\let\nOutOfNum\eqe@nOutOfNum +% \end{macrocode} +% \DescribeMacro{\eqe@wordNums} is used to typeset the English word for +% the numbers (1--10). This command may be redefined to other languages. +% \begin{macrocode} +\newcommand{\eqe@wordNums}{one\or two\or three\or + four\or five\or six\or seven\or eight\or nine\or ten} +\newcommand{\eqe@wordNumbsError}{\noexpand\PackageError{eqexam}% + {Number out of range, 1--10}% + {Use a smaller number, or redefine the command + \string\eqe@wordNums.}} +% \end{macrocode} +% \end{macro} +% Added two hooks \cs{priorPNPAction} and +% \cs{postPNPAction} to \cs{makeRoomForProb} to allow some defined actions +% before and after a page break generated by \cs{makeRoomForProb}. +% \changes{v5.0}{2017/11/08}{Added hooks \string\cs{priorPNPAction} and +% \string\cs{postPNPAction} to \string\cs{makeRoomForProb}}. Examples of usage +% are found in \cs{vspaceFillerLines} and \cs{eq@linesXPgs}. +% \begin{macrocode} +\let\priorPNPAction\relax % dps1 +\let\postPNPAction\relax +\def\eqe@mkRoomPgBrk{\priorPNPAction\newpage\postPNPAction} +\def\makeRoomForProb#1#2{\par %\endgraf % dps 11/11/10 + \bgroup\@nobreakfalse\addpenalty{-500}% + \setlength{\@tempdimb}{#1}% + \@tempdima \pagegoal \advance \@tempdima -\pagetotal + \ifdim \@tempdima<\@tempdimb\ifnum\col@number>\@ne\columnbreak + \else\aftergroup\eqe@mkRoomPgBrk\fi\fi\egroup + \ifnum\@reportpoints>1 + \ifx\eqe@prevProbZero\eqe@YES + \if\eqe@isPts0\else\vskip-\halfHtPtBox\relax\fi + \else + \ifl@stDispl@yPoints + \if\eqe@isPts0\@checkSpacing{1}\else + \if#21 \@checkSpacing{0}\fi + \fi\fi + \fi + \fi +} +% \end{macrocode} +% \begin{macro}{\emitMessageNearBottom} +% The syntax for this command is +%\begin{verbatim} +% \emitMessageNearBottom*[vspace]{msg} +%\end{verbatim} +% If there is less than \texttt{vspace} remaining on the page, a message, +% \texttt{msg}, is emitted. Then the optional \texttt{*} appears, a +% \cs{newpage} is also emitted just after the \texttt{msg} and +% \cs{insertContAnnot} is expanded just after \cs{newpage}. +% \begin{macrocode} +\newcommand{\emitMessageNearBottom}{\@ifstar + {\def\eqe@emnb{\ifnum\col@number>\@ne\columnbreak + \else\newpage\fi\insertContAnnot}\eq@emitMessageNearBottom} + {\let\eqe@emnb\relax\eq@emitMessageNearBottom}} +\newcommand{\eq@emitMessageNearBottom}[2][2\wlVspace]{% + \eq@@emitMessageNearBottom{#1}{#2}} +\def\eq@@emitMessageNearBottom#1#2{\par + \bgroup\@nobreakfalse\addpenalty{-500}% + \setlength{\@tempdimb}{#1}% + \@tempdima \pagegoal \advance \@tempdima -\pagetotal + \ifdim \@tempdima<\@tempdimb #2 \eqe@emnb + \xdef\eq@currProbStartPage{0}\fi\egroup} % dps4 +% \end{macrocode} +% \end{macro} +% \DescribeMacro{\getSpaceLeftOnPage}\cmd{\getSpaceLeftOnPage} calculates +% the amount of space left on the current page. It saves the calculation +% in the text macro \DescribeMacro{\amtSpaceLeftOnPage}\cmd{\amtSpaceLeftOnPage}. +% \begin{macrocode} +\newcommand{\getSpaceLeftOnPage}{\par\bgroup + \@tempdima \pagegoal \advance \@tempdima -\pagetotal + \xdef\amtSpaceLeftOnPage{\the\@tempdima}\egroup} +% \end{macrocode} +% \begin{macro}{\promoteNewPage} +%\changes{v2.0n}{2011/05/13}{% +% A simple variation on \cs{makeRoomForProb} designed for user use. +%} +% A simple variation on \cs{makeRoomForProb} designed for user use. +% \begin{macrocode} +\newcommand{\pnpDflt}{\@fvsizeskip\textheight} +\newcommand{\promoteNewPage}[1][\pnpDflt]{% + \makeRoomForProb{#1}{0}} +% \end{macrocode} +% \end{macro} +% Used in \cmd{\makeRoomForProb} and elsewhere. \DescribeMacro{\pointsmarginparpush} +% \cs{pointsmarginparpush} adds a little more separation between point +% boxes. \DescribeMacro{\@checkSpacing}\cmd{\@checkSpacing} is the algorithm +% for adjusting the vertical spaces between problems when points are on the +% right. +% \begin{macrocode} +\def\pointsmarginparpush{3pt} +\def\@checkSpacing#1{\bgroup\ifinner\else + \@tempdima\lastPageTotal + \@tempdimb\pagetotal +% \end{macrocode} +% If \cs{lastPageTotal} is less than \cs{pagetotal}, continue +% \begin{macrocode} + \ifdim\@tempdima < \@tempdimb +% \end{macrocode} +% Compute \texttt{\cs{pagetotal} - \cs{lastPageTotal}} +% \begin{macrocode} + \advance\@tempdimb by-\@tempdima + \ifdim\@tempdimb < \eq@pointboxtotalheight + \if#11% + \eq@pointboxtotalheight\halfHtPtBox\relax + \advance\eq@pointboxtotalheight\dpPtBox\relax + \fi + \@tempdima=\eq@pointboxtotalheight + \advance\@tempdima\pointsmarginparpush\relax + \advance\@tempdima by-\@tempdimb + \vspace*{\@tempdima}% + \fi + \fi\fi +\egroup} +\def\@checkSpacingi{\bgroup + \@tempdima = \lastPageTotal + \@tempdimb = \pagetotal + \ifdim\@tempdima < \@tempdimb + \advance\@tempdimb by-\@tempdima + \eq@pointboxtotalheight\halfHtPtBox\relax + \advance\eq@pointboxtotalheight\dpPtBox\relax + \ifdim\@tempdimb < \eq@pointboxtotalheight + \@tempdima=\eq@pointboxtotalheight + \advance\@tempdima\pointsmarginparpush\relax + \advance\@tempdima by-\@tempdimb + \vspace*{\@tempdima}% + \fi + \fi +\egroup} +% \end{macrocode} +% \DescribeMacro{\default@nbaselineskip} is the default number of \cs{baselineskip}s needed to place +% a new problem. While \DescribeMacro{\nbaselineskip}\cmd{\nbaselineskip} is the number +% of \cs{baselineskip}s needed for a new \texttt{problem} (or \texttt{problem*}). +% \begin{macrocode} +\newcommand{\setDefaultnbaselineskip}[1]{\def\default@nbaselineskip{#1}} +\setDefaultnbaselineskip{6} +\def\nbaselineskip#1{\def\@nbaselineskip{#1}} +\def\nbaselineskipReset{\edef\@nbaselineskip{\default@nbaselineskip}} +\nbaselineskipReset +% \end{macrocode} +% \begin{environment}{problem} +% The \texttt{problem} is used to pose a single---non-multi-part---question. +% The optional argument is the number of points for this problem. +% \begin{macrocode} +\def\eqe@gobbletoend#1\end{} +\def\eqe@grabarg#1\end{\def\numpoints{#1}} +\def\eqe@isPts{1} +% \end{macrocode} +% We reset some \textsf{exerquiz} parameters for \textsf{eqexam} +% \begin{macrocode} +\aboveexskip{3pt}\belowexskip{3pt} +\partstopsep{3pt}\partsitemsep{3pt}\partsparsep{0pt} +\rowsepDefault{3pt}\partstabcolsep{1.5pt}% +\partstabtopsep{3pt}\partstabrowsep{3pt} +\renewcommand\belowexsolnskip{{}}% +\let\isProbEnv\eqe@NO +\let\topofprobhook\relax +% \end{macrocode} +% Normally, you don't leave a blank line between the beginning +% of \env{problem} and the statement of problem. If you're in the habit +% of doing that, we can absorb that blank space. See similar +% command above the definition of \env{problem*} for more information. +% \changes{v5.1a}{2018/01/21}{added \string\cs{eqe@p@gobnxtp@r}} +% \begin{macrocode} +\def\eqe@p@gobnxtp@rDef{\@ifnextchar\par{\eqe@p@gobtop@rnext}{}} +\def\eqe@p@gobtop@rnext#1\par{} +\def\applyparfixesp{\let\eqe@p@gobnxtp@r\eqe@p@gobnxtp@rDef} +%\def\cancelparfixesp{\let\eqe@p@gobnxtp@r\relax} +\def\cancelparfixesp{\let\eqe@p@gobnxtp@r\ignorespaces} +% \end{macrocode} +% The \env{problem} environment now begins. +% \changes{v5.1f}{2018/02/09}{modify problem env to analyze two optional args} +% \begin{macrocode} +\newcommand{\problem}[1][]{\lowercase{\def\@rgi{#1}}% +% \end{macrocode} +% Support for h and H argument when it is the first argument. +% \changes{v5.1e}{2018/02/09}{Support for h and H argument} +% \changes{v5.1j}{2018/04/15}{Change comparison to \string\cs{ifx}, \string\cs{if} +% give incorrect result when points are of the form 11, 22, 33, etc.} +% \begin{macrocode} + \ifx\@rgi\eqe@h + \def\hidden@ttr{[#1]}\let\numpoints\@empty\else + \let\hidden@ttr\relax\def\numpoints{#1}\fi + \problem@cont} +\newcommand{\problem@cont}[1][]{\let\isProbEnv\eqe@YES + \def\@rgi{#1}\ifx\hidden@ttr\relax % assume a number or empty + \ifx\@rgi\@empty\else\def\hidden@ttr{[#1]}\fi\fi + \if\eqe@isPts0\global\let\eqe@prevProbZero\eqe@YES\else + \global\let\eqe@prevProbZero\eqe@NO\fi + \global\thereissolutionfalse + \def\numpointsEmpty{0}% + \ifx\numpoints\@empty\def\numpoints{0}\def\numpointsEmpty{1}% + \gdef\eqe@isPts{0}\else\gdef\eqe@isPts{1}\fi + \makeRoomForProb{\@nbaselineskip\baselineskip}{\eqe@isPts}% + \gdef\probstar{x}\let\afterlabelhskip\@empty + \ifx\marginpoints\@empty\else + \if\numpointsEmpty\eqe@One\let\marginpoints\@gobbletwo\fi +% \end{macrocode} +%\changes{v2.0n}{2011/05/13}{% +% Added \texttt{*} to signal in-line display of points. +%} +% (2011/5/13) We add a \texttt{*} feature. When the author types +% \texttt{[*3]}, it is a three point problem, but the value is expressed +% in-line, not in the margins. +% \begin{macrocode} + \def\@lti{\let\@isitstar\eqe@One\eqe@grabarg}% + \def\@ltii{\let\@isitstar\eqe@Zero\eqe@gobbletoend}% + \expandafter\@ifstar\expandafter\@lti + \expandafter\@ltii\numpoints\end + \if\@isitstar\eqe@One\addtocounter{eqpointvalue}{\numpoints}% + \@marktotalvalue + \ifdispl@yPoints + \def\marginparafterhook{\PTs{\numpoints}\space}\else + \def\marginparafterhook{\PTs*{\numpoints}\space}\fi\else + \def\marginparpriorhook{\noindent + \probvalue{\numpoints}{0}}\fi + \fi + \setcounter{eq@count}{\value{eqquestionnoi}}% + \addtocounter{eq@count}{1}% + \ifnum\value{eq@count}=1\relax + \eqe@IWO\@auxout{\string + \csarg\string\gdef{pagenofirstprob\thisexamlabel}{\thepage}}% + \fi +% \end{macrocode} +% \changes{}{2015/06/01}{Added the hook \cs{topofprobstarhook}} +% \DescribeMacro\topofprobhook is a general purpose hook at the top of the +% \texttt{problem} environment, before the beginning of the nested +% \texttt{eqequestions} environment. +% \begin{macrocode} + \topofprobhook + \begin{eqequestions}% +% \end{macrocode} +% \textbf{Begin exercise env.} Insert h or H when it is the first argument through \cs{hidden@ttr}, +% then begin the \texttt{exercise} environment using the counter +% \texttt{eqquestionnoi}. +% \changes{v5.1e}{2018/02/09}{Support for h and H argument} +% \begin{macrocode} + \edef\ctrld@exp@exercise{\noexpand + \begin{exercise}[eqquestionnoi]\hidden@ttr}% + \ctrld@exp@exercise\ignorespaces\eqe@p@gobnxtp@r} +% \end{macrocode} +% \textbf{end problem env.} The code for the end of the problem environment. +% \begin{macrocode} +\def\endproblem{\end{exercise}% + \end{eqequestions}% + \ifeqlocalversion\ifeqglobalversion + \xdef\eqe@tmp{\noexpand\forVersion{\eq@selectedVersion}}% + \aftergroup\eqe@tmp + \fi\fi + \global\eqlocalversionfalse + \ifdispl@yPoints\global\l@stDispl@yPointstrue + \else\global\l@stDispl@yPointsfalse\fi + \global\let\eqe@fpmrk\@empty} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\PTs} +% \begin{macro}{\itemPTsTxt} +% \begin{macro}{\itemPTsFormated} +% When you specify \cs{auto} for the optional argument of the \texttt{problem*} +% environment, when each item must have the command \cs{PTs} to assign the +% value of that question. The \cs{PTs} has one optional star-parameter, and one +% required parameter. The required parameter is the number of points for this item, +% if the \texttt{*} is specified, then the point value is not typeset in the document. +% +% The command \cs{itemPTsTxt} has one argument, the number of points for this item. This +% argument is passed from the \cs{PTs} command. You can redefine the way the points appear +% in the document using \cs{itemPTsTxt}. As separate command \cs{itemPTsFormated} is used to +% put parentheses around \cs{itemPTsTxt}. If the \texttt{*} option is taken with \cs{PTs}, then +% you are free to place \cs{itemPTsTxt} anywhere in the problem statement. +% \changes{v1.6g}{2006/11/29} +%{ +% Added \cs{itemPTsTxt} and \cs{itemPTsFormated} to work with \cs{PTs}. +% Also added a \texttt{*} option, to \cs{PTs}, in this case the points +% are not typeset. +%} +% \begin{macrocode} +\newcommand\itemPTsTxt[1]{$\eqe@ptsFmt{#1}\,\text{% + \ifnum#1=1\relax\eqptLabel\else\eqptsLabel\fi}$} +\newcommand\itemPTsEaTxt[1]{$\eqe@ptsFmt{#1}\,\text{% + \ifnum#1=1\relax\eqptLabel\else\eqptsLabel\fi\space\eqeachLabel}$} +\newcommand{\itemPTsFormated}[1]{(#1)} +% \end{macrocode} +% (2013/12/04) Added \DescribeMacro{\obeyPTsStar}\cmd{\obeyPTsStar} and +% \DescribeMacro{\ignorePTsStar}\cmd{\ignorePTsStar}. The former is the default. +% if \cmd{\ignorePTsStar} is in effect, \cs{PTs*} is treated as \cs{PTs}. Useful +% for assigning points to parts of a question, but not explicitly telling the student. +% when you compile for the key (with \texttt{answerkey} option), you can include +% \cmd{\ignorePTsStar} so the instructor can see the assigned points for each part. +% \begin{macrocode} +\newif\ifObeyPTsStar \ObeyPTsStartrue +\def\obeyPTsStar{\global\ObeyPTsStartrue} +\def\ignorePTsStar{\global\ObeyPTsStarfalse} +\def\PTs{\leavevmode\@ifstar{\@PTs{*}}{\@PTs{x}}} +\def\@PTs#1#2{% + \if\@reportpoints\eqe@Zero\ignorespaces\else + \if\eqe@pointsPartsId\eqe@One + \addtocounter{eqpointvalue}{#2}\@marktotalvalue + \addtocounter{eq@count}{#2}\fi +% \end{macrocode} +% If \DescribeMacro{\ignorePTsStar}\cmd{\ignorePTsStar} is in effect +% (\cmd{\ObeyPTsStarfalse}), we gobble +% the \cs{else} and let the code flow through. +% \begin{macrocode} + \if#1*\ifObeyPTsStar\ignorespaces\else\expandafter\@gobble\fi + \else +% \end{macrocode} +% (2012/04/26) Wrapped |\itemPTsFormated{\itemPTsTxt{#2}}| as the argument +% of \cs{eqe@movePTs}. \cs{eqe@movePTs} does nothing by default, but may be +% redefined, for example, to place the value of each part on the margin. +% The default definition of \cs{eqe@movePTs} follows. +% \begin{macrocode} + \eqe@movePTs{\itemPTsFormated{\itemPTsTxt{#2}}}\fi + \fi +} +\def\eqe@movePTs#1{#1} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \DescribeMacro{\Do} The \cs{isItD@} tests to see if the next token +% is \cs{Do}, if yes, it marks it and calls \cs{y@st@Do}, which gets the argument +% if the \cs{Do} token. +% \begin{macrocode} +\let\auto\relax +\def\isItD@{\@ifnextchar\Do{\let\yest@D@\eqe@YES\y@st@Do} + {\let\yest@D@\eqe@NO\@gobblet@end}} +\let\yest@D@\eqe@NO +\let\D@Num\@empty +\def\y@st@Do\Do#1\end{\gdef\D@Num{#1}} +\def\@gobblet@end#1\end{} +% \end{macrocode} +% Test the argument to see if it is the \cs{auto} token +% \begin{macrocode} +\def\is@uto#1\auto#2\@nil{\def\eqe@argi{#1}\def\eqe@argii{#2}% + \ifx\eqe@argii\@empty\let\isit@uto\eqe@Zero\else + \let\isit@uto\eqe@One\fi +} +% \end{macrocode} +% +% \begin{environment}{problem*} +% +% The \texttt{problem*} environment is used to pose a multi-part question. +% The \texttt{parts} environment is used to enumerate the parts. +%\changes{v2.0c}{2011/01/11}{% +% Changed \cs{@next} to \cs{eqe@next}. There was conflict in +% the use of this command with one of the float environments. When user +% used the table environment inside the problem* environment, the +% compiled stopped because \cs{@next} was overwritten. +%} +% \begin{macrocode} +% \end{macrocode} +% We create a Id for the points specified by the first (and second) optional parameters: +% 0 (total points specified); 1 (\cs{auto} specified); 2 (points each +% specified); 4 (\cs{Do} second optional parameter); a value of \cs{relax} means +% no points specified (the default). +% \begin{macrocode} +\let\eqe@pointsPartsId\relax +% \end{macrocode} +% \begin{macrocode} +\def\leadinitemWarningStar{\PackageWarning{eqexam} + {Using the star (*) in front of the points\MessageBreak + designator is not allowed when there is a + \MessageBreak\string\leadinitem}} +\def\tableadinWarningStar{\PackageWarning{eqexam} + {Using the star (*) in front of the points\MessageBreak + designator is not allowed when there is a + \MessageBreak\string\tableadin}} +\let\isProbStarEnv\eqe@NO +\let\topofprobstarhook\relax +% \end{macrocode} +% Added \cs{eqe@gobnxtpar} to hopefully, eliminate the need to leave +% no pars (blank lines) between |\begin{parblem*}| and either \cs{leadinitem} +% or \cs{tableadin}. The default is to not affect the old behavior. You have +% to declare \DescribeMacro{\applyparfixes}\cs{applyparfixes} to apply the +% fix; revert back to the old behavior with \DescribeMacro{\cancelparfixes}\cs{cancelparfixes} +% \changes{v5.1a}{2018/01/21}{added \string\cs{eqe@gobnxtpar}} +% \begin{macrocode} +\def\eqe@ps@gobtop@r#1\par{\eqe@isle@dinnext} +\def\eqe@isle@dinnext{\@ifnextchar\leadinitem{}{\vskip-\baselineskip}} +\def\restorele@dinpfixDef{\@ifnextchar\par{\eqe@ps@gobtop@r}{}} +\let\eqe@ps@gobnxtpar\restorele@dinfixDef +\def\applyleadinfix{\let\eqe@gobnxtpar\restorele@dinpfixDef} +\def\cancelleadinfix{\let\eqe@gobnxtpar\relax} +\def\applyparfixes{\PackageInfo{eqexam} + {Applying paragraph fixes to problem\MessageBreak + and problem* environments}\applyparfixesp\applyleadinfix} +\def\cancelparfixes{\PackageInfo{eqexam} + {Cancelling paragraph fixes to problem\MessageBreak + and problem* environments}\cancelparfixesp + \cancelleadinfix} +% \end{macrocode} +% The default behavior is to do nothing about blank lines. +% \begin{macrocode} +\cancelparfixesp\cancelleadinfix +\let\neutralizeparfixes\cancelparfixes +% \end{macrocode} +% We now begin the code for the \texttt{problem*} environment. +% \begin{macrocode} +\csarg\def{problem*}{\let\isProbEnv\eqe@YES + \let\isProbStarEnv\eqe@YES + \global\thereissolutionfalse + \@ifnextchar[{\pr@bl@m@star}{\pr@bl@m@star[]}} +\def\pr@bl@m@star[#1]{% + \@ifnextchar[{\pr@blem@star{#1}}{\pr@blem@star{#1}[]}} +\def\pr@blem@star#1[#2]{% + \if\eqe@isPts0\global\let\eqe@prevProbZero\eqe@YES\else + \global\let\eqe@prevProbZero\eqe@NO\fi + \def\numpoints{#1}\ifx\numpoints\@empty + \gdef\eqe@isPts{0}\else\gdef\eqe@isPts{1}\fi + \makeRoomForProb{\@nbaselineskip\baselineskip}{\eqe@isPts}% +% \end{macrocode} +% Let the \cs{Do} commands to internal versions +% \begin{macrocode} + \let\DoNum\eqe@DoNum\let\nDoNum\eqe@nDoNum + \let\OutOfNum\eqe@OutOfNum\let\nOutOfNum\eqe@nOutOfNum +% \end{macrocode} +% \changes{v3.1e}{2012/11/10}{Removed hard-wired \cs{proofingsymbol}} +% \begin{macrocode} +% \proofingsymbol{\ding{52}}% + \gdef\probstar{*}% + \gdef\pr@b@secondarg{#2}\setcounter{eq@count}{0}% + \let\afterlabelhskip\@empty + \global\let\probpointseach\@empty\def\numpoints{#1}% +% \end{macrocode} +% Determine if the argument begins with \texttt{*} +% \begin{macrocode} + \@ifstar{\let\@isitstar\eqe@One\eqe@grabarg}% + {\let\@isitstar\eqe@Zero\eqe@gobbletoend}#1\end +% \end{macrocode} +% If this \texttt{problem*} environment has a \cs{leadinitem}, the \texttt{*} +% option is not allowed +% \begin{macrocode} + \if\@isitstar\eqe@One + \@tempcnta=\theeqquestionnoi\relax + \advance\@tempcnta1\relax + \@ifundefined{leadinitem\thisexamlabel-\the\@tempcnta}{} + {\leadinitemWarningStar\let\@isitstar\eqe@Zero}% + \@ifundefined{tableadin\thisexamlabel-\the\@tempcnta}{} + {\tableadinWarningStar\let\@isitstar\eqe@Zero}% + \fi +% \end{macrocode} +% Check for the \cs{auto} keyword +% \changes{v3.1a}{2012/05/21}{Using a more robust method of detecting the +% presence of \cs{auto}}. +% There are problems when the first two digits are the same, the old comparison +% would say that the first parameter is \cs{auto}, which is it not. Replace +% the old comparison with a more robust method. +% \begin{macrocode} + \expandafter\is@uto\numpoints\auto\@nil + \if\isit@uto\eqe@One\let\eqe@pointsPartsId\eqe@One + \global\let\probpointseach\relax +% \end{macrocode} +% The author has requested \cs{auto} +% \begin{macrocode} + \def\eqe@next{\autocalcparts}% + \else + \ifx\pr@b@secondarg\@empty\else + \let\eqe@pointsPartsId\eqe@Four + \isItD@#2\end\fi +% \end{macrocode} +% Not \cs{auto} so either \texttt{ea} or \texttt{} +% \begin{macrocode} + \def\eqe@next{\manualcalcparts{\numpoints}}% + \fi\eqe@next +% \end{macrocode} +% 2012/11/30 added \cs{leadinitem} defined \texttt{eqexam.def} as a dummy command, which we +% the \cs{let} here to \cs{eqe@leadinitem}. +% \begin{macrocode} + \let\leadinitem\eqe@leadinitem +% \end{macrocode} +% 2015/05/31 added \cs{tableadin} defined \texttt{eqexam.def} as a dummy command, which we +% the \cs{let} here to \cs{eqe@leadinitem}. +% \begin{macrocode} + \let\tableadin\eqe@tableadin +% \end{macrocode} +% \changes{}{2015/06/01}{Added the hook \cs{topofprobstarhook}} +% \DescribeMacro\topofprobstarhook is a general purpose hook at the top of the +% \texttt{problem*} environment, before the beginning of the nested +% \texttt{eqequestions} environment. +% \begin{macrocode} + \topofprobstarhook + \ifeqfortextbook + \writeT@SolnFile{\protect\global + \protect\frstProbNumShownfalse}\fi + \begin{eqequestions}% + \begin{exercise}[eqquestionnoi]*\eqe@gobnxtpar}% +% \end{macrocode} +% \begin{macrocode} +\def\ftb@endprobstarCks{% + \ifWithinANSGrp + \PackageError{eqexam}{\string\bGrpANS\space is still open} + {You need to match it with an \string\bGrpANS, + or remove it.}% + \fi +} +% \end{macrocode} +%\DescribeMacro{\endproblem*} begins here. +% \begin{macrocode} +\csarg\def{endproblem*}{% + \eqe@IWO\@auxout{\string\csarg\string + \gdef{nPartsThisProb\thisexamlabel.\theeqquestionnoi}% + {\arabic{partno}}}% + \ifx\probpointseach\@empty\else + \ifx\probpointseach\auto + \eqe@IWO\@auxout{\string\csarg\string + \gdef{prob\thisexamlabel.\theeqquestionnoi}% + {\theeq@count}}% + \else + \setcounter{eq@count}{\value{partno}}% + \ifx\pr@b@secondarg\@empty\else + \bgroup\toks0=\expandafter{\pr@b@secondarg}% + \expandafter\isItD@\the\toks0 \end +% \end{macrocode} +% If there is a |\Do|, we write this info to AUX. +% \begin{macrocode} + \ifx\yest@D@\eqe@YES\ifx\eqe@pointsEach\eqe@YES + \eqe@IWO\@auxout{\string + \csarg\string\gdef{DoNumThisProb\thisexamlabel.% + \theeqquestionnoi}{\D@Num}}% + \@tempcnta = \value{eq@count}% + \advance\@tempcnta -\D@Num + \global\advance\value{eq@count}-\@tempcnta +% 3.0k + \@tempcnta=\value{partno}% + \advance\@tempcnta -\D@Num + \multiply\@tempcnta by\argi + \addtocounter{eqpointvalue}{-\@tempcnta}% + \fi\fi + \egroup + \fi + \multiply\value{eq@count}\argi + \eqe@IWO\@auxout{\string\csarg\string + \gdef{prob\thisexamlabel.\theeqquestionnoi}{\theeq@count}}% + \fi\fi + \end{exercise}% + \end{eqequestions}% + \ifeqfortextbook\ftb@endprobstarCks\fi + \ifeqlocalversion\ifeqglobalversion + \xdef\eqe@tmp{\noexpand\forVersion{\eq@selectedVersion}}% + \aftergroup\eqe@tmp + \fi\fi + \global\eqlocalversionfalse +% \end{macrocode} +% \changes{}{2015/06/02}{Added \cs{@marktotalvalue} which seems to solve a problem +% with \texttt{multicols}. Sometimes the totals are not correct, they do not `migrate' out +% as they should.} +% \begin{macrocode} + \@marktotalvalue + \ifdispl@yPoints\global\l@stDispl@yPointstrue + \else\global\l@stDispl@yPointsfalse\fi +} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\leadinitem} +%\changes{v3.1f}{2012/11/27}{Created \cs{leadinitem} command for a lead in question +% for the \texttt{parts*} environment.} +% Some authors, no me among them, want to post a question with parts (\texttt{problem*}) without +% an introductory sentence. Scandalous! +%\begin{verbatim} +%\begin{problem*}\relax +%\leadinitem Prove that $4x^2\ge (x+1)^2$ for $x\ge1$. +%\begin{solution} soln\end{solution} +%\begin{parts} +%\item Use the principle of mathematical induction to prove that +% $4^n\geq3n^2$ for all positive integers $n$. +%\begin{solution} soln\end{solution} +%\end{parts} +%\end{problem*} +%\end{verbatim} +% Below is my solution to this problem. There were changes in both \textsf{eqexam} and +% \textsf{exerquiz} (\texttt{eqexam.def}). Here are the listing of changes for my future +% reference. +%\begin{itemize} +% \item Defined \cs{eqe@leadinitem}, \cs{eqe@@leadinitem}, and \cs{leadinitem} below. +% The first one mostly tests whether we are permitted to use the \cs{leadinitem} command. +% If \cs{solutionparshape} is empty, the command may be used. (This gives a restriction +% of only one use per a single \texttt{problem*} environment.) Control is passed +% to \cs{eqe@@leadinitem} which does all the work. +% \item In the definition of \cs{pr@blem@star} (part of the startup for \texttt{problem*} we +% say \verb!\let\leadinitem=\eqe@leadinitem! +% \item In the startup code for \texttt{exercise@parts@list} (\texttt{exerquiz}) +% lines containing \cs{solutionparshape} and \verb!\let\leadinitem\eq@leadinitemparts! +% are found. Also, when the \texttt{parts} environment is complete, we restore the +% default definition of \cs{leadinitem}, \verb!\let\leadinitem\leadinitem@external!. +% \item In the definition of \cs{eqe@@leadinitem}, we also define \cs{solutionparshape} +% to help control the paragraphs for this delicate problem of a lead-in item. Its +% normal definition is \cs{@empty}, and this fact used to detect whether the document +% author is trying to use two \cs{leadinitem}s in one \texttt{problem*} environment. +%\item At the beginning of the definition of the command \cs{@exercise} (in \textsf{exerquiz} +% we \cs{let} \cs{solutionparshape} to \cs{@empty}. +% \item So too does \cs{solutionparshape} appear in the definition of +% \cs{vspaceFmt} (\textsf{exerquiz}). +% \item \cs{solutionparshape} use used to correctly format in the \texttt{solutionsafter}, +% found in \cs{solnexer@@@woparts} (\textsf{exerquiz}). +%\end{itemize} +% As can be seen, this simple feature is not so simple.\par\medskip\noindent +% Set the default value of \cs{solutionparshape}. +% \begin{macrocode} +\let\solutionparshape\@empty +% \end{macrocode} +% This is the beginning of \DescribeMacro{\leadinitem}\cs{leadinitem}, at least the +% the active definition within the \texttt{problem*} environment, and outside +% the \texttt{parts} environment. +% \begin{macrocode} +\def\eqe@leadinitem{% + \ifx\solutionparshape\@empty +% \end{macrocode} +% \cs{solutionparshape} empty means \cs{leadinitem} hasn't been used yet, +% so we can use it here by passing control to \cs{eqe@@leadinitem}, otherwise, +% we toss an exception. +% \begin{macrocode} + \def\eqe@next{\eqe@@leadinitem}% + \ifeqfortextbook\writeT@SolnFile{\protect\bpartsmrk}\fi + \else + \def\eqe@next{\PackageError{eqexam} + {The \string\leadinitem\space command may + only be used\MessageBreak once per problem* environment} + {Remove all but one of the \string\leadinitem\space + commands.}}% + \fi\eqe@next +} +\newif\ifisleadin \isleadinfalse +\let\isparshapeExpanded\eqe@NO +\def\eqe@@leadinitem{\if\itsforleadinitem\eqe@NO + \setcounter{partno}{0}\fi\refstepcounter{partno}% +% \end{macrocode} +% After initializing the counter, we make various calculations +% \begin{macrocode} + \eq@initializeContAnnot + \isleadintrue\let\isitleadin\eqe@YES +% \end{macrocode} +% We signal a \cs{leadinitem} by writing a special command to the AUX file, +% this is used to disallow the use of the \texttt{*} option of points. +% \begin{macrocode} + \eqe@writetoAux{\string\csarg\string + \gdef{leadinitem\thisexamlabel-\theeqquestionnoi}{}}% + \settowidth{\eq@tmpdima}{\normalfont\parts@indent\eqe@prtsepPrb}% + \xdef\leadinIndentPrtSep{\the\eq@tmpdima}% + \setlength{\eq@tmpdima}{\eqemargin+\eq@tmpdima}% + \xdef\leadinIndent{\the\eq@tmpdima}% + \settowidth{\eq@tmplength}{\parts@indent}% + \edef\partsleadinIndent{\the\eq@tmplength}% + \setlength{\eq@tmplength}{\linewidth-\leadinIndentPrtSep}% + \edef\leadinIndentLength{\the\eq@tmplength}% +% \end{macrocode} +% \changes{v3.8}{2015/03/17}{Spacing is not correct with standard itemize and +% enumerate environments, this is a fix.} +% Modify \cs{@listii} from core LaTeX: Increase \cs{leftmarginii} and \cs{linewidth} +% appropriately. +% \begin{macrocode} +\@ifundefined{@listii@SAVE}{\global\let\@listii@SAVE\@listii}{}% + \expandafter\def\expandafter\@listii\expandafter{\@listii@SAVE + \advance\leftmarginii\leadinIndentPrtSep\relax + \leftmargin\leftmarginii \labelwidth\leftmarginii + \advance\labelwidth-\labelsep +% \advance\linewidth\leadinIndentPrtSep\relax + }% +% \end{macrocode} +% The \texttt{parshape} for the first paragraph of the \cs{leadinitem}. +% \begin{macrocode} + \parshape=2 \eqemargin \linewidth \leadinIndent \leadinIndentLength +% \end{macrocode} +% Here is the definition of \cs{solutionparshape}, we use the shape of +% subsequent paragraphs. +% \begin{macrocode} + \xdef\solutionparshape{%\noexpand\linewidth\leadinIndentLength + \noexpand\parshape=1 \leadinIndent\space\leadinIndentLength}% +% \end{macrocode} +% After the current paragraph, we execute \cs{solutionparshape}, then +% empty out \cs{everypar}. Seems to work. +% \begin{macrocode} + \global\let\isparshapeExpanded\eqe@NO + \everypar{\solutionparshape + \global\let\isparshapeExpanded\eqe@YES\everypar{}}% +% \end{macrocode} +% These next lines were taken from \cs{eq@item@common} in \textsf{exerquiz}. +% The command \cs{eq@insertContAnnot} was removed from the \cs{eq@item@common} code, it is not needed +% here and caused trouble. We \cs{let} \cs{eq@item} to \cs{eq@leadin@item} to +% continue the flow. \cs{@ckhide} checks for an optional argument (\texttt{h} or \texttt{H}) +% and sets switches as appropriate. +% \begin{macrocode} + \let\eq@item\eq@leadin@item\eqp@rtc@lcm@rk + \def\currhideopt{x}\eq@hidesolutionfalse\eq@nolinkfalse + \@ifnextchar[{\@ckhide}{\eq@item}% +} +% \end{macrocode} +% The final step. If the solution is hidden, we do not write the header. +% \changes{v3.3a}{2013/05/03}{Changed name of \cs{eq@writeexheader} to \cs{eqExerSolnHeader}} +% \changes{v4.9a}{2017/04/05}{Added a test for solutions after within lead-in item} +% \begin{macrocode} +\def\eq@leadin@item{\eq@ckglobalhide\ifeq@hidesolution\else + \global\let\eqExerSolnHeader\eq@@writeexheaderlist\fi + \ifeq@nosolutions\eq@nolinktrue\fi + \ifeq@solutionsafter\eq@nolinktrue\fi + \unskip\noindent\makebox[\partsleadinIndent]{\eqexlisttabheader}% + \eqe@prtsepPrb\ignorespaces +} +% \end{macrocode} +% \end{macro} +% \DescribeMacro{\tableadin}\cs{tableadin} is \cs{let} to \cs{eqe@tableadin} within +% the \texttt{problem*} env. The switch \cs{if@tableadinitem} is defined in +% \textsf{exerquiz}. +% \begin{macrocode} +\def\eqe@tableadin{\@tableadinitemtrue\eqe@writetoAux{\protect + \csarg\protect\gdef{tableadin\thisexamlabel-\theeqquestionnoi}{}}% +} +% \end{macrocode} +% \begin{macro}{\pushProblem} +% \begin{macro}{\popProblem} +% There may be an occasion when a multi-part question needs to be broken between parts. +% use the \cs{pushProblem} and \cs{popProblem} for this purpose. The push saves the +% counter value, and ends the \texttt{parts} environment. The pop restarts the +% \texttt{parts}, and resets the parts counter. +% \changes{1.6b}{2006/3/12} +% { +% Added \cs{pushProblem} and \cs{popProblem} to grant the ability to interrupt +% a parts environment for, for example, a multicolumn environment. +% } +%\par\medskip\noindent +%In the example below, we have our parts in a \texttt{multicols} environment, we +%\cs{pushProblem}, close \texttt{multicols}, \cs{popProblem} and continue with +% the multi-parts in single column. +%\begin{verbatim} +%\item Compute $\lim_{x\to2^{\text{$-$}}} f(x)$ +%\begin{solution}[1in]\end{solution} +%\pushProblem +%\end{multicols} +%\popProblem +%\item What value(s) of $c$ make the function $f$ +%continuous at $x=2$? +%\begin{solution}[.5in]\end{solution} +%\end{parts} +%\end{verbatim} +% \begin{macrocode} +\newcommand\pushProblem{\xdef\nlastItem{\arabic{partno}}\end{parts}} +% \end{macrocode} +% (2013/05/30) Adding an optional parameter to \cs{popProblem} to match +% the option argument of the \texttt{parts} environment. This enables you +% to push a \texttt{list} environment and push a \texttt{tabular} environment. +% \begin{macrocode} +\newcommand\popProblem[1][]{% + \def\@argi{#1}\ifx\@argi\@empty + \def\eqe@bParts{\begin{parts}}\else + \def\eqe@bParts{\begin{parts}[#1]}\fi + \eqe@bParts\setcounter{partno}{\nlastItem}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macrocode} +\def\lastPageTotal{0pt} +\def\marginparafterhook{\xdef\lastPageTotal{\the\pagetotal}} +% \end{macrocode} +% \DescribeMacro{\manualcalcparts} is the command calculates points +% when the argument is \emph{not} \cs{auto}. The macro \cmd{\prob@Arg} +% determines if the points argument passed is of the form \texttt{ea}. +% \begin{macrocode} +\def\prob@Arg#1ea#2\end{\def\argi{#1}\def\argii{#2}} +% \end{macrocode} +% Now begin \cs{manualcalcparts}; \texttt{\#1} is the number of points, which may be +% of the form \texttt{ea}, or just \texttt{}. +% \begin{macrocode} +\let\eqe@pointsEach\eqe@NO +\def\manualcalcparts#1{% + \expandafter\prob@Arg#1ea\end + \ifx\argii\@empty\edef\numpoints{#1}% + \let\eqe@pointsEach\eqe@NO +% \end{macrocode} +% Argument form is \texttt{} assumed: Total points specified, we +% should ignore any \cs{PTs} commands. +% \begin{macrocode} + \let\eqe@pointsPartsId\eqe@Zero + \else +% \end{macrocode} +% Argument form is \texttt{ea} assumed: Again we +% should ignore any \cs{PTs} commands. +% \begin{macrocode} + \gdef\probpointseach{x}\let\eqe@pointsPartsId\eqe@Two + \let\eqe@pointsEach\eqe@YES +% \end{macrocode} +% Points each specified +% \begin{macrocode} + \setcounter{eq@count}{\value{eqquestionnoi}}% + \addtocounter{eq@count}{1}\csarg + \ifx{prob\thisexamlabel.\theeq@count}\relax + \def\numpoints{\argi}\else + \def\numpoints{\expandafter + \csname prob\thisexamlabel.\theeq@count\endcsname}% + \fi +% \end{macrocode} +%\changes{v4.1}{2015/04/23}{Moved this segment of code to \cs{manualcalcparts}, +% it is taken from the main \texttt{problem*} env.} +% \begin{macrocode} + \ifx\yest@D@\eqe@YES + \setcounter{eq@count}{\value{eqquestionnoi}}% + \addtocounter{eq@count}{1}% + \@ifundefined{nPartsThisProb\thisexamlabel.\theeq@count} + {\makeOutOfNum{0}\makeDoNum{0}}{% + \expandafter\makeOutOfNum{% + \csname nPartsThisProb\thisexamlabel.% + \theeq@count\endcsname}% + \expandafter\makeDoNum{% + \csname DoNumThisProb\thisexamlabel.% + \theeq@count\endcsname}}% + \fi + \fi +% \end{macrocode} +% If \cs{marginpoints} is \cs{@empty}, the author has chosen the \texttt{nopoints} option +% or used the \cs{NoPoints} command. +% \begin{macrocode} + \ifx\marginpoints\@empty +% \end{macrocode} +% No points for this exam +% \begin{macrocode} + \else + \ifx\argi\@empty +% \end{macrocode} +% If \cs{argi} is empty, no points were specified, so we \cs{let} +% \cs{marginpoints} to \cs{@empty} +% \begin{macrocode} + \let\marginpoints\@empty + \else +% \end{macrocode} +% Points are displayed in margins or inline +% \begin{macrocode} + \ifx\argii\@empty +% \end{macrocode} +% \paragraph*{Total points specified} +% \begin{macrocode} + \ifx\marginpoints\@empty\else + \if\@isitstar\eqe@One +% \end{macrocode} +% Points to appear ``in-line'' rather than in the margins +% \begin{macrocode} + \addtocounter{eqpointvalue}{#1}% + \@marktotalvalue\ifdispl@yPoints + \def\marginparafterhook{\itemPTsFormated{% + \itemPTsTxt{\numpoints}}\space}\fi + \else +% \end{macrocode} +% Points appear in the margins +% \begin{macrocode} + \def\marginparpriorhook{\noindent + \probvalue{\numpoints}{0}}% + \fi + \fi + \else +% \end{macrocode} +% \paragraph*{Points each specified} +% \begin{macrocode} + \ifx\marginpoints\@empty\else + \if\@isitstar\eqe@One\ifdispl@yPoints +% \end{macrocode} +% Points to appear ``in-line'' rather than in the margins +% \begin{macrocode} + \def\marginparafterhook{% + \itemPTsFormated{\itemPTsEaTxt{\argi}}\space}\fi + \else +% \end{macrocode} +% Points appear in the margins +% \begin{macrocode} + \ifdispl@yPoints + \def\marginparpriorhook{\noindent + \marginpoints{\numpoints}{\argi}}\fi + \fi +% \end{macrocode} +% Don't remember why I named this command the way I did, but it is use to pass +% the number of points, when there is a \cs{leadinitem}. +% \begin{macrocode} + \edef\eqp@rtc@lcm@rk{\noexpand + \addtocounter{eqpointvalue}{\argi}% + \noexpand\@marktotalvalue}% + \fi + \fi + \fi + \fi + \ifnum\value{eq@count}=1\relax + \eqe@IWO\@auxout{\string\csarg\string + \gdef{pagenofirstprob\thisexamlabel}{\thepage}}% + \fi +} +% \end{macrocode} +% \DescribeMacro{\autocalcparts} is the command that computes the total points when +% the author specifies \cs{auto} as the optional argument of \texttt{problem*}. The +% commands \cmd{\acp@mpah} and \cmd{\acp@mpph} were recently (2012/04/21) separated +% out to allow for additional customization, without re-defining the whole of +% \cs{autocalcparts}. +% \begin{macrocode} +\def\acp@mpah{\itemPTsFormated{\itemPTsTxt{\numpoints}}\space} +\def\acp@mpph{\noindent\marginpoints{\numpoints}{0}} +\def\autocalcparts{% + \setcounter{eq@count}{\value{eqquestionnoi}}% + \addtocounter{eq@count}{1}% + \csarg\ifx{prob\thisexamlabel.\theeq@count}\relax + \def\numpoints{0}% assume zero points until we get the total + \else + \edef\numpoints{\@nameuse{prob\thisexamlabel.\theeq@count}}% + \fi +% \addtocounter{eqpointvalue}{\numpoints}\@marktotalvalue + \ifx\marginpoints\@empty\else + \ifdispl@yPoints + \if\@isitstar\eqe@One +% \end{macrocode} +% If we have \texttt{*\cs{auto}}, the total is to appear inline. +% \begin{macrocode} + \def\marginparafterhook{\acp@mpah}\else +% \end{macrocode} +% Otherwise, the total will appear in the margin. +% \begin{macrocode} + \def\marginparpriorhook{\acp@mpph}\fi + \fi + \fi + \setcounter{eq@count}{0}% +} +% \end{macrocode} +% \begin{macro}{\forproblem} +% \begin{macro}{\foritem} +% \begin{macro}{\forleadinitem} +% When typing solutions from assigned problems in a textbook, the problems +% assigned are not consecutive. You can set the problem number before the problem +% environments by using the \cs{forproblem} command. The one required argument is +% the problem number: \verb!\forproblem{10)!. +% \changes{v1.6h}{2007/01/24} +% { +% Added \cs{forproblem}, \cs{foritem}, \cs{aNewPage} +% } +% \changes{v3.6a}{2015/01/31}{Added \cs{eqe@fpmrk} to add to the uniqueness +% of \cs{theHeqquestionnoi}.} +% \begin{macrocode} +\let\eqe@fpmrk\@empty +\newcommand{\forproblem}[1]{\def\eqe@fpmrk{-\the@exno}% + \setcounter{eqquestionnoi}{#1 - 1}} +% \end{macrocode} +% A similar comment for \cs{item}. These are useful for making out solution +% sets to homework assignments where problems are assigned from the textbook +% and you want to give a solution to problem 12, part (b), An example of usage is +%\begin{verbatim} +%\forproblem{12} +%\begin{problem*} +%Factor each. +%\begin{parts} +% \foritem{b} $ x^2 + 2x + 1 = ( x + 1 )^2 $ +% \item $ x^2 - x - 2 = ( x - 2 )( x + 1) $ % this is part (c) +% \foritem{e} $ x^2 + 7x + 10 = ( x - 2 )( x + 7) $ +% \item ... % this will be part (f) +%\end{parts} +%\end{problem*} +%\end{verbatim} +% \begin{macrocode} +\newcommand{\foritem}[2][]{% + \setcounter{partno}{0}\def\@rgi{#1}\ifx\@rgi\@empty + \def\eqe@nextitem{\item}\else + \def\eqe@nextitem{\item[#1]}\fi + \foritem@cont{#2}} +\newcommand{\forleadinitem}[2][]{% + \setcounter{partno}{0}\def\@rgi{#1}\ifx\@rgi\@empty + \def\eqe@nextitem{\leadinitem}\else + \def\eqe@nextitem{\leadinitem[#1]}\fi + \foritem@cont{#2}} +% \end{macrocode} +% (2017/01/04) Modified \cs{foritem@cont} to allow for numbering parts. +% \changes{v4.7}{2017/01/04}{Modified \cs{foritem@cont} to allow for numbering parts} +% \begin{macrocode} +\def\foritem@cont#1{\ifuseNumForParts + \edef\fliPartNo{#1}\setcounter{partno}{#1-1}\else + \lowercase{\def\eq@selectedItem{#1}}% + \let\eq@initLoop\eqe@NO + \loop + \stepcounter{partno}\expandafter + \if\alph{partno}\eq@selectedItem + \let\eq@initLoop\eqe@YES\fi + \ifx\eq@initLoop\eqe@NO\repeat + \edef\fliPartNo{\the\c@partno}% + \addtocounter{partno}{-1}\fi\let\itsforleadinitem\eqe@YES + \eqe@nextitem} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% The command \cs{eqe@insertContAnnot} attempts to insert a string just prior +% to a part, if that part begins a new page. To get it right, it promotes a new +% page using the default of .25in. The optional parameter allows you to insert +% a new value; this may be needed to get the string \cs{annotContStr} placed properly. +% The commands +% \begin{macro}{\annotContStr} +% \changes{v3.0l}{2011/08/22}{Defined \cs{eqe@insertContAnnot} and related commands} +% The string that is typeset by the \cs{eqe@insertContAnnot} command. +% \begin{macro}{\acvspace} +% User access to changing the vertical spacing \cs{promoteNewPage} uses within +% \cs{eqe@insertContAnnot}. +% \begin{macro}{\resetacvspace} +% Resets the vertical spacing back to its default. +% \begin{macrocode} +\newcommand{\annotContStr}{% + \textbf{Problem~{\eqeCurrProb} continued\strut}} +\newcommand{\acvspace}[1]{\def\ic@vspace{#1}\setlength\iacvspace{#1}} +% \end{macrocode} +% \DescribeMacro{\ic@vspacedefault} is the default vertical spacing used +% by \cs{eqe@insertContAnnot} +% \begin{macrocode} +\newlength\iacvspace +\newcommand{\ic@vspacedefault}{1in} % changed .25in to 1in 2012/12/04 +\newcommand{\resetacvspace}{\setlength\iacvspace{\ic@vspacedefault}} +\resetacvspace +% \end{macrocode} +% \cs{eqe@insertContAnnot} promotes a new page, and if the current +% page is different than the starting page, \cs{eq@currProbStartPage}, we +% insert \cs{annotContStr}. +% \begin{macrocode} +\def\@nnotContStrSkip{\vskip3pt} +\newcommand{\eqe@insertContAnnot}[1][\iacvspace]{\promoteNewPage[#1]% + \ifnum\arabic{page}>\eq@currProbStartPage + \xdef\eq@currProbStartPage{\arabic{page}}% + {\settowidth{\eq@tmplength}{\parts@indent\eqe@prtsepPrb}% + \xdef\eqe@partsIndent{\the\eq@tmplength}}% + \ifwithinparts +% \end{macrocode} +% \cs{eq@item} is the \texttt{list} definition of \cs{item} which has been +% \cs{let} to \cs{eq@item} within the \texttt{parts} environment. +% \begin{macrocode} + \@ifundefined{eq@item@latex}{\item[]\hspace*{-\eqemargin}% + \ifx\solutionparshape\@empty\else\hspace*{-\eqe@partsIndent}\fi} + {\eq@item@latex[]\hspace*{-\eqemargin}% + \hspace{-\eqe@partsIndent}}\else +% \end{macrocode} +% If placed between problem sets, we indent as appropriate. +% \begin{macrocode} + \hspace*{-\eqemargin}\fi + \annotContStr\@nnotContStrSkip % dpsj20 + \fi +} +\edef\eq@currProbStartPage{\arabic{page}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\turnContAnnotOff} +% \begin{macro}{\turnContAnnotOn} +% Turn off and on this feature. The default is off. +% \begin{macrocode} +\newif\ifcont@nnot \cont@nnotfalse +%\newcommand{\@gobbloptone}[1][]{} +\newcommand{\turnContAnnotOff}{\global\cont@nnotfalse + \global\let\eq@insertContAnnot\relax} +\newcommand{\turnContAnnotOn}{\global\cont@nnottrue + \global\let\eq@insertContAnnot\eqe@insertContAnnot} +\turnContAnnotOff +% \end{macrocode} +% Used for manually inserting annot +% \begin{macrocode} +\def\insertContAnnot{\eq@insertContAnnot} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\aNewPage} +% \begin{macro}{\qNewPage} +% A simple command for inserting \cs{newpage}, only if the \cs{answerkey} +% option has been taken. +% \changes{v1.6h}{2007/01/24} +% { +% Added \cs{aNewPage} and \cs{qNewPage} +% } +% \begin{macrocode} +\newcommand\aNewPage{\ifanswerkey\newpage\fi} +\newcommand\qNewPage{\ifanswerkey\else\newpage\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\OnBackOfPage} +% +% In an effort to make maximum use of the paper, I sometimes ask the +% students to solve the problem on the back of a page. The following +% command is an automated instruction. Generally, we work on the back +% of the previous page, unless we are on page 1, in this case we work +% on the back of page 1. +% +% \begin{macrocode} +\newcounter{backofpage} +\newcommand\bopText{on the back of page~\boPage} +\newcommand\bopCoverPageText{on the back of the cover page} +\newcommand\OnBackOfPage[1][\bopText]{% + \refstepcounter{backofpage}\label{bop\thebackofpage} + \begingroup + \csarg\ifx{r@bop\thebackofpage}\relax + \def\boPage{??}\else + \edef\eqe@temp{\csname r@bop\thebackofpage\endcsname}% + \ifx\hyper@anchor\@undefined + \edef\boPage{\expandafter\@secondoftwo\eqe@temp}\else + \edef\boPage{\expandafter\@secondoffive\eqe@temp}\fi + \c@eq@count\boPage + \advance\c@eq@count-1\relax +% \end{macrocode} +% If on page 1, we work on the back of page 1, otherwise, we work on the +% back of the previous page. +% \begin{macrocode} + \edef\boPage + {% + \ifx\eqex@coverpage\relax + \ifnum\value{eq@count}=0 + 1% + \else + \the\value{eq@count}% + \fi + \else + \ifnum\value{eq@count}=0 + -1% + \else + \the\value{eq@count}% + \fi + \fi + }% + \fi + \csarg\ifx{r@bop\thebackofpage}\relax#1\else + \ifnum\boPage=-1\relax\bopCoverPageText\else#1\fi\fi + \endgroup +} +% \end{macrocode} +% \end{macro} +% +%\section{Vertical Space Filling Options} +% +% When the \opt{nosolutions} or the \opt{vspacewithsolns} is used, a +% vertical space is generated by the \env{solution} environment. +% Previously, this has just been a vertical white space, now, we provide +% the ability to fill the space with horizontal rules of different types. +% Below is the implementation of this. +% +% \subsection{General filler lines commands and controls} +% \begin{macro}{\useFillerLines} +% When used, the vertical space is written with lines (rules, dashes, dots, grids ). +%\changes{v2.0e}{2011/03/07} +%{% +% Added the feature of filling the vertical space with ruled lines of +% different types. This feature is available for paper options and for +% \texttt{nosolutions} and \texttt{vspacewithsolution} options. +%} +% \begin{macrocode} +\newcommand{\useFillerLines}{\ifx\vspaceFiller % dpsj8 + \vspaceFillerLines\else\@eqlinedfillertrue + \let\vspaceFiller\vspaceFillerLines\fillTypeDefault +\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\useFillerDefault} +% Resets the vertical space to the original white space. +% \begin{macrocode} +\newcommand{\useFillerDefault}{\@eqlinedfillerfalse + \let\vspaceFiller\vspaceFillerDefault + \let\eqWriteLine\hfill} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fillTypeHRule} +% Writes the line as a solid line (\cs{hrulefill}). +% \begin{macrocode} +\newcommand{\fillTypeHRule}{\let\eqWriteLine\eqWriteLineFill + \let\makeVgrid\relax} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fillTypeDots} +% Writes the line as a dotted line (\cs{dotfill}). +% \begin{macrocode} +\newcommand{\fillTypeDots}{\let\eqWriteLine\eqWriteLineDots + \let\makeVgrid\relax} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fillTypeDashLine} +% Writes the line as a dotted line (\cs{eqdashrulefill}). +% \begin{macrocode} +\newcommand{\fillTypeDashLine}{\let\eqWriteLine\eqWriteLineDashFill + \let\makeVgrid\relax} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fillTypeBlankLine} +% Fills the line +% \begin{macrocode} +\newcommand{\fillTypeBlankLine}{\let\eqWriteLine\eqWriteLineBlankFill + \let\makeVgrid\relax} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fillTypeDefault} +% Resets fill type back to the default, \cs{hrulefill}. +% \begin{macrocode} +\newcommand{\fillTypeDefault}{\let\eqWriteLine\eqWriteLineFill + \let\makeVgrid\relax} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fillTypeGrid} +% Fills the space with a grid, horizontal and vertical lines. +% \changes{v4.9c}{2017/11/03}{Added \string\cs{fillTypeGrid}} +% \begin{macrocode} +\newcommand{\fillTypeGrid}{\ifx\vspaceFiller\vspaceFillerLines + \let\eqWriteLine\eqWriteLineFill\let\makeVgrid\eqe@makeVgrid\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\eqWriteLineColor} +% The color of the rule to use. +% \begin{macrocode} +\newcommand{\eqWriteLineColor}[1]{\def\eq@WriteLineColor{#1}} +\eqWriteLineColor{gray} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\eqWLSpacing} +% The line spacing between the rules. +% \begin{macrocode} +\newlength\wlVspace +\newcommand{\eqWLSpacing}[1]{\setlength\wlVspace{#1}} +\eqWLSpacing{14.0pt} +% \end{macrocode} +% \end{macro} +% \paragraph*{Fill Types.} We have three types of line fill: +% \cs{hrulefill}, \cs{dotfill}, and a custom rule \cs{eqdashrulefill}. +% The commands three \cs{eqWriteLineFill}, \cs{eqWriteLineDots}, and +% \cs{eqWriteLineDashFill} implements these three types. They are +% \cs{let} to \cs{eqWriteLine}, which is used in \cs{vspaceFillerLines}. +% \begin{macrocode} +\newcommand{\eqWriteLineFill}{% + \textcolor{\eq@WriteLineColor}{\leaders + \hrule height \flfboxrule\hfill}} +% \end{macrocode} +% The first box is used in \cs{eqdotrulefill}, whereas the second two are +% used to split off content using \cs{vsplit}. These are active when +% the options flextended and answerkey are in force, and when +% \cs{useFillerLines} and \cs{turnflanskeyOn} have been expanded. +% \begin{macrocode} +\newbox\eqe@tempbox +\newbox\eqe@nskeyflsplit +\newbox\eqe@nskeyfltop +\def\eqdotrulefill{\leavevmode + \cleaders\hb@xt@ .44em{\copy\eqe@tempbox\hss}\hfill} % dps16 +% \cleaders\hb@xt@ .44em{\unhcopy\eqe@tempbox\hss}\hfill} % dps8 +\newcommand{\eqWriteLineDots}{% + \textcolor{\eq@WriteLineColor}{\eqdotrulefill}} +\def\eqdashrulefill{\leavevmode + \cleaders\hb@xt@ .44em{\rule{.22em}{\flfboxrule}\hss}\hfill\kern\z@} +\newcommand{\eqWriteLineDashFill}{% + \textcolor{\eq@WriteLineColor}{\eqdashrulefill}} +%\newcommand{\eqWriteLineBlankFill}{\hfill} +\newcommand{\eqWriteLineBlankFill}{\vphantom{\hrulefill}} +% \end{macrocode} +% Vertical counterparts to those above, excepting blank fill. +% \changes{v5.0}{2017/11/08}{Added vertical rules} +% \begin{macrocode} +\newcommand{\eqWriteLineVFill}{\leaders\vrule width\flfboxrule\vfill} +\def\eqdotruleVfill{\cleaders\vbox to .44em{\vss + \hbox to0pt{\hss.\hss}}\vfill} +\newcommand{\eqWriteLineVDots}{\eqdotruleVfill} +\def\eqdashruleVfill{\cleaders\vbox to .44em{\vss + \hbox to0pt{\hss\rule{\flfboxrule}{.22em}\hss}}\vfill} +\newcommand{\eqWriteLineDashVFill}{\eqdashruleVfill} +% \end{macrocode} +% When the \env{solution} environment contains both an \texttt{nLines} and a dimension, +% by default, the dimension is used; however, if \DescribeMacro{\usenLineDimen}\cs{usenLineDimen} +% is specified, we force the use of the \texttt{nLines} specification. Switch back to the default +% using \DescribeMacro{\useVspaceDimen}\cs{useVspaceDimen}. +% \begin{macrocode} +\newif\if@equsedim \@equsedimtrue +\newcommand{\useVspaceDimen}{\@equsedimtrue} +\newcommand{\usenLineDimen}{\@equsedimfalse} +\newif\if@eqalignfilllinestoleft\@eqalignfilllinestoleftfalse +% \end{macrocode} +% Use \DescribeMacro{\fillerLinesAlignDef}\cs{fillerLinesAlignDef} and +% \cs{fillerLinesOnLeftMargin} to adjust +% the alignment of the rule lines for this feature.\DescribeMacro{\fillerLinesOnLeftMargin} +% The first is the default, the second one aligns rule lines to the left margin. +% \begin{macrocode} +\newcommand{\fillerLinesOnLeftMargin}{\@eqalignfilllinestolefttrue} +\newcommand{\fillerLinesAlignDef}{\@eqalignfilllinestoleftfalse} +\newcommand\priorPageBreakMsg[1]{\def\priorP@geBre@kMsg{#1}} +\let\priorP@geBre@kMsg\@empty +\newcommand{\flPageBreakMsg}[1]{% + \priorPageBreakMsg{\emitMessageNearBottom[\iacvspace] + {\eqfititin{{\Large\strut}#1}}}% +} +% \end{macrocode} +% The command \cs{makeVgrid} is an internal macro that is let to either +% \cs{relax}, as below, or to \cs{eqe@makeVgrid}. The latter creates a grid of fill lines. +% \begin{macrocode} +\let\makeVgrid\relax %dps1 +% \end{macrocode} +% \paragraph*{Key-values for fill lines} +% We define the \texttt{eqefillLines} \pkg{xkeyval} family, the keys are set through the +% command \cs{setFillLinesFmt}. We define nine keys +% \texttt{numbers}, \texttt{numbersep}, \texttt{color}, \texttt{topline}, \texttt{gridtype}, +% \texttt{fltype}, \texttt{align}, \texttt{outlineonly}, \texttt{bgonly}, and \texttt{bgcolor}. The first two are used +% to number the fill lines, the \texttt{color} is to color the fill lines, the last two +% concerning the grid type filler lines. +% \changes{v5.0}{2017/11/08}{Added support for \string\cs{fillTypeGrid}, added keys +% numbers, numbersep, and color as well}\medskip +% +% \noindent\IndexKey{numbers}\hskip-\marginparsep\texttt{=\ameta{\upshape{none\string|left\string|right}}} +% This is a +% \texttt{numbers} is a choice key with possible values of \texttt{none}, \texttt{left} +% and \texttt{right}. It places a line numbering to the left or right of the line, or no line number is used +% if \texttt{none} is selected. +% \begin{macrocode} +\define@choicekey+{eqefillLines}{numbers}[\val\nr]% + {none,left,right}[none]{\ifcase\nr\relax + \let\eqe@numLinesL\relax\let\eqe@numLinesR\relax\or + \let\eqe@numLinesL\eqe@@numLinesL\let\eqe@numLinesR\relax\or + \let\eqe@numLinesL\relax\let\eqe@numLinesR\eqe@@numLinesR + \fi +}{\PackageWarning{aeb}{Bad choice for numbers, permissible values + are none, left, and right. Try again}} +\let\eqe@numLinesL\relax\let\eqe@numLinesR\relax +% \end{macrocode} +% \noindent\IndexKey{numbersep}\hskip-\marginparsep\texttt{=\ameta{dimen}} +% When \texttt{numbers} is either \texttt{left} or \texttt{right}, the separation between +% the line and the number is \texttt{numbersep}. The default value is +% 2pt. +% \begin{macrocode} +\define@key{eqefillLines}{numbersep}[2pt]{% + \setlength{\eqetmplengtha}{#1}% + \edef\eqe@numbersep{\the\eqetmplengtha}} +\def\eqe@numbersep{2pt} +% \end{macrocode} +% \noindent\IndexKey{color}\hskip-\marginparsep\texttt{=\ameta{color-spec}} +% The \texttt{color} key paints the lines the specified color, for example, +% \texttt{color=red!20}. It simply defines \cs{eq@WriteLineColor} to be this color. +% \begin{macrocode} +\define@key{eqefillLines}{color}[]{\def\eq@WriteLineColor{#1}} +% \end{macrocode} +% \noindent\IndexKey{topline}\hskip-\marginparsep\texttt{=\ameta{\upshape{true\string|false}}} +% When \cs{fillTypeGrid} is in effect, \texttt{topline=true} writes +% an additional line above the top most line, this line is not numbered. +% \begin{macrocode} +\define@boolkey{eqefillLines}{topline}[true]{} +\KV@eqefillLines@toplinefalse +% \end{macrocode} +% \noindent \IndexKey{gridtype}\hskip-\marginparsep\texttt{=\ameta{\upshape{line\string|dash\string|dots}}} +% The \texttt{gridtype} key determines the line style for the grid, +% choices are \texttt{line} (the default), \texttt{dash}, and \texttt{dots}. This key also +% sets the line style when the \texttt{outlineonly} key is specified. +% \begin{macrocode} +\let\eqe@usedeffboxrule\eqe@NO % dps20 +\let\gridtypeselected\@empty % dps26 +\define@choicekey+{eqefillLines}{gridtype}[\val\nr]% + {line,dash,dots}[line]{\edef\gridtypeselected{\val}% dps26 + \ifcase\nr\relax + \let\gridHLineFill\eqWriteLineFill + \let\gridVLineFill\eqWriteLineVFill + \or + \let\gridHLineFill\eqWriteLineDashFill + \let\gridVLineFill\eqWriteLineDashVFill + \or + \let\gridHLineFill\eqWriteLineDots + \let\gridVLineFill\eqWriteLineVDots + \let\eqe@usedeffboxrule\eqe@YES %dps20 + \fi +}{\PackageWarning{aeb}{Bad choice for numbers, permissible values + are line, dash, and dots. Try again}} +\let\gridHLineFill\eqWriteLineFill +\let\gridVLineFill\eqWriteLineVFill +% \end{macrocode} +% \noindent\IndexKey{fltype}\hskip-\marginparsep\texttt{=\ameta{\upshape{line\string|dash\string|dots\string|blank}}} +% The \texttt{fltype} key determines the type of line style for the horizontal rendering. This key simply +% executes the various command versions. +% \begin{macrocode} +\define@choicekey+{eqefillLines}{fltype}[\val\nr]% + {line,dash,dots,blank,grid}[line]{\ifcase\nr\relax + \fillTypeHRule\or + \fillTypeDashLine\or + \fillTypeDots + \let\eqe@usedeffboxrule\eqe@YES\or % dps20 + \fillTypeBlankLine\or + \fillTypeGrid\fi +}{\PackageWarning{aeb}{Bad choice for numbers, permissible values + are line, dash, dots, blank, and grid. Try again}} +% \end{macrocode} +% \noindent\IndexKey{align}\hskip-\marginparsep\texttt{=\ameta{\upshape{left\string|default}}} +% Another convenience key, \texttt{align} simply executes the command versions. +% \begin{macrocode} +\define@choicekey+{eqefillLines}{align}[\val\nr]% + {default,left}[default]{\ifcase\nr\relax + \fillerLinesAlignDef\or + \fillerLinesOnLeftMargin\fi +}{\PackageWarning{aeb}{Bad choice for numbers, permissible values + are line, dash, dots, blank, and grid. Try again}} +\define@choicekey*{eqefillLines}{equalcells}[\val\nr]% + {true,false}[true]{\ifcase\nr\relax + \equalCellSizesOn\or + \equalCellSizesOff\fi +} +% \end{macrocode} +% \noindent\IndexKey{outlineonly*}\hskip-\marginparsep\texttt{=\ameta{\upshape{true\string|false}}} +% outlines the work area only, does not create horizontal or vertical lines, other than the lines +% to outline the region. Obeys the \texttt{gridtype} key. +% \changes{v5.0c}{2017/11/18}{Added the outlineonly, bgonly, and bgcolor keys to the +% eqefileLines family.} +% \begin{macrocode} +\define@boolkey{eqefillLines}{outlineonly}[true]{} +\KV@eqefillLines@outlineonlyfalse +\define@choicekey{eqefillLines}{outlineonly*}{true,false}[true]{% dps26 + \@nameuse{KV@eqefillLines@outlineonly#1}% + \def\eqefillLines@outlineonlystar{#1}}% +\let\eqefillLines@outlineonlystar\@empty +% \end{macrocode} +% \noindent\IndexKey{bgonly*}\hskip-\marginparsep\texttt{=\ameta{\upshape{true\string|false}}} +% colors the work area with a color of your choice, see \texttt{bgcolor} below. +% \begin{macrocode} +\define@boolkey{eqefillLines}{bgonly}[true]{} % dps11 +\KV@eqefillLines@bgonlyfalse +\define@choicekey{eqefillLines}{bgonly*}{true,false}[true]{% dps26 + \@nameuse{KV@eqefillLines@bgonly#1}% + \def\eqefillLines@bgonlystar{#1}} +\let\eqefillLines@bgonlystar\@empty +% \end{macrocode} +% \noindent\IndexKey{bgcolor}\hskip-\marginparsep\texttt{=\ameta{color-spec}} +% The color to be used when \texttt{bgcolor} is in force. +% If no color has been assigned, the color will be white. +% \begin{macrocode} +\define@key{eqefillLines}{bgcolor}[]{\def\eqe@BGColor{#1}} % dps11 +\let\eqe@BGColor\@empty +% \end{macrocode} +% \DescribeMacro{\fillLinesNumFmt}\hskip-\marginparsep\darg{\ameta{cmds}} +% is used to specify the format for line numbers. Within the \ameta{cmds} argument, +% use \texttt{\#1} to indicate the placement of the number. For example, the code +% |\fillLinesNumFmt{\textbf{#1}}| puts the line numbers in bold font. +% \begin{macrocode} +\def\fillLinesNumFmt#1{\def\eqe@fillLinesNumFmt##1{\def\flnum{##1}#1}} +\fillLinesNumFmt{\flnum} % set to default values +\define@key{eqefillLines}{numfmt}[]{\fillLinesNumFmt{#1}} % dps21 +\define@key{eqefillLines}{linegap}[14pt]{\def\fl@wlspacing{#1}} % dps21 +\def\fl@wlspacing{14pt} +% \end{macrocode} +% \DescribeMacro{\setFillLinesFmt}\hskip-\marginparsep\darg{\ameta{KV-pairs}} +% Set the format of the fill lines, use the keys from the \texttt{eqefillLines} +% defined and described above. Changes outside a group are global. +% An example of the usage is given here: |\setFillLinesFmt{numbers=left,color=red}|. +% \changes{v5.0}{2017/11/08}{Added \string\cs{setFillLinesFmt}} +% +% Other important notes: To produce horizontal lines only, use \texttt{fltype=line\string|\penalty0dash\string|\penalty0dots}, +% to produce blank space, use \texttt{fltype=blank} and to produce a grid \texttt{fltype=grid}. +% \begin{macrocode} +\newcommand{\setFillLinesFmt}[1]{\def\@rgi{#1}% + \let\eqe@usedeffboxrule\eqe@NO %dps20 + \let\gridtypeselected\@empty + \ifx\@rgi\@empty + \setkeys{eqefillLines}{numbers,numbersep,color, + gridtype,fltype,align}% + \else + \let\is@outlineonly\eqe@NO\let\is@bgonly\eqe@NO + \ifKV@eqefillLines@outlineonly\let\is@outlineonly\eqe@YES\fi + \ifKV@eqefillLines@bgonly\let\is@bgonly\eqe@YES\fi + \setkeys{eqefillLines}{#1}% + \eqWLSpacing{\fl@wlspacing}% + \ifx\makeVgrid\relax + \KV@eqefillLines@toplinefalse +% \forceEqualCellsfalse % dps21 + \equalCellSizesOff % dpsj15 + \ifx\is@bgonly\eqe@YES % carryover from prev prob + \ifKV@eqefillLines@bgonly + \KV@eqefillLines@bgonlyfalse + \else + \PackageWarning{eqexam}{You must specify fltype=grid for + bgonly to work.\MessageBreak + Ignoring this key for now}% + \KV@eqefillLines@bgonlyfalse + \let\is@bgonly\eqe@NO + \fi + \else % not continuation + \ifKV@eqefillLines@bgonly + \PackageWarning{eqexam}{You must specify fltype=grid for + bgonly to work.\MessageBreak + Ignoring this key for now}% + \KV@eqefillLines@bgonlyfalse + \let\is@bgonly\eqe@NO + \fi + \fi +% same for outline + \ifx\is@outlineonly\eqe@YES % carryover from prev prob + \ifKV@eqefillLines@outlineonly + \KV@eqefillLines@outlineonlyfalse + \else % dps18 + \PackageWarning{eqexam}{You must specify fltype=grid for + outlineonly to work.\MessageBreak + Ignoring this key for now}% + \KV@eqefillLines@outlineonlyfalse + \let\is@outlineonly\eqe@NO + \fi + \else % not continuation + \ifKV@eqefillLines@outlineonly + \PackageWarning{eqexam}{You must specify fltype=grid for + outlineonly to work.\MessageBreak + Ignoring this key for now}% + \KV@eqefillLines@outlineonlyfalse + \let\is@outlineonly\eqe@NO + \fi + \fi + \let\gridHLineFill\eqWriteLine + \let\gridVLineFill\eqWriteLine + \else + \ifx\gridtypeselected\@empty % dps26 + \let\gridHLineFill\eqWriteLineFill + \let\gridVLineFill\eqWriteLineVFill + \fi + \fi + \fi +} +% \end{macrocode} +% The next two definitions place line numbers on the left and right, respectively. +% \begin{macrocode} +\def\eqe@@numLinesL{\ifKV@eqefillLines@topline\ifnum\@tempcntb>0 % dps5 + \smash{\llap{\tiny + \eqe@fillLinesNumFmt{\the\@tempcntb}\hglue\eqe@numbersep\relax}}\fi + \else\smash{\llap{\tiny + \eqe@fillLinesNumFmt{\the\@tempcntb}\hglue\eqe@numbersep\relax}}\fi} +\def\eqe@@numLinesR{\smash{\rlap{\tiny + \hglue\eqe@numbersep\relax\eqe@fillLinesNumFmt{\the\@tempcntb}}}} +% \end{macrocode} +% The \cs{fillLinesLineWidth} is a special command used for adjusting the length of +% the horizontal lines, and is used only when \cs{fillTypeGrid} is in effect and when +% \cs{forceEqualCells} is true. +% \begin{macrocode} +\let\fillLinesLineWidth\@empty +% \end{macrocode} +% A switch to signal that a grid has broken across pages. This is only set to true +% when the \texttt{topline=true} is specified through \cs{setFillLinesFmt}. +% \changes{v5.0}{2017/11/08}{Added switch \cs{ifgridpgbrk}} +% \begin{macrocode} +\newif\ifgridpgbrk\gridpgbrkfalse % dps7 +% \end{macrocode} +% \begin{macro}{\vspaceFillerLines}\hskip-\marginparsep\,\darg{\ameta{dimen}} +% This is an internal command, though we declare is publicly. It writes the +% horizontal lines (lines, dots, dashes) when the \env{solution} environment +% uses a \ameta{dimen} to specify space (as opposed to using the \texttt{nLines} key). +% \begin{macrocode} +\newif\ifwriteVertic@lFLines \writeVertic@lFLinestrue % dps16 +\def\fl@set@nnotContStrSkip{\def\@nnotContStrSkip{\vskip6pt}} % dpsj23 +\let\p@ssToFLs\relax +\newif\iffl@firstpass % dps27 +\newcommand{\vspaceFillerLines}[1]{\begingroup\offinterlineskip %dps1 + \global\fl@firstpasstrue % dps27 + \fl@set@nnotContStrSkip % dpsj20 + \p@ssToFLs\if@eqlinedfiller + \def\eqe@next{\vspaceFillerLines@i{#1}}\else + \expandafter\def\expandafter\eqe@next + \expandafter{\expandafter\endgroup\p@ssToFLs}\fi + \global\let\p@ssToFLs\relax\eqe@next} +\def\vspaceFillerLines@i#1{\advance\wlVspace-\flfboxrule % dps25 + \ifx\eqe@usedeffboxrule\eqe@YES\flfboxrule=.4pt\fi % dps20 + \ifKV@eqefillLines@outlineonly\KV@eqefillLines@toplinetrue %dps10 + \KV@eqefillLines@bgonlyfalse % dps11 +% \forceEqualCellsfalse % dpsj15 + \equalCellSizesOff\let\makeVgrid\eqe@makeVgrid\fi %dps10 + \ifKV@eqefillLines@bgonly\KV@eqefillLines@toplinetrue + \KV@eqefillLines@outlineonlyfalse\flfboxrule=.4pt % dps20 +% \forceEqualCellsfalse % dpsj15 + \equalCellSizesOff\let\makeVgrid\eqe@makeVgrid\fi %dps11 + \parindent0pt\relax\parskip0pt + \@tempdima\wlVspace\eqetmplengtha0pt + \@tempcnta=0 \@tempcntb=1 +% \end{macrocode} +% \cs{eqe@fillwidth} is the width of the line, it is \cs{linewidth} plus a fudge factor, which +% is determined dynamically by \cs{eqe@wrtLineKernal}. +% \begin{macrocode} + \def\eqe@fillwidth{\linewidth+\eqetmplengtha}% +% \end{macrocode} +% If we are creating a grid (\cs{fillTypeGrid}), and \cs{forceEqualCells} is true, we modify +% the length of the line to make equal cell sizes. \cs{forceEq@lCells} determines +% the value of \cs{fillLinesLineWidth}. +% \begin{macrocode} + \eqe@wrtLineKernal + \setbox\eqe@tempbox\hbox{\hb@xt@0pt{\hss.\hss}}\ht\eqe@tempbox.33pt + \dp\eqe@tempbox0pt % dps16 + \ifx\makeVgrid\relax +% \forceEqualCellsfalse % dpsj15 + \equalCellSizesOff + \else % dps2 + \let\eqWriteLine\gridHLineFill + \forceEqu@lCells % dps2 + \ifx\flEqu@lLineWidth\@empty\else + \linewidth=\flEqu@lLineWidth\relax\fi + \ifKV@eqefillLines@bgonly\else + \ifKV@eqefillLines@topline\bgroup\@tempcntb=0% dps5 + \makebox[0pt][l]{\eqe@x + \makebox[\eqe@fillwidth]{\eqWriteLine}}\egroup + \fi\fi % dps5 + \fi + \settowidth{\eqetmplengthb}{\eqe@decPointPrb}\def\vfGo@l{#1}% + \ifx\makeVgrid\relax\else + \def\priorPNPAction{\xdef\fl@nRows{\the\@tempcnta}% dps27 + \if@eqalignfilllinestoleft\eqe@x\fi % dpsj12 + \makeVgrid\priorP@geBre@kMsg\global\fl@firstpassfalse}% dps4 + \def\postPNPAction{\global\gridpgbrktrue % dps27 + \setlength{\@tempdima} + {(\vfGo@l+\wlVspace)-\depthtodate}% dps25 + \edef\vfGo@l{\the\@tempdima}\@tempdima=\wlVspace\relax + \@tempcnta=0\relax}% dps18 + \fi + \@whiledim\@tempdima<\vfGo@l\relax\do + {\edef\depthtodate{\the\@tempdima}% + \ifx\eqe@insert@more@content\relax\ifx\makeVgrid\relax + \priorP@geBre@kMsg\fi\fi %dps15 + \eq@insertContAnnot\vskip\wlVspace\eqe@x +% \end{macrocode} +% Draw the horizontal line: a rule, dotted line, dashed line +% \begin{macrocode} + \ifKV@eqefillLines@bgonly\vglue\flfboxrule\else % dpsj11 dpsj21 + \ifKV@eqefillLines@outlineonly\vglue\flfboxrule\else %dps10 + \makebox[0pt][l]{\eqe@numLinesL + \makebox[\eqe@fillwidth]{\eqWriteLine}\eqe@numLinesR}\fi + \fi + \advance\@tempcnta1\relax\advance\@tempcntb1\relax + \edef\depthtodate{\the\@tempdima}% + \addtolength{\@tempdima}{\wlVspace}%\par dps25 +% \end{macrocode} +% At the conclusion of the \cs{do} loop, we insert \cs{makeVgrid}, which +% is either \cs{relax} or is \cs{eqe@makeVgrid}, the latter is a complicated +% command to draw vertical lines across the horizontal ones, and to perform +% other tasks. +% \begin{macrocode} + }\xdef\fl@nRows{\the\@tempcnta}\makeVgrid % dps27 + \ifx\makeVgrid\relax\else %dps15 +% \end{macrocode} +% When there is insufficient space to accommodate the content, we +% place a small blank box in the lower left corner, put a information +% message in the log, and reset the color. +% \changes{v5.1b}{2018/01/24}{Added \string\reset@color} +% \begin{macrocode} + \ifvoid\eqe@nskeyflsplit\else\PackageWarning{eqexam} + {Some material from a solution environment does not\MessageBreak + appear. Increase space allotted}{\normalcolor + \llap{\smash{\rule{5pt}{5pt}}}}\aftergroup + \reset@color\fi % dpsj24 + \fi +% \end{macrocode} +% We conclude by adding some vertical space to better align +% the \env{workarea} environment. When a fill type is used, +% the space created by not be exactly \ameta{dimen} the dimension +% specified. +% \begin{macrocode} + \setlength{\@tempdima}{\vfGo@l-\depthtodate}\vskip\@tempdima +% \vskip\flfboxrule\vskip3pt + \dimen0=\sameVspace\relax + \dimen2=\fboxrule\advance\dimen0by\dimen2 + \xdef\sameVspace{\the\dimen0 }\endgroup + \global\flfrstsplittrue +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\eq@linesXPgs} +% Does the same as \cs{vspaceFillerLines} but is used instead of that command when the optional +% argument for \env{solution} specified a value for \texttt{nLines}. Code comments are the same +% as those just given for \cs{vspaceFillerLines}. +% \begin{macrocode} +\def\eq@linesXPgs{\@tempdimb\wlVspace % dpsj20 + \advance\@tempdimb-\flfboxrule + \@tempdimb=\soln@keys@nLines\@tempdimb + \advance\@tempdimb\flfboxrule + \expandafter\vspaceFillerLines\expandafter{\the\@tempdimb}} +% \end{macrocode} +% \end{macro} +% \cs{eqe@wrtLineKernal}, based on a case analysis, sets the register +% \cs{eqetmplengha} and makes some horizontal glue adjustments as well. +% \begin{macrocode} +%\def\eq@linesXPgs{\@tempdimb\wlVspace +% \@tempdimb=\soln@keys@nLines\@tempdimb +% \expandafter\vspaceFillerLines\expandafter{\the\@tempdimb}} +\def\eqe@wrtLineKernal{\let\eqe@x\relax\let\eqe@y\relax % dpsj9 + \ifx\solutionparshape\@empty % not lead-in + \if@eqalignfilllinestoleft % align on left + \setlength{\eqetmplengtha}{\labelwidth+\eqemargin}% + \setlength{\eqetmplengtha} + {\eqetmplengtha+\eqetmplengthb}% + \ifwithinparts + \ifx\istabularexer\eq@YES % tabular mode + \setlength{\eqetmplengtha}{\prtsIndntSep}% dps27 + \eq@tmplengthA\eqetmplengtha + \def\eqe@x{\hglue-\prtsIndntSep}% dps27 + \ifKV@eqefillLines@outlineonly\let\eqe@y\eqe@x\fi + \else + \settowidth{\eqetmplengtha}{\eqe@prtsepPrb}% + \setlength{\eqetmplengtha}{\eqetmplengtha+\widthOfParts}% dps9 + \setlength{\eq@tmplengthA}{\eqetmplengtha}% dps9 + \def\eqe@x{\hspace*{-\eqetmplengtha}\hglue-\flfboxrule}% dps27 + \fi + \else % not parts, still align left + \def\eqe@x{\hspace*{-\eqemargin}}% + \eqetmplengtha\eqemargin + \eq@tmplengthA\eqemargin + \fi + \else % not lead-in, not align on left + \ifwithinparts + \setlength{\eqetmplengtha}{\labelwidth}% + \setlength{\eqetmplengtha} + {\eqetmplengtha+\eqetmplengthb}% + \ifx\istabularexer\eq@YES % tabular mode + \eqetmplengtha0pt + \eq@tmplengthA\eqetmplengtha % dps27 + \else %dps2 + \def\eqe@x{\hglue-\flfboxrule}% dps4 + \eqetmplengtha0pt + \eq@tmplengthA\eqetmplengtha + \fi + \else % not parts, not align left + \eqetmplengtha0pt + \eq@tmplengthA\eqetmplengtha + \fi + \fi + \else % lead-in + \if@eqalignfilllinestoleft + \setlength{\eqetmplengtha}{\leadinIndentPrtSep}% dps27 + \eq@tmplengthA\eqetmplengtha + \else + \eqetmplengtha0pt + \eq@tmplengthA\eqetmplengtha + \fi + \fi +} +% \end{macrocode} +% \DescribeMacro{\equalCellSizesOn} set the switch \cs{ifforceEqualCells} to true, while +% \DescribeMacro{\equalCellSizesOff}\cs{equalCellSizesOff} sets the same switch to false. +% Additionally, the latter command resets \cs{fillLines\-Line\-Width} to its default value +% of \cs{@empty}. It is therefore important not to use the switch directly, but to use +% these two convenience commands. +% \begin{macrocode} +\newif\ifforceEqualCells +\def\equalCellSizesOn{\global\let\flEqu@lLineWidth\@empty + \global\forceEqualCellstrue} +\def\equalCellSizesOff{\global\let\flEqu@lLineWidth\@empty + \global\forceEqualCellsfalse} +\equalCellSizesOff +% \end{macrocode} +% \cs{forceEqu@lCells} determines the value of \cs{fillLinesLineWidth}. It successively +% adds \cs{wlVspace} until it exceeds \cs{linewidth}, it then subtracts off one \cs{wlVspace} +% to get the value for \cs{fillLinesLineWidth}. +% \begin{macrocode} +\def\forceEqu@lCells{\bgroup + \ifforceEqualCells + \dimen6\wlVspace % reduced from \vspaceFillerLines + \advance\dimen6\flfboxrule + \dimen2=\z@ + \dimen4\linewidth + \advance\dimen4by-\flfboxrule + \if@eqalignfilllinestoleft % dps8 + \advance\dimen4\eq@tmplengthA + \fi + \@tempcnta0 + \@whiledim \dimen2 < \dimen4 \do{% + \advance\@tempcnta1 + \advance\dimen2by\dimen6 + }% + \advance\@tempcnta-1 + \advance\dimen2-\dimen6 + \advance\dimen2\flfboxrule + \advance\dimen2by-\eq@tmplengthA + \xdef\flEqu@lLineWidth{\the\dimen2}% + \fi +\egroup} +\let\eqe@insert@more@content\relax +\def\gobtodot#1.#2\@nil{\def\intPrt{#1}\def\fracPrt{#2}} +% \end{macrocode} +% \DescribeMacro{\eqe@makeVgrid} A command that is executed when the document author expands \cs{fillTypeGrid}. +% The command itself draws vertical rule lines, which intersect with horizontal +% rule lines to form a grid. +% When \cs{fillTypeGrid} is active, \cs{makeVgrid} is \cs{let} +% to \cs{eqe@makeVgrid}. \cs{makeVgrid} appears twice in each of the macros +% \cs{vspaceFillerLines} and \cs{eq@linesXPgs}. The first instance of \cs{makeVgrid} +% draws the vertical line, assuming there is no page break. If there is a page break, +% the second instance of \cs{makeVgrid} continues to draw vertical lines with the correct +% height and number. To make the grid break across a page, the low level command +% \cs{makeRoomForProb} was modified; now prior and post actions (\cs{priorPNPAction} and \cs{priorPNPAction}) +% can be defined. \medskip +% +% \noindent The \cs{dbMrk} is used to debug this portion of the code, view the debugging marks +% by setting \cs{ifeqedb} to true. +% \changes{v5.0a}{2017/11/14}{Placed \cs{eqe@makeVgrid} in a group, \string\cs{count0} +% was leaking out.} +% \begin{macrocode} +\def\dbMrk#1{\textsf{\footnotesize#1}} +\@ifundefined{ifeqedb}{\newif\ifeqedb \eqedbfalse}{} +% \end{macrocode} +% \noindent\DescribeMacro{\fillerCustomBg}\hskip-\marginparsep\darg{\ameta{alt-bg}} +% Add a custom background feature, only available when the key \texttt{bgonly} is active. +% The argument \ameta{alt-bg} uses \texttt{\#1} and \texttt{\#2} to refer to the width +% and height of the work area. Use \DescribeMacro{\resetFillerCustomBg}\cmd{\resetFillerCustomBg} +% to reset the method of coloring the background to its default method. +% \changes{v5.0d}{2017/11/19}{Added a custom background feature} +% \begin{macrocode} +\def\fillerCustomBg#1{\def\fillerBgIm@ge##1##2{#1}} +\def\resetFillerCustomBg{\let\fillerBgIm@ge\@empty} +\resetFillerCustomBg +% \end{macrocode} +% \DescribeMacro{\gridIndentAdj}\hskip-\marginparsep\darg{\ameta{dimen}} is an adjustment +% in the horizontal positioning of the vertical lines of the grid. Under normal +% conditions, \cs{gridIndentAdj} is not needed. If the \env{exam} environment +% is embedded in environments that change some basic parameters, the alignment +% of the grid may not be right, in which case you can use +% \cs{gridIndentAdj} to shift the grid horizontially. +% \begin{macrocode} +\def\gridIndentAdj#1{\def\@rgi{#1}\ifx\@rgi\@empty + \let\gridIndent@dj\relax\else % dps4 + \setlength{\@tempdima}{#1}\edef\gridIndent@dj{\the\@tempdima}\fi} +\let\gridIndent@dj\relax +\def\eqe@makeVgrid{\begingroup + \@tempcnta=\fl@nRows\relax + \advance\wlVspace\flfboxrule % dps25 + \setlength{\@tempdima}{\eqe@fillwidth}% + \setlength{\@tempdimb}{\wlVspace}% + \edef\eqe@tmp{\strip@pt\@tempdimb}% + \expandafter\gobtodot\eqe@tmp.\@nil + \divide\@tempdima by\intPrt\relax + \dimen2=\@tempdima + \dimen4=1pt + \advance\dimen2 by 0.5\dimen4 + \divide\dimen2 by \dimen4 + \multiply\dimen2 by \dimen4 + \edef\eqe@tmp{\strip@pt\dimen2}% + \expandafter\gobtodot\eqe@tmp.\@nil + \advance\@tempcnta-1\relax % dps21 + \multiply\@tempdimb\@tempcnta + \edef\eqe@HOfVrule{\the\@tempdimb}% dps7 + \ifKV@eqefillLines@topline % dps21 + \advance\@tempdimb\wlVspace + \advance\@tempdimb\flfboxrule + \edef\eqe@HOfVruleFrstRow{\the\@tempdimb}% + \def\eqe@setVRule{\vbox + to\eqe@HOfVruleFrstRow\relax{\gridVLineFill}}% dps8 + \else + \def\eqe@setVRule{\vbox + to\eqe@HOfVrule\relax{\gridVLineFill}}% dps8 + \fi + \eqe@tempcnta=0 + \dimen2=\wlVspace + \count4=\intPrt\relax + \setlength{\dimen4}{\eqe@fillwidth}% + \multiply\dimen2by\count4 + \@whiledim \dimen2 > \dimen4 \do{% + \advance\count4by-1\relax + \edef\intPrt{\the\count4 }% + \dimen2\wlVspace + \multiply\dimen2by\count4 + }% + \dimen2\wlVspace + \if@eqalignfilllinestoleft % dps27 + \let\fl@oSmash\smash\let\fl@iSmash\relax + \else + \let\fl@iSmash\smash\let\fl@oSmash\relax + \fi + \fl@oSmash{% + \makebox[0pt][l]{\makebox[\eqe@fillwidth][l]{\fl@iSmash{% dps27 + \ifx\gridIndent@dj\relax\else + \hglue\gridIndent@dj\relax\fi + \eqe@y\ifeqedb\rlap{\dbMrk{D}}\fi % dpsj9 \eqe@y (fudge) + \rlap{\ifeqedb\rlap{\dbMrk{B}}\fi + \ifwriteVertic@lFLines % dps16 + \setlength{\@tempdima}{\eqe@fillwidth}% + \ifKV@eqefillLines@bgonly % dps11 + \ifx\fillerBgIm@ge\@empty + \ifx\eqe@BGColor\@empty\else + \rlap{\textcolor{\eqe@BGColor} + {\rule{\eqe@fillwidth}{\eqe@HOfVruleFrstRow}}}\fi + \else + \rlap{\fillerBgIm@ge{\eqe@fillwidth}{\eqe@HOfVruleFrstRow}}\fi + \else + \dimen2=\wlVspace + \dimen0=0pt + \@whilenum\eqe@tempcnta<\count4\do{\rlap{\hglue\dimen0 + \ifKV@eqefillLines@outlineonly %dps10 + \ifnum\eqe@tempcnta=0 \else\let\gridVLineFill\vfill\fi\fi + \textcolor{\eq@WriteLineColor}{\eqe@setVRule % dps27 + \ifeqedb\rlap{\advance\eqe@tempcnta by1\relax\scriptsize + \raisebox{1pt}{\kern1pt\the\eqe@tempcnta}}\fi}}% + \advance\dimen0by\dimen2 + \advance\eqe@tempcnta by1 + }% dps27 + \fi % dps11 + \advance\dimen2by\flfboxrule + \ifKV@eqefillLines@bgonly\else % dps11 + \rlap{\hglue\@tempdima + \textcolor{\eq@WriteLineColor}{\eqe@setVRule + \ifeqedb\rlap{\thinspace\dbMrk{R}}\fi}}% + \ifKV@eqefillLines@outlineonly %dps10 + \makebox[0pt][l]{\makebox[\eqe@fillwidth]{\eqWriteLine}}%dps10 + \fi + \ifKV@eqefillLines@topline% dps7 + \ifgridpgbrk\@tempdima\eqe@HOfVruleFrstRow\relax % dps21 + \raise\@tempdima\hbox{\makebox[0pt][l]{% + \makebox[\eqe@fillwidth]{\eqWriteLine}}}% + \global\gridpgbrkfalse + \fi + \fi + \fi + \ifx\eqefillLines@outlineonlystar\@empty\else % dps26 + \global\let\eqefillLines@outlineonlystar\@empty + \global\KV@eqefillLines@outlineonlyfalse + \fi + \ifx\eqefillLines@bgonlystar\@empty\else % dps26 + \global\let\eqefillLines@bgonlystar\@empty + \global\KV@eqefillLines@bgonlyfalse + \fi + \fi % ifwriteVertic@lFLines + \eqe@insert@more@content + }% rlap + }% smash (fl@iSmash) +}}}% makeboxes and \fl@oSmash + \endgroup +}% \eqe@makeVgrid +% \end{macrocode} +% In preparation for the \opt{flextended} option, we define several commands and one environment +% that emit a package warning if the \opt{flextended} option is not taken. +% \begin{macrocode} +\def\turnfl@nskeyMsg{\PackageWarning{eqexam} + {You must first take the flextended\MessageBreak + option for this command to have any\MessageBreak effect}} +\def\turnflanskeyOn{\turnfl@nskeyMsg} +\def\priorw@Msg{\PackageWarningNoLine{eqexam} + {The priorworkarea environment does nothing\MessageBreak + without the flextended option. All such content\MessageBreak in these + environments are absorbed}\global\let\priorw@Msg\@empty} +\newenvironment{priorworkarea}{\priorw@Msg + \setbox\eqe@nskeyflsplit\vbox\bgroup} + {\egroup\setbox\eqe@nskeyflsplit\box\voidb@x} +\let\turnflanskeyOff\turnflanskeyOn +\newif\ifflfrstsplit \flfrstsplittrue +\newif\ifeqe@flnosolns \eqe@flnosolnsfalse +\def\turnflnosolnsOn{\eqe@flnosolnstrue\turnflanskeyOn} +\def\turnflnosolnsOff{\eqe@flnosolnsfalse\turnflanskeyOn} +%\let\turnflnosolnsOn\turnflanskeyOn +%\let\turnflnosolnOff\turnflanskeyOn +\newdimen\flfboxrule \flfboxrule=.4pt +\def\tweakBreakPoint#1{\def\@rgi{#1}\ifx\@rgi\@empty + \gdef\twe@kBre@kPoint{0pt}\else + {\setlength{\@tempdima}{#1}% + \xdef\twe@kBre@kPoint{\the\@tempdima}}\fi} +\def\twe@kBre@kPoint{0pt} +% \end{macrocode} +% When \opt{flextended} option is not loaded, we make a minimal definition +% of \cs{eq@b@ddCodeSpecial}. This redefinition is needed when \texttt{bgonly} +% is in effect. +% \begin{macrocode} +\def\eq@b@ddCodeSpecial#1{\if@eqlinedfiller + \ifKV@eqefillLines@bgonly\leavevmode + \vskip-\baselineskip\kern\lineskip\fi\fi#1} +% \end{macrocode} +% For debug, or whatever reason, \DescribeMacro\flSeparateCutNames +% \cs{flSeparateCutNames} gives each flx cut file a distinct +% name. +% \begin{macrocode} +\def\flSeparateCutNames{\def\fl@CutName{flx\fl@Cnt-\jobname.cut}} +% +%<*flextended> +% \end{macrocode} +% \subsection{Utility commands used with the \texttt{flextended} option} +% \begin{macrocode} +\def\fls@vebaselinelineskip{% dps22 + \xdef\flbaselineskip{\the\baselineskip}} +\def\fl@Cnt{0} +\def\fl@CutName{flx-\jobname.cut} +\def\flwriteexsol@fter{% dpsj23 + \ifx\exsolafter\@empty + \immediate\write\verbatim@out{\string\ignorespaces}% dpsj23 + \else + \immediate\write\verbatim@out{\string\exsolafter + \string\space\string\ignorespaces}% + \fi +} +\def\fl@getcontent#1{\begingroup + {\count0=\fl@Cnt\relax + \advance\count0by1\relax + \xdef\fl@Cnt{\the\count0 }}% +% \let\save@wlog\wlog\let\wlog\@gobble +% \let\save@message\message\let\message\@gobble + \global\let\verbatim@out\CommentStream + \immediate\openout\verbatim@out=#1 + \ifwithinparts + \ifx\istabularexer\eq@YES + \immediate\write\verbatim@out{\string\hfuzz\string\hsize}% + \immediate\write\verbatim@out{\string\minipage[t]{\string\hsize}}% + \ifanswerkey + \immediate\write\verbatim@out{\string\expandafter + \string\noindent\string\eqSolnExCmds}% dps23 + \flwriteexsol@fter + \else + \immediate\write\verbatim@out{\string\expandafter + \string\noindent\string\priorWorkAreaCmds + \string\ignorespaces}% dps23 + \fi + \else + \ifanswerkey\flwriteexsol@fter\fi + \fi + \else + \ifanswerkey\flwriteexsol@fter\fi + \fi + \verbatimwrite +} +\def\fl@vsplitandplace#1{% + \iffl@firstpass + \global\setbox\eqe@nskeyflsplit\color@vbox + \normalbaselines + \predisplaypenalty=-50 + \postdisplaypenalty=-50 + \setlength{\hsize}{\eqe@fillwidth}% + \expandafter\noindent % dpsj23 + \ifanswerkey\expandafter\eqSolnExCmds\else + \expandafter\priorWorkAreaCmds\fi + \ignorespaces\input{#1}\fls@vebaselinelineskip + \color@endbox\global\fl@firstpassfalse\fi + \@tempdima\eqe@HOfVrule\relax +% \end{macrocode} +% I'm getting a black box when there is one line left on the second page +% and there is less than one line of text. The following three lines attempt to get +% that last line to appear when there is enough room for it. +% \changes{v5.1c}{2018/01/31}{Added additional lines to get a better break point} +% \begin{macrocode} + \advance\@tempdima\flfboxrule + \advance\@tempdima\lineskip + \ifflfrstsplit\else\advance\@tempdima\wlVspace\fi + \advance\@tempdima\maxdepth + \advance\@tempdima by\twe@kBre@kPoint\relax + \eq@tmplengthB\@tempdima % target height + \splittopskip\wlVspace + \splitmaxdepth\maxdepth + \advance\splitmaxdepth by\twe@kBre@kPoint\relax + \setbox\eq@pointbox=\copy\eqe@nskeyflsplit + \setbox\eqe@nskeyfltop=\vsplit\eq@pointbox to \@tempdima + \setbox\eqe@nskeyfltop=\vbox{\unvbox\eqe@nskeyfltop}% + \ifvoid\eq@pointbox\else + \setlength{\@tempdimb} + {\eq@tmplengthB-\dp\eqe@nskeyfltop}% + \ifdim\@tempdimb<0pt + \@tempdimb=-\@tempdimb + \ifdim\@tempdimb>\maxdepth + \advance\@tempdima-\flbaselineskip\relax + \else + \fi + \else + \setbox\eq@pointbox=\copy\eqe@nskeyflsplit + \advance\@tempdima by\flbaselineskip\relax + \setbox\eqe@nskeyfltop=\vsplit\eq@pointbox to \@tempdima + \setbox\eqe@nskeyfltop=\vtop{\unvbox\eqe@nskeyfltop}% + \setlength{\@tempdimb}{\eq@tmplengthB-\dp\eqe@nskeyfltop}% + \ifdim\@tempdimb<0pt % too much + \advance\@tempdima-\flbaselineskip\relax + \else + \fi + \fi + \fi + \splittopskip\wlVspace + \lineskip1pt + \setbox\eq@pointbox=\copy\eqe@nskeyflsplit + \global\setbox\eqe@nskeyfltop=\vsplit\eqe@nskeyflsplit to \@tempdima + \global\setbox\eqe@nskeyfltop\vtop{\unvbox\eqe@nskeyfltop\vskip0pt}% + \ifvoid\eqe@nskeyflsplit + \ifeqedb\llap{Bot}\fi + \ifeqedb\raise\eqe@HOfVrule\llap{Top}\fi + \ifeqedb\llap{V\qquad}\fi + \ifflfrstsplit\global\flfrstsplitfalse + \ifeqedb\llap{FP\hskip.5in}\fi + \rlap{\raisebox{\eqe@HOfVrule+\flfboxrule+\lineskip} + {\vtop{\vsize=\eqe@HOfVrule\relax + \unvbox\eqe@nskeyfltop\vfil}}}\else + \ifeqedb\llap{SP\hskip.5in}\fi + \rlap{\raisebox{\eqe@HOfVrule+\flfboxrule+\wlVspace+\lineskip} + {\vtop{\vsize=\eqe@HOfVrule\relax + \unvbox\eq@pointbox\vfil}}}% + \global\setbox\eqe@nskeyflsplit\box\voidb@x + \fi + \else + \ifeqedb\llap{Bot}\fi + \ifeqedb\raise\eqe@HOfVrule\llap{Top}\fi + \ifeqedb\llap{nV\qquad}\fi + \ifflfrstsplit\global\flfrstsplitfalse + \ifeqedb\llap{FP\hskip.5in}\fi + \rlap{\raisebox{\eqe@HOfVrule+\flfboxrule+\lineskip} + {\vtop{\vsize=\eqe@HOfVrule\relax + \unvbox\eqe@nskeyfltop\vfil}}}\else + \ifeqedb\llap{SP\hskip.5in}\fi + \rlap{\raisebox{\eqe@HOfVrule+\flfboxrule+\wlVspace+\lineskip} + {\vtop{\vsize=\eqe@HOfVrule\relax +% \end{macrocode} +% To have the filler lines/grid with prior and solution content to space +% more than one page, we unbox \cs{eqe@anskeyfltop} but do not void it. +% \begin{macrocode} + \unvbox\eqe@nskeyfltop\vfil}}}% +% \unvbox\eq@pointbox\vfil}}}% +% \global\setbox\eqe@nskeyflsplit\box\voidb@x + \fi + \fi + \setbox\eq@pointbox\box\voidb@x +% \gdef\twe@kBre@kPoint{0pt}% dpsj21 +} +% \end{macrocode} +% +% \subsection{Filler lines with \texttt{answerkey} option} +% +% When using the \opt{flextended} option and the +% \cs{turnflanskeyOn} command, we always use the grid filler type. +% In the case of the basic filler types of line, dash, dots, and blank, +% the code threads passes to \cs{makeVgrid}, but in the case of the +% \opt{answerkey} option, \cs{makeVgrid} writes no vertical lines. Hopefully, +% the spacing between the statement of the question and the solution are then +% consistent. +% \begin{macrocode} +\let\turnfl@nskeyOnOff\relax +% \end{macrocode} +% The \DescribeMacro{\turnflanskeyOn}\cs{turnflanskeyOn} command turns \emph{on} the +% feature of superimposing the solution over the filler lines. Does nothing unless +% the \opt{answerkey} option is in force. +% \begin{macrocode} +\def\turnflnosolnsOn{\eqe@flnosolnstrue} +\def\turnflnosolnsOff{\eqe@flnosolnsfalse} +\def\turnflanskeyOn{% + \def\turnfl@nskeyOnOff{% + \ifanswerkey + \ifx\makeVgrid\relax % already in grid mode, do nothing + \ifwriteVertic@lFLines\KV@eqefillLines@toplinefalse\fi % dps16 + \writeVertic@lFLinesfalse + \let\makeVgrid\eqe@makeVgrid % dpsj5 + \fi % dps17 + \let\eqe@insert@more@content\eqe@insertSolns % dpsj5 + \eqe@flextendedtrue % dps16 + \fillTypeGrid % dps16 + \global\let\eq@insertverticalspace\eq@YES + \global\vspacewithsolnstrue + \fi + }% +} +% \end{macrocode} +% The \DescribeMacro{\turnflanskeyOff}\cs{turnflanskeyOff} command turns \emph{off} the +% feature of superimposing the solution over the filler lines. Does nothing unless +% the \opt{answerkey} option is in force. +% \begin{macrocode} +\def\turnflanskeyOff{% + \def\turnfl@nskeyOnOff{% + \ifanswerkey + \writeVertic@lFLinestrue + \eqe@flextendedfalse + \let\eq@insertverticalspace\eq@NO + \@eqlinedfillerfalse + \global\let\eqe@insert@more@content\relax + \global\let\eq@insertverticalspace\eq@YES + \ifvspacewithsolns\else + \global\vspacewithsolnsfalse\fi + \global\displayworkareafalse + \fi + }% +} +\turnflanskeyOff +% \end{macrocode} +% \begin{macrocode} +\let\p@ssToSolns\relax % dps30 +\def\eqe@insertSolns{\clubpenalty=50 + \widowpenalty=50 \vbadness=10000 + \fl@vsplitandplace{s\fl@CutName}} +\def\eq@b@ddCodeSpecial#1{\global\gridpgbrkfalse % dpsj15 + \global\let\eq@e@ddCodeSpecial\relax + \gdef\eqe@flnexti{#1}% dpsj5 + \if@eqlinedfiller + \ifKV@eqefillLines@bgonly\leavevmode + \vskip-\baselineskip\kern\lineskip\fi % dpsj11 + \ifKV@eqefillLines@outlineonly\leavevmode + \vskip-\baselineskip\kern\lineskip\fi + \ifanswerkey %\turnfl@nskeyOnOff % dps16 + \ifeqe@flextended + \ifcont@nnot + \ifx\makeVgrid\relax + \gdef\p@ssToFLs{\turnfl@nskeyOnOff + \let\eqe@insert@more@content\eqe@insertSolns + \writeVertic@lFLinesfalse + \KV@eqefillLines@toplinefalse + \let\makeVgrid\eqe@makeVgrid + }% + \else + \gdef\p@ssToFLs{\turnfl@nskeyOnOff + \let\eqe@insert@more@content\eqe@insertSolns + \writeVertic@lFLinestrue}% + \fi + \gdef\eqe@flnexti{\turnfl@nskeyOnOff + \global\fl@firstpasstrue % dpsj5 + \p@ssToSolns + \global\gridpgbrkfalse + \eqe@setStartSolns +% \end{macrocode} +% We are with a good two deep, but we need to pass \cs{vspacewithkeyOff}, +% so we save its current state and declare a global call to +% \cs{vspacewithkeyOff}. The state is restored by \cs{eq@e@ddCodeSpecial}. +% \begin{macrocode} + \xdef\kdvsp@SAVE{\ifkeepdeclaredvspacing + true\else false\fi}% + \gdef\kdvsp@Restore{\@nameuse + {keepdeclaredvspacing\kdvsp@SAVE}% + \gdef\twe@kBre@kPoint{0pt}\global + \let\kdvsp@Restore\relax}% dpsj21 + \expandafter\global\vspacewithkeyOff + \vbadness=10000 + \fl@getcontent{s\fl@CutName}}% + \gdef\eq@e@ddCodeSpecial{\endverbatimwrite\endgroup +% \kdvsp@Restore % dpsj20 + \ifwithinparts\ifx\istabularexer\eq@YES + \immediate\write\verbatim@out{\string\endminipage}\fi\fi + \immediate\closeout\verbatim@out + \global\let\eq@e@ddCodeSpecial\relax + }% + \else + \PackageWarningNoLine{eqexam}{For solutions to appear + using filler lines\MessageBreak + (with flextexded and answerkey options),\MessageBreak + you must first expand \string\turnContAnnotOn\MessageBreak + prior to line \the\inputlineno.\MessageBreak + Switching to \string\useFillerDefault}% + \useFillerDefault + \let\eq@insertverticalspace\eq@NO + \fi + \fi + \fi + \fi + \eqe@flnexti +}% dpsj4 +% \end{macrocode} +% \begin{macrocode} +% \end{macrocode} +% \subsection{Filler lines with \texttt{nosolutions} option} +% Just as we can supply filler lines for the \texttt{answerkey} option, we can do the +% same for the \texttt{nosolutions} option and superimpose content on the filler lines. +% \changes{v5.0g}{2017/12/05}{Added filler lines with \string\texttt{nosolutions} option} +% \begin{environment}{priorworkarea} +% \changes{v5.0g}{2017/12/05}{Added the \string\texttt{priorworkarea} environment} +% Place the \env{priorworkarea} environment \emph{prior to} the solution environment. It has not +% arguments, but gets dimensions from the \env{solution} environment that follows. +% \begin{macrocode} +\def\eqe@priorw@content{% + \clubpenalty=50 % dps15 + \widowpenalty=50 + \vbadness=10000 + \fl@vsplitandplace{p\fl@CutName}% +}% +\renewenvironment{priorworkarea}{\par + \ifx\solutionparshape\@empty\else % dps28 + \pushEnvir + \everypar{}\if@eqalignfilllinestoleft\else + \parshape=1 \leadinIndent \linewidth\fi + \popEnvir + \fi + \global\let\p@ssToFLs\relax + \global\let\p@ssToSolns\relax + \vspacewithkeyOff + \ifeq@nosolutions\else\sloppy\fi + \def\eqe@flnexti{\eqSavedComment}% + \ifeqe@flnosolns\ifdisplayworkarea + \def\eqe@flnexti{\fl@getcontent{p\fl@CutName}}\fi\fi % dpsj21 + \gdef\eqe@flnextii{\endeqSavedComment}%dps11 + \ifeqe@flnosolns\ifdisplayworkarea + \gdef\eqe@flnextii{\endverbatimwrite\endgroup + \ifwithinparts\ifx\istabularexer\eq@YES + \immediate\write\verbatim@out{\string\endminipage}\fi\fi + \immediate\closeout\verbatim@out}\fi\fi + \eqe@flnexti +}{% + \eqe@flnextii + \ifcont@nnot + \ifeqe@flnosolns + \ifdisplayworkarea + \ifx\eq@insertverticalspace\eqe@YES + \ifx\makeVgrid\relax + \gdef\p@ssToFLs{% + \let\eqe@insert@more@content\eqe@priorw@content + \writeVertic@lFLinesfalse + \KV@eqefillLines@toplinefalse + \let\makeVgrid\eqe@makeVgrid}% + \else + \gdef\p@ssToFLs{% + \let\eqe@insert@more@content\eqe@priorw@content + \writeVertic@lFLinestrue}% + \fi + \gdef\kdvsp@Restore{\gdef\twe@kBre@kPoint{0pt}\global + \let\kdvsp@Restore\relax}% dpsj21 + \fi + \fi + \else + \global\setbox\eqe@nskeyflsplit\box\voidb@x + \global\setbox\eqe@nskeyfltop\box\voidb@x + \fi + \else + \PackageWarningNoLine{eqexam}{For priorworkarea to appear + using filler lines\MessageBreak + (with flextexded and nosolutions options),\MessageBreak + you must first expand \string\turnContAnnotOn\MessageBreak + prior to line \the\inputlineno.\MessageBreak + Switching to \string\useFillerDefault}% + \gdef\p@ssToSolns{\useFillerDefault}% + \fi +} +% \end{macrocode} +% \end{environment} +% \begin{macrocode} +% end of segment +% +%<*package> +% \end{macrocode} +% Set the \textsf{eqexam} page style, if not otherwise indicated. +% \begin{macrocode} +\ifeqfortextbook\else + \if@bypasseqexamheading\else +\pagestyle{eqExamheadings}\fi\fi +% \end{macrocode} +% \begin{macrocode} +% +%<*textbook> +\ProvidesFile{eqtextb.def} + [2016/01/18 v4.6 Cmds used by the fortextbook option (dps)] +% \end{macrocode} +% +% \section{Concerning the \protect\texttt{fortextbook} option}\label{fortextbook} +% +% What are my goals/desired features? Modern (U.S.) textbooks---at least +% the ones I'm familiar with---consist of some or all of the following +% resources: +% \begin{itemize} +% \item \textbf{Student Edition}: Answers to odd-numbered problems +% appear in the back of the text. +% \item[] We need to have a scheme where odd-numbered problems, under suitable options, +% are compiled. \textbf{Goal:} It does not need to be restricted to odd-numbered, however, need to latex only +% those problems that meet the ``include'' criteria. +% \item[] For chapter review problem sets, odd-number problems are have solutions in the +% back of the book. +% \item[] For chapter quizzes, odd-numbered (optionally all) solutions +% are in the back of the book. +% +% \item \textbf{Instructor Edition}: Answers to all problems appear in +% the back of the book. Answers may also appear in the body of the text, +% in the margins of the text, or immediately after the statement of the +% problem. If the answer is too long, there is a cross-reference to the +% solution in the appendix. +% \item[] Some publishers I've seen have wide margins where additional material can be inserted +% (historical sketches, instructor notes, pictures, etc.). In these margins, the answers to the problems +% can appear. Other publishers put answer immediately +% following the questions. The latter is easy to do; just have a macro, say \verb!\ANS{$12.5$}!, which only +% expands when the ``instructor'' option is used. +% \item \textbf{Student Solution Manual}: Contains solutions to all +% odd-problems, as well as any review problems and chapter quizzes. +% Some publishers include all solutions to chapter quizzes. +% \item[] A solution manual is a separate publication. This document would be +% created by latexing one or more of the auxiliary file (\texttt{.sol}) +% These files might have to be edited before the final compile. We include only the solutions +% that meet the include criteria (i.e., odd-numbered ones). +% \item[] The current features of \textsf{eqexam} is what is needed here. The authors need only +% include solutions to each problem in a \texttt{solution} environment. Now, I realize that often times +% the authors create the solutions, but someone else, possibly a grade student or contractor, solves the problems. +% In the latter case, the authors would probably not like to turn over the source files to the one solving and typesetting +% the problems. +% \item \textbf{Instructor Solution Manual}: Contains solutions to all +% problems, review problems, chapter quizzes. +% \item[] Similar comments for the instructor solution manual. +% \end{itemize} +% Some other thoughts by a contributor: +% \begin{itemize} +%\item Often there is a diagram or graphic within the problem -- this has +% some figure caption and after the running counter of the figure it is +% named the NUMBER of the problem (cross-reference to the problem number) +% +%\item Often the probs with soln are setup in two-column style. +% +%\item Often the PROBLEM NUMBER has a special formatting (not only bold and +% black), maybe with a colorframebox around or some special formatting +% from the author +% +%\item Of course I have seen in some EXAMPLES that there is a wide margin +% to put in additional graphics etc. setup in two-side style -- wide left +% margin on even pages, wide right margins on odd pages. Here as well +% are captions setup and cross-references. +%\end{itemize} +% +%\subsection{Setting options with \texorpdfstring{\cs{textbookOpts}}{\textbackslash{textbookOpts}}} +% \begin{macro}{\textbookOpts} +% \begin{macro}{marginans} +% \begin{macro}{inlineans} +% \begin{macro}{marginsonleft} +% \begin{macro}{ssols} +% \begin{macro}{lsols} +% We set up a command for setting the options for the \texttt{fortextbook} option. +% \begin{macrocode} +\define@boolkey{eqe@tbopts}[is]{instred}[true]{} +\define@boolkey{eqe@tbopts}[is]{studented}[true]{% + \ifisstudented +% \end{macrocode} +% Now let's try to filter out the even-numbered problems for the student edition. +% \begin{macrocode} + \tbfilterOutEvenNums +% \end{macrocode} +% The above command is normally \cs{let} to \cs{@gobble}. +% \begin{macrocode} + \fi +} +% \end{macrocode} +% This code is executed in \cs{exambegdef}, the start up code of the \texttt{exam} environment. +% This enables problems with fill-ins, true/false, or multiple choice, to have the answer appear +% in the space provided. +% \begin{macrocode} +\def\tb@beginexam@code{% + \ifisinstred\answerkeytrue\eq@proofingtrue\fi} +% \end{macrocode} +% \verb!\eqEXt{\theeqquestionnoi}! and \verb!\endeqEXt\tok1\tok2! enclose each +% solution, \cs{tbfilterOutEvenNums} redefines \cs{eqEXt} to gobble everything, +% when the page number is even, through \cs{endeqEXt} and the two tokens it follows. +% This leaves only the odd-numbered problems. +% \begin{macrocode} +\newcommand{\tbfilterOutEvenNums}{% +% \end{macrocode} +%\changes{v3.3}{2013/04/07}{\textsf{exerquiz} changed \cs{eqEXt} to two variables, so +% we make the same change here.} +% \textsf{exerquiz} changed \cs{eqEXt} to two variables, so +% we make the same change here +% \begin{macrocode} + \def\eqEXt##1##2{\ifodd##1\let\eqe@next\relax\else + \def\eqe@next{\gobbletoEndEXt}\fi\eqe@next}% +} +\newcommand{\tballowAllNums}{% +% \end{macrocode} +%\changes{v3.3}{2013/04/07}{\textsf{exerquiz} changed \cs{eqEXt} to two variables, so +% we make the same change here.} +% \textsf{exerquiz} changed \cs{eqEXt} to two variables, so +% we make the same change here +% \begin{macrocode} +% \let\eqEXt\@gobble + \let\eqEXt\@gobbletwo + \let\endeqEXt\relax +} +\define@boolkey{eqe@tbopts}[is]{marginans}[true]{} +\define@boolkey{eqe@tbopts}[is]{inlineans}[true]{} +\define@boolkey{eqe@tbopts}[]{marginsonleft}[true] +% \end{macrocode} +% If margins are always on left, we turn off switching of margin notes +% as placed by \cs{marginpar}, and use \cs{reversemarginpar} to get them +% on the left. +% \begin{macrocode} + {\@mparswitchfalse\reversemarginpar} +\define@boolkey{eqe@tbopts}[show]{ssols}[true]{} +\define@boolkey{eqe@tbopts}[show]{lsols}[true]{% + \ifshowlsols\let\tb@soln@choice\tb@showlsols\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% The default settings are \texttt{true} for \texttt{studented} and +% \texttt{false} for \texttt{instred}. +% +% \begin{macrocode} +\newcommand{\textbookOpts}[1]{\setkeys{eqe@tbopts}{#1}% +% \end{macrocode} +% We do not allow both \texttt{instred} and \texttt{studented} to be true. +% \begin{macrocode} + \ifisinstred\global\isstudentedfalse\else + \ifisstudented\global\isinstredfalse + \fi\fi +% \end{macrocode} +% \changes{v3.0v}{2012/03/14}{Include \cs{tbMakeFinalCalcs} at end of +% \cs{textbookOpts}} +% Added this part in in case \cs{textbookOpts} comes after \cs{marparboxwidth}. +% \begin{macrocode} + \ifdim\tbmarparboxwidth=1sp\else + \expandafter\tbMakeFinalCalcs\fi +} +% \end{macrocode} +% As mentioned above, the default settings are \texttt{true} for \texttt{studented} and +% \texttt{false} for \texttt{instred}. +% \begin{macrocode} +\isstudentedtrue +\isinstredfalse +\ismarginansfalse +\isinlineansfalse +% \end{macrocode} +% The command is available only in the preamble. +% \begin{macrocode} +\@onlypreamble{\textbookOpts} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\turnOffMarAnsOnAnsInline} +% \begin{macro}{\turnOnMarAnsOffAnsInline} +% \begin{macro}{\toggleInstrAns} +% These three command may not be useful in the creation of a textbook, but +% you never know, I used them in my demo doc \texttt{fortextbook.tex} to turn +% off and on the display of the answers (change margin to inline, change inline to margin, +% and toggle margin and inline). +% \begin{macrocode} +\newcommand{\turnOffMarAnsOnAnsInline}{% + \global\ismarginansfalse\global\isinlineanstrue + \insMidMarg{\global\ismarginansfalse + \global\isinlineanstrue}% +} +\newcommand{\turnOnMarAnsOffAnsInline}{% + \global\ismarginanstrue\global\isinlineansfalse + \insMidMarg{\global\ismarginanstrue + \global\isinlineansfalse}% +} +\newcommand{\toggleInstrAns}{% + \ifisinstred\ifismarginans + \global\ismarginansfalse\global\isinlineanstrue + \insMidMarg{\global\ismarginansfalse + \global\isinlineanstrue}% + \else + \global\ismarginanstrue\global\isinlineansfalse + \insMidMarg{\global\ismarginanstrue + \global\isinlineansfalse}% + \fi\fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Macros to display answers/shortsolns} +% In this section, we develop some commands to display answers or short solutions. These +% would appear if \texttt{instred=true}, in-line, or in the margins. +% \begin{macro}{\ANS} +% Let us begin by creating a simple macro for saving an answer. The answer is displayed ``in-line.'' +% No verbatim-type text allowed, no unbalanced braces unless escaped. \cs{ANS} displays the answer +% if the \texttt{instred} option of the \texttt{eqe@tbopts} family, i.e., by executing +% +% \begin{macro}{\bGrpANS} +% \begin{macro}{\eGrpANS} +% Two macros used to group answers in the margins. +%\changes{v3.0q}{2011/14/22}{Added \cs{bGrpANS} and \cs{eGrpANS}} +% \begin{macrocode} +\newif\ifWithinANSGrp\WithinANSGrpfalse +\newif\ifftb@isANSListOpen\ftb@isANSListOpenfalse +\newcommand{\bGrpANS}{% + \if\probstar*\else + \PackageError{eqexam}{Use of \string\bGrpANS\space + only applies\MessageBreak to the problem* environment}{Please + remove this \string\bGrpANS.}% + \fi + \ifWithinANSGrp + \global\WithinANSGrpfalse + \let\tb@next\relax + \PackageError{eqexam}{\string\bGrpANS\space already open} + {You issued an earlier \string\bGrpANS, + but did not close it.}% + \else + \global\WithinANSGrptrue + \global\ftb@isANSListOpenfalse + \def\tb@next{\ANS}% + \fi + \tb@next +} +\newcommand{\eGrpANS}{% + \if\probstar*\else + \PackageError{eqexam}{Use of \string\eGrpANS\space + only applies\MessageBreak to the problem* environment}{Please + remove this \string\eGrpANS.}% + \fi + \ifWithinANSGrp + \global\WithinANSGrpfalse + \def\tb@next{\ANS}% + \else + \let\tb@next\relax + \PackageError{eqexam}{\string\eGrpANS\space already closed} + {You've issued two consecutive \string\eGrpANS\space + commands,\MessageBreak either remove this one + or the previous one.}% + \fi + \tb@next +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \cs{ANS} begin by checking to see if there is a star that follows the command, +% this is used for inline answers. If \texttt{*} is present, we do not put the +% answer inline, but will put it in the margins if the option call for it. +% \begin{macrocode} +\newcommand{\ANS}{\@ifstar{\let\tb@istart=1\tb@ANS} + {\let\tb@istart=0\tb@ANS}} +% \end{macrocode} +% (10/13/2011) The following is the original definition of \cs{tb@ANS} before the creation of +% the commands \cs{bGrpANS} and \cs{bGrpANS}. We keep this to revert to this definition +% if this new feature causes problems. +%\begin{verbatim} +%\newcommand{\tb@ANS}[1]{% +% \ifisinstred +% \ifisinlineans\if\tb@istart0\ANSFmt{\theeqquestionnoi}{#1}\fi\fi +% \ifismarginans +% \edef\eqe@prehold{\noexpand\par\kern0pt\noindent +% \if\probstar*% +% \noexpand\begin{eqeList}[\tb@wparts@len]{% +% \noexpand\eqedsplyOnlyFrst{\theeqquestionnoi}% +% {\thepartno}\noexpand\eqe@hspannerMrg +% \noexpand\makebox[\noexpand\tbmrgpartwdth]% +% {\noexpand\tb@mrgPartFmt{\thepartno}}}% +% \else +% \noexpand\begin{eqeList}% +% {\noexpand\tb@mrgDigitFmt{% +% \theeqquestionnoi\eqe@decPointMrg}}% +% \fi +% }\expandafter\insMidMarg% +% \expandafter{\eqe@prehold#1\end{eqeList}}% +% \fi +% \fi +%} +%\end{verbatim} +% \DescribeMacro{\ftb@defineInsSpan} is used when there is an optional +% argument for \cs{ANS}. It formats the range of parts, +% for example, (a)--(c). This macro can be redefined, I suppose, to meet +% the needs of the author. +% \begin{macrocode} +\def\ftb@defineInsSpan#1{\def\ftb@argi{#1}\ifx\ftb@argi\@empty + \def\ftb@InsSpan{}\else\ftb@spanPrts{#1}% + \def\ftb@InsSpan{\noexpand\hspace{-\labelsep}% + \noexpand\textcolor{MRGPARTcolor}{--}\noexpand + \makebox[\noexpand\tbmrgpartwdth]{\noexpand + \tb@mrgPartFmt{\ftb@EndSpanPrts}}\eqe@hspannerMrg}\fi +} +% \end{macrocode} +% \DescribeMacro{\ftb@spanPrts} calculates the letter of the end of the +% range. \texttt{\#1} is passed by \cs{ANS} (\cs{tb@ANS}, actually). For +% example if we have \verb!\ANS[2]{...}!, \texttt{\#1=2}. +% \begin{macrocode} +\def\ftb@spanPrts#1{{% + \advance\value{partno}by#1\relax + \xdef\ftb@EndSpanPrts{\thepartno}}% +} +% \end{macrocode} +% \DescribeMacro{\ftb@EqeListPrtsFmt} is the internal formatting used within the \texttt{eqeList} for the part letter. +% \begin{macrocode} +\def\ftb@EqeListPrtsFmt{\noexpand + \makebox[\noexpand\tbmrgpartwdth]{\noexpand + \tb@mrgPartFmt{\thepartno}}\nobreak +} +% \end{macrocode} +% \DescribeMacro{\ftb@OpenEqeListPrts} opens an \texttt{eqeList} environment, +% and displays the question number (optionally) and the part number. +% \begin{macrocode} +\def\ftb@OpenEqeListPrts{\noexpand + \begin{eqeList}[\tb@wparts@len]{\noexpand + \eqedsplyOnlyFrst{\theeqquestionnoi}% + {\thepartno}\noexpand\eqe@hspannerMrg\ftb@EqeListPrtsFmt}% +} +% \end{macrocode} +% \DescribeMacro{\ftb@CloseEqeList} closes the \texttt{eqeList} after +% inserting \cs{qe@prehold} and the content, \texttt{\#1}. +% \begin{macrocode} +\def\ftb@CloseEqeList#1{\expandafter\insMidMarg% + \expandafter{\eqe@prehold#1\end{eqeList}}% +} +% \end{macrocode} +% \DescribeMacro{\grpANSDelimiter} delimits the parts +% when \cs{bGrpANS}/\cs{eGrpANS} is used. May be redefined. +% \begin{macrocode} +\newcommand{\grpANSDelimiter}{\textcolor{MRGPARTcolor}{,}\space} +% \end{macrocode} +% \DescribeMacro{\tb@ANS} does the main work of \cs{ANS}. +% \begin{macrocode} +\newcommand{\tb@ANS}[2][]{% + \ifisinstred + \ifisinlineans + \if\tb@istart0\ANSFmt{\theeqquestionnoi}{#2}\fi + \fi + \ifismarginans + \ftb@defineInsSpan{#1}% +% \end{macrocode} +% We create the code that we will introduce into \cs{insMidMarg}, this will +% be introduced prior to \texttt{\#2}. +% \begin{macrocode} + \edef\eqe@prehold{% + \if\probstar*% +% \end{macrocode} +% If this question is one with parts... +% \begin{macrocode} + \ifftb@isANSListOpen +% \end{macrocode} +% If the list is already open (\cs{ifftb@isANSListOpen}), +% we just add content to the \texttt{eqeList} environment. +% \begin{macrocode} + \ftb@EqeListPrtsFmt\noexpand\eqe@hspannerMrg + \else +% \end{macrocode} +% If the list is not open, we start the \texttt{eqeList} environment +% in the usual way, this also includes the case where \cs{bGrpAns} is +% not uses, which is normally the case. +% +% \begin{macrocode} + \noexpand\par\kern0pt\noindent + \ftb@OpenEqeListPrts\ftb@InsSpan + \fi + \else +% \end{macrocode} +% This is a question without parts. +% \begin{macrocode} + \noexpand\begin{eqeList}% + {\noexpand\tb@mrgDigitFmt{% + \theeqquestionnoi\eqe@decPointMrg}}% + \fi + }% +% \end{macrocode} +% We have finished constructing \cs{eqe@prehold}. We next set +% \cs{ftb@isANSListOpen} to \texttt{true}, if \cs{WithinANSGrp} is \texttt{true}. +% \begin{macrocode} + \ifWithinANSGrp\global\ftb@isANSListOpentrue\fi +% \end{macrocode} +% If we are within an open group, we emit \cs{insMidMarg} with the +% \cs{eqe@prehold}, followed by \texttt{\#2}, and a comma-space combo, +% but \emph{we do not close} the \texttt{eqeList} environment. +% \begin{macrocode} + \ifWithinANSGrp + \expandafter\insMidMarg\expandafter + {\eqe@prehold#2\grpANSDelimiter}% + \else +% \end{macrocode} +% This is the normal case, we insert \cs{eqe@prehold}, \texttt{\#2}, and +% close the \texttt{eqeList} environment. +% +% \begin{macrocode} + \expandafter\insMidMarg% + \expandafter{\eqe@prehold#2\end{eqeList}}% + \global\ftb@isANSListOpenfalse + \fi + \fi % \ifismarginans + \fi %\ifisinstred +} +% \end{macrocode} +% End (10/13) +% \begin{environment}{eqeList} +% An environment used to format the answers in the margins, when +% \texttt{marginans} is in effect. +% \begin{macrocode} +\newenvironment{eqeList}[2][\tb@woparts@len]{\begin{list}{#2}{% + \def\argi{#1}\setlength{\labelwidth}{#1}% + \ifx\argi\tb@wparts@len + \settowidth{\labelsep}{\eqe@prtsepMrg}\else + \settowidth{\labelsep}{\eqe@hspannerMrg}\fi + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \setlength{\parskip}{0pt}\setlength{\partopsep}{0pt}% + \setlength{\topsep}{1pt}\setlength{\parsep}{0pt}% + \setlength{\itemindent}{0pt}\setlength{\itemsep}{3pt}% +}\item\relax}{\end{list}} +% \end{macrocode} +% \end{environment} +% \paragraph*{Formatting Answers and Solutions} +% \begin{macro}{\mrgDigitFmt} +% Format of the digit (and the decimal point) for the answers in the margins. +%\begin{verbatim} +%\mrgDigitFmt{\textbf{#1}} +%\mrgPartFmt{\textbf{(\hfil#1\hfil)}} +%\setMarIndents[\bfseries\normalsize\normalfont]{00}{(d)} +%\end{verbatim} +% \begin{macrocode} +\newcommand{\mrgDigitFmt}[1]{\def\tb@mrgDigitFmt##1{#1}} +\mrgDigitFmt{#1} +% \end{macrocode} +% \begin{macro}{\mrgPartFmt} +% Format of the part (including possibly the parentheses), example give above. +% \begin{macrocode} +\definecolor{MRGPARTcolor}{named}{black} +\newcommand{\mrgPartFmt}[1]{\def\tb@mrgPartFmt##1{#1}} +\mrgPartFmt{\textcolor{MRGPARTcolor}{(\hfil#1\hfil)}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{ANScolor} +% The default color of the answers that appear in the margins or inline. +% \begin{macrocode} +\definecolor{ANScolor}{rgb}{0,0,.8} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ANSFmt} +% The command that sets the format, may be redefined as needed. Used in the +% \cs{ANS} command above. +% \begin{macrocode} +\newcommand{\ANSFmt}[2]{\textcolor{ANScolor}{#2}} +% \end{macrocode} +% \end{macro} +% We have two environments that we use in three different situations: +%\begin{itemize} +% \item \texttt{eqequestions} environment: (1) Used to control the display of the +% \texttt{probset} environment within the body of the textbook; (2) used +% to control the display of the solutions ``in the back of the book.'' +% \item \texttt{eqeList} environment: Used for displaying answers in the margin of +% the book, when the appropriate options allow it. +%\end{itemize} +% We want to be able to manipulate some of the parameters of these three +% situation, independently of each other. There are several issues, setting +% what I have been calling the gutter width, and the display of the problem +% numbers. +%\par\medskip\noindent +% We define four commands for each of the three situations described above. The names +% have a pattern to them, and similarly named commands have the same use. +% +% The numbering of the problems has the pattern: \verb*!dd. (a) ! +% We provide convenience commands to give these internal macros values +% \begin{macro}{\prbDecPt} +% \begin{macro}{\prbPrtsep} +% \begin{macro}{\prbNumPrtsep} +% Basic parameters for the problems in the body of the text. +% \begin{macrocode} +\def\eqe@decPointPrb{.} % decimal point of prob number +\def\eqe@prtsepPrb{\ } % prob with parts, space after part +\def\eqe@hspannerPrb{\ } % space after prob number +\providecommand{\prbDecPt}[1]{\def\eqe@decPointPrb{#1}} +\providecommand{\prbPrtsep}[1]{\def\eqe@prtsepPrb{#1}} +\providecommand{\exPrtsep}[1]{\def\eqe@prtsepPrb{#1}} +\providecommand{\prbNumPrtsep}[1]{\def\eqe@hspannerPrb{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\solDecPt} +% \begin{macro}{\solPrtsep} +% \begin{macro}{\solNumPrtsep} +% Basic parameters for the problems in the solution sets. +% \begin{macrocode} +\def\eqedecPointSoln{.} % decimal point of prob number +\def\eqe@prtsepSoln{\ } % prob with parts, space after part +\def\eqe@hspannerSoln{\ } % space after prob number +\newcommand{\solDecPt}[1]{\def\eqedecPointSoln{#1}} +\newcommand{\solPrtsep}[1]{\def\eqe@prtsepSoln{#1}} +\providecommand{\solNumPrtsep}[1]{\def\eqe@hspannerSoln{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\mrgDecPt} +% \begin{macro}{\mrgPrtsep} +% \begin{macro}{\mrgNumPrtsep} +% Basic parameters for the problems in the margins. +% \begin{macrocode} +\def\eqe@decPointMrg{.} % decimal point of prob number +\def\eqe@prtsepMrg{\ } % prob with parts, space after part +\def\eqe@hspannerMrg{\ } % space after prob number +\newcommand{\mrgDecPt}[1]{\def\eqe@decPointMrg{#1}} +\newcommand{\mrgPrtsep}[1]{\def\eqe@prtsepMrg{#1}} +\newcommand{\mrgNumPrtsep}[1]{\def\eqe@hspannerMrg{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\setMarIndents} +% Sets some dimensions used by the \texttt{eqeList} environment. +% \cs{tb@woparts@len} is calculated and +% is used as the default gutter width in \texttt{eqeList}. \cs{tb@wparts@len} +% is used for the gutter width for the gutter width when there is a problem +% with parts. Finally, \cs{tbmrgpartwdth} in \cs{ANS} and is used for the width +% of a \cs{makebox} that enclosed the part letter. +% \begin{macrocode} +\newcommand{\setMarIndents}[3][\normalsize\normalfont]{{% + \settowidth{\@tempdima}{#1#2\eqe@decPointMrg}% + \xdef\tb@woparts@len{\the\@tempdima}% + \settowidth{\@tempdima}% + {#1#2\eqe@decPointMrg\eqe@hspannerMrg#3}% + \xdef\tb@wparts@len{\the\@tempdima}% + \settowidth{\@tempdima}{#1#3}% + \xdef\tbmrgpartwdth{\the\@tempdima}% +}} +\setMarIndents{00}{(d)} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\setSolnIndent} +% Used to set the some parameters used by \texttt{eqequestions}, in the solutions file. +% \begin{macrocode} +\newdimen\solnGutter +\newcommand{\setSolnIndent}[3][\normalsize\normalfont\bfseries]{% + {\settowidth{\@tempdima}{#1#2\eqedecPointSoln\eqe@hspannerSoln}% + \global\solnGutter\@tempdima + \settowidth{\@tempdima}{#1#3}% + \xdef\tbsolnpartwdth{\the\@tempdima}% +}} +\setSolnIndent{00}{(d)} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\setSolnMargins} +% This command is written to the solution file, and expanded when that file +% is input back in. If \cs{solnGutter} is not \texttt{0pt}, we set the length +% of \cs{eqemargin} using the current value; otherwise, we use the value +% determined by \cs{setSolnIndent}, above. +% \begin{macrocode} +\renewcommand{\setSolnMargins}[1]{% + \ifdim\solnGutter=0pt \setlength\eqemargin{#1}\else + \setlength\eqemargin{\solnGutter}\fi\ignorespaces} +%\newcommand{\defaultSolnIndent}{\gdef\solnGutter{0pt}} +\newcommand{\defaultSolnIndent}{\global\solnGutter=0pt} +\defaultSolnIndent +% \end{macrocode} +% \end{macro} +% \begin{macro}{\prbNumFmt} +% \begin{macro}{\solWoPrtsFmt} +% \begin{macro}{\solWPrtsFmt} +% We redefine \cs{exlabelformat}, \cs{exsllabelformat}, and +% \cs{exsllabelformatwp}. They are defined in such a way as +% to simply their modification through a series of simple +% formatting commands. The defaults are +%\begin{verbatim} +%\prbNumFmt{\textbf{#1}} +%\solWoPrtsFmt{\textbf{#1}} +%\solWPrtsFmt{\textbf{#1}}{(\hfil#2\hfil)} +%\end{verbatim} +% \begin{macrocode} +\renewcommand{\exlabelformat}{% + \tbprbNumFmt{\theeqquestionnoi\eqe@decPointPrb}} +% \end{macrocode} +% \cs{prbNumFmt} is the format for the number of the problems +% in the body of the text. The argument \texttt{\#1} is a symbolic +% argument for the question number. +% \begin{macrocode} +\newcommand{\prbNumFmt}[1]{\def\tbprbNumFmt##1{#1\eqe@hspannerPrb}} +\prbNumFmt{\textbf{#1}} +% \end{macrocode} +% Redefine \cs{exsllabelformat}, and \cs{exsllabelformatwp} +% \begin{macrocode} +\renewcommand{\exsllabelformat}{\string\tbsolWoPrtsFmt{% + \theeqquestionnoi\string\eqedecPointSoln}} +\renewcommand{\exsllabelformatwp}{\string\tbsolWPrtsFmt% + {\string\eqedsplyOnlyFrst{\theeqquestionnoi}{\thepartno}}% + {\thepartno}% +} +% \end{macrocode} +% \cs{solWoPrtsFmt} is the format for the number of the problems +% in the solution set. The argument \texttt{\#1} is a symbolic +% argument for the question number. \cs{solWPrtsFmt} is the format +% for a problem with parts in the solution file. \texttt{\#1} is +% symbolically the question number, and \texttt{\#2} is a +% symbolic for the part letter. +% \begin{macrocode} +\newcommand{\solWoPrtsFmt}[1]{\def\tbsolWoPrtsFmt##1{% + \makebox[0pt][r]{#1\eqe@hspannerSoln}}} +\solWoPrtsFmt{\textbf{#1}} +\newcommand{\solWPrtsFmt}[2]{\def\tbsolWPrtsFmt##1##2{% + \makebox[0pt][r]{#1\eqe@hspannerSoln}% + \makebox[\tbsolnpartwdth][l]{#2}\eqe@prtsepSoln% +}} +\solWPrtsFmt{\textbf{#1}}{(\hfil#2\hfil)} +% \end{macrocode} +% An alternate definition for \cs{solWPrtsFmt}, used by \cs{hangSolWPrtsFmt}. +% \begin{macrocode} +\newcommand{\solWPrtsFmt@hang}[2]{% + \def\tbsolWPrtsFmt##1##2{% + \makebox[0pt][r]{#1\eqe@prtsepSoln% + \makebox[\tbsolnpartwdth][l]{#2}\eqe@hspannerSoln}% +}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\hangSolWPrtsFmt} +% The command takes two arguments, the same as \cs{solWPrtsFmt}. When this +% command is executed in the preamble, we get hanging indentation for problems +% with parts. +%\changes{v3.0g}{2011/08/15}{Use this to use ``hanging indentation'' for the +% parts for problems with parts in the solutions file.} +% \begin{macrocode} +\let\bpartsmrk\relax +\let\epartsmrk\relax +\newcommand{\hangSolWPrtsFmt}[2]{% +% \end{macrocode} +% At the beginning and ending of a parts environment, we begin and end +% a special \texttt{eqepartsquestions} environment, designed to give +% the desired indentation. +% \begin{macrocode} + \def\prior@parts@hook{% + \ifisleadin\else + \writeT@SolnFile{^^J\protect\bpartsmrk}\fi}% + \def\post@parts@hook{% + \writeT@SolnFile{\protect\epartsmrk^^J}}% + \def\bpartsmrk{\global\firstitemtrue\begin{eqepartsquestions}}% + \def\epartsmrk{\end{eqepartsquestions}\global\firstitemfalse}% +% \end{macrocode} +% We must also redefine \cs{solWPrtsFmt} by letting it to +% \cs{solWPrtsFmt@hang}, then executing it using the parameters passed. +% \begin{macrocode} + \let\solWPrtsFmt\solWPrtsFmt@hang + \solWPrtsFmt{#1}{#2}% +} +%\@onlypreamble\hangSolWPrtsFmt +% \end{macrocode} +% \end{macro} +% Define some switches, token registers, and boxes for managing +% the answers and marginal notes. +% \begin{macrocode} +\newif\ifexamenv \examenvfalse +\newif\iffirstemit \firstemittrue +\newtoks\txtbkt@ks \txtbkt@ks={} +\newtoks\txtbkt@ksi \txtbkt@ksi={} +\newbox\txtbkb@xb@t +\newbox\txtbkb@xt@p +\newbox\txtbkb@xh@ld +\let\tbTopMargin\relax +\let\tbBotMargin\relax +\long\def\tb@addtoTopMargin#1{\txtbkt@ksi={#1}% + \edef\eqe@tmphold{\the\txtbkt@ksi\the\txtbkt@ks}% + \global\txtbkt@ks=\expandafter{\eqe@tmphold}% +} +\newcommand{\tb@addtoMargin}[1]{% + \edef\eqe@tmphold{\the\txtbkt@ks}% + \global\txtbkt@ks=\expandafter{\eqe@tmphold#1}% +} +% \end{macrocode} +% As my first attempt, let's create two comment environmets to be used within +% the \texttt{solution} environment. +%\begin{verbatim} +%\begin{solution} +%\begin{ssol} +% +%\end{ssol} +%\begin{lsol} +% +%\end{lsol} +%\end{solution} +%\end{verbatim} +% The control of these environments are made through +% \begin{environment}{lsol} +% \begin{macro}{\tb@showlsols} +% Place full (or long) solutions in this environment. +% \begin{macrocode} +\newcommand{\tb@showlsols}{\includecomment{lsol}\excludecomment{ssol}} +% \end{macrocode} +% \end{macro} +% \end{environment} +% \begin{environment}{ssol} +% \begin{macro}{\tb@showssols} +% Place short solutions in this environment. +% \begin{macrocode} +\newcommand{\tb@showssols}{\includecomment{ssol}\excludecomment{lsol}} +% \end{macrocode} +% \end{macro} +% \end{environment} +% The default is to show the short solutions. +% \begin{macrocode} +\let\tb@soln@choice\tb@showssols +%\let\tb@sols@choice\tb@showssols +% \end{macrocode} +% \subsection{Marginal Matter.} There are three levels in the margins: +% \begin{enumerate} +% \item \textbf{Top level}: This is a command \cs{tbTopMargin} with may be +% redefined between pages. It should have the width of the \cs{parbox} +% that contains all the content of the margin, this width is \cs{tb@marparboxwidth} +% (\texttt{\cs{oddsidemargin}-\cs{marginparsep}}). The content \emph{must} be +% unbreakable across pages. The content of \cs{tbTopMargin} will appear \emph{on +% every page subsequent to its definition}. +% \item[] \DescribeMacro{\clearTopMargin} We can clear the top level using the following command +% \begin{macrocode} +\newcommand{\clearTopMargin}{\global\let\tbTopMargin\relax} +% \end{macrocode} +% \item[] Clearing will take effect on the following page. +% \item[] \DescribeMacro{\setTopMargin} As a convenience macro, we can create top margin content. +% Redefinitions will appear on the next page from where the definition was made. +% \begin{macrocode} +\newcommand{\setTopMargin}[1]{% + \gdef\tbTopMargin{\color@begingroup\normalcolor + #1\color@endgroup}% + \gdef\tbSaveTopMargin{\color@begingroup\normalcolor + #1\color@endgroup}} +\let\tbTopMargin\@empty +\let\tbSaveTopMargin\@empty +% \end{macrocode} +% \item \textbf{Middle level}: The middle level is the most interesting. You write to it +% using \cs{insMidMarg}. Normally, this is text. If there is too much text, +% it will be split off and placed in the middle level of the next page. The command +% \cs{ANS} also writes to the middle level when the \texttt{instred} and \texttt{marginans} options are +% taken. +% \item \textbf{Bottom level}: This is similar to the top level, but on the bottom. The +% command is named \cs{tbBotMargin} and follows the same rules as \cs{tbTopMargin}. +% Again, the content of \cs{tbBotMargin} will appear \emph{on every +% page subsequent to its definition}. +% \item[] \DescribeMacro{\clearBotMargin} We can clear the bottom level using the following command +% \begin{macrocode} +\newcommand{\clearBotMargin}{\global\let\tbBotMargin\relax} +% \end{macrocode} +% \item[] Clearing will take effect on the following page. +% \item[] \DescribeMacro{\setBotMargin} As a convenience macro, we can create bottom margin content. +% Redefinitions will appear on the next page from where the definition was made. +% \begin{macrocode} +\newcommand{\setBotMargin}[1]{\gdef\tbBotMargin{#1}% + \gdef\tbSaveBotMargin{#1}} +\let\tbBotMargin\@empty +\let\tbSaveBotMargin\@empty +% \end{macrocode} +% \begin{macrocode} +\newcommand{\restoreLastTopMargin}{\expandafter\setTopMargin + \expandafter{\tbSaveTopMargin}} +\newcommand{\restoreLastBotMargin}{\expandafter\setBotMargin + \expandafter{\tbSaveBotMargin}} +% \end{macrocode} +% \end{enumerate} +% +% \begin{macro}{\insMidMarg} +% \cs{insMidMarg} is a \cs{parbox} that will hold the material in the margin. +% \begin{macro}{\MarParBoxFmt} +% The formatting for the marginal \cs{parbox} +% \begin{macrocode} +\newcommand{\MarParBoxFmt}{\normalsfcodes + \normalfont\normalsize\normalbaselines\parindent0pt + \vbadness\@Mi \hbadness5000 \tolerance9999 + \parskip0pt\raggedright %\spaceskip=0pt\xspaceskip=0pt + \setlength{\linewidth}{\tbmarparboxwidth}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\tbmarparboxwidth} +% The width of the margin box. Initial value of \texttt{1sp}, if the user does not +% reset the value, it is a package error. +% \begin{macrocode} +\newlength\tbmarparboxwidth +\setlength\tbmarparboxwidth{1sp} +% \end{macrocode} +% \end{macro} +% \begin{macro}{MidMargcolor} +% The default color of text of the middle level +% \begin{macrocode} +\definecolor{MidMargcolor}{rgb}{0,0,.8} +\newcommand{\midMargFmt}[1]{% + \def\tb@midMargFmt{\normalfont\normalsize\normalcolor#1}} +\midMargFmt{\color{MidMargcolor}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\eqe@MarParBox} +% This is the actual \cs{parbox} that holds the marginal material. I have two versions +% of this box, the first one has height \cs{textheight}, the second one has height +% \texttt{\cs{textheight}+\cs{footskip}}. +% \begin{macrocode} +%\def\eqe@MarParBox#1{\parbox[b][\textheight][t]% +% {\tbmarparboxwidth}{\color{MidMargcolor}#1}} +\def\eqe@MarParBox#1{\lower\footskip\hbox{% + \leavevmode\parbox[b][\textheight+\footskip][t]% + {\tbmarparboxwidth}{\tb@midMargFmt#1}}} % +% \end{macrocode} +% \end{macro} +% Finally, we get to the \cs{insMidMarg}, this is used to write to the middle +% level. +% \begin{macrocode} +\newcommand{\insMidMarg}[1]{% + \let\eqe@margininsert\@empty + \expandafter\tb@addtoMargin\expandafter{\eqe@margininsert#1}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\tbPreMarginHeader} +% Executed prior to the marginal heading +% \begin{macro}{\tbPostMarginHeader} +% Executed after the marginal heading +% \begin{macro}{HEADERcolor} +% Default color of a marginal header +% \begin{macro}{\cngMargHeadColorTo} +% Changes the marginal header to a named color +%\changes{v3.0o}{2011/09/20}{Added \cs{cngMargHeadColorTo} and +% \cs{resetMargHeadColor} to make it easier to change the color +% of the header globally, or just once.} +% \begin{macro}{\resetMargHeadColor} +% Reset the marginal header color to the default, \texttt{HEADERcolor} +% \begin{macro}{\tbMarginHeaderFmt} +% Formatting for a marginal header. +% Format the marginal header, the default is \texttt{HEADERcolor} in bold +% \begin{macrocode} +\newcommand{\tbPreMarginHeader}{\par\penalty0 \kern3pt} +\newcommand{\tbPostMarginHeader}{\par\nobreak} +\definecolor{HEADERcolor}{named}{black} +\newcommand{\cngMargHeadColorTo}[1]{\insMidMarg{\gdef\tb@MHC{#1}}} +\newcommand{\resetMargHeadColor}{\insMidMarg{\gdef\tb@MHC{HEADERcolor}}} +\resetMargHeadColor +\newcommand{\tbMarginHeaderFmt}[1]{\textcolor{\tb@MHC}{\textbf{#1}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\insMargHead} +% Used to insert a general marginal heading into the middle level. The +% optional parameter allows you to set a mark. +% +% \begin{macro}{\insProbHead} +% Used to insert a marginal heading for a problem set into the middle level. +% The optional parameter allows you to insert a mark, the default mark is +% \verb!#1 \tbcontinued!. +% \begin{macrocode} +\newcommand{\insMargHead}[2][]{% dps + \insMidMarg{\tb@marginHeader{#1}{#2}}} +\newcommand{\insProbHead}[2][]{% + \def\tb@argi{#1}\ifx\tb@argi\@empty + \protected@xdef\currProbHead{#2 \tbcontinued}\else + \protected@xdef\currProbHead{#1}\fi + \ifisinstred\ifismarginans + \insMidMarg{\tb@marginProbHeader{#1}{#2}}\fi\fi +} +\newcommand{\tb@marginProbHeader}[2]{% + \def\tb@argi{#1}\ifx\tb@argi\@empty + \tb@marginHeader{#2 \tbcontinued}{#2}\else + \tb@marginHeader{#1}{#2}\fi +} +\newcommand{\tb@marginHeader}[2]{\tbPreMarginHeader + \tbMarginHeaderFmt{#2}\def\tb@argi{#1}\ifx\tb@argi\@empty + \mark{#2}\else\mark{#1}\fi\tbPostMarginHeader +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\tbcontinued} +% The continue annot that appear when a problem set flows over to the next page. +% \begin{macrocode} +\newcommand{\tbcontinued}{(cont.)} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\tbplaceMargins} +% Redefine this macro to set the locations of the margins we are writing to. +% \begin{macrocode} +\newcommand{\marparboxwidth}[1]{% + \setlength\tbmarparboxwidth{#1}% + \setlength{\marginparwidth}{\tbmarparboxwidth}% + \tbMakeFinalCalcs +} +\@onlypreamble\marparboxwidth +\newcommand{\chkmarginboxwidth}{% + \ifdim\tbmarparboxwidth=1sp \PackageError{eqexam}% + {You have not set the value of\MessageBreak + \string\marparboxwidth}% + {Define the \string\marparboxwidth\space command}\fi +} +% \end{macrocode} +% \begin{macro}{\ifmarginsonleft} +% A Boolean switch, if true, all margins are on the left; otherwise, they alternate +% \begin{macrocode} +\newif\ifmarginsonleft \marginsonleftfalse +% \end{macrocode} +% \end{macro} +% \begin{macro}{\tbSetupForMargins} +% We compute \cs{oddsidemargin}, \cs{evensidemargin}, and \cs{textwidth} +% \begin{macrocode} +\newcommand{\tbSetupForMargins}{% + \ifmarginsonleft + \setlength{\oddsidemargin}{\tbmarparboxwidth+\marginparsep}% + \setlength{\evensidemargin}{\oddsidemargin}% + \setlength{\textwidth}{\paperwidth-2in-\oddsidemargin}% + \else + \setlength{\oddsidemargin}{0pt}% + \setlength{\evensidemargin}{\tbmarparboxwidth+\marginparsep}% + \setlength{\textwidth}{% + \paperwidth-2in-\oddsidemargin-\evensidemargin}% + \fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\tbplaceMargins} +% We calculate the coordinates of the lower left hand corner of the margin \cs{parbox} +% depending on the value of \cs{ifmarginsonleft}. +% \begin{macrocode} +\newcommand{\tbplaceMargins}{{% + \setlength{\@tempdima}{% + \paperheight-1in-\topmargin-\headheight-\headsep-\textheight}% + \xdef\@evenlly{\strip@pt\@tempdima}% + \xdef\@oddlly{\@evenlly}% + \setlength{\@tempdima}{1in}% + \xdef\@evenllx{\strip@pt\@tempdima}% + \ifmarginsonleft\else + \setlength{\@tempdima}{1in+\textwidth+\marginparsep}\fi + \xdef\@oddllx{\strip@pt\@tempdima}% +}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\tbMakeFinalCalcs} +% Executed by \cs{marparboxwidth} +% \begin{macrocode} +\newcommand{\tbMakeFinalCalcs}{% + \tbSetupForMargins + \tbplaceMargins +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\tbminskipbtnlayers} +% \cs{tbminskipbtnlayers} is the minimum skip between layers (top, middle, bottom) +% Executed by \cs{marparboxwidth} +% \begin{macrocode} +\newlength\tbminskipbtnlayers +\setlength{\tbminskipbtnlayers}{6pt} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\newif\ifiscarryover \iscarryoverfalse +% \end{macrocode} +% \begin{environment}{carryoverFmt} +% is a work-around for the color problem +% experienced with carry over text: Suppose there is a change of +% color of the text on the previous page, the carry over text will naturally be +% colored the default color, \texttt{MidMargcolor}. To continue the text with the same color +% as the one the previous page, we enclose the text in the +% \texttt{carryoverFmt} environment. +% \begin{macrocode} +\newenvironment{carryOverFmt}[1]{#1\let\tb@carryoverFmt\@empty + \c@rryoverFmt{#1}}{} +% \end{macrocode} +% \end{environment} +% This command is called by the \texttt{carryOverFmt} environment. +% it takes its argument, which is a change in color or style, and +% defines \cs{tb@carryoverFmt}, which will be executed on the next page. +% \begin{macrocode} +\def\c@rryoverFmt#1{% + \ifx\tb@carryoverFmt\@empty + \global\let\tb@carryoverFmt\@empty + \xdef\tb@co@page{\thepage}% + \gdef\tb@carryoverFmt{\ifnum\thepage>\tb@co@page\relax + #1\global\let\tb@carryoverFmt\@empty\fi}% + \fi +} +\let\tb@carryoverFmt\@empty +% \end{macrocode} +% \cs{tb@insertCarryOver} takes its argument, that is always +% \verb!\unvbox\txtbkb@xb@t}!, and if there is any carryover +% content, will insert its argument followed by a copy, +% \cs{tb@rest@reMarginFmt} of the default margin format. This seems +% to work for recovering from a change of text or style over a page +% boundary. +% \begin{macrocode} +\let\tb@rest@reMarginFmt\relax +\def\tb@insertCarryOver#1{% + \let\tb@rest@reMarginFmt\relax + \ifiscarryover\ifx\tb@carryoverFmt\@empty\else + \let\tb@rest@reMarginFmt\tb@midMargFmt + \tb@carryoverFmt\fi\fi + #1 \tb@rest@reMarginFmt +} +% \end{macrocode} +% \begin{macro}{\eqe@tb@shipout} +% We define the shipout to the margins.\par\medskip\noindent +% \textbf{Bug:} When I use \textsf{graphicxsp}, embed the picture (such as a logo), +% and use that picture as the \cs{setTopMargin}, the shipout routine is executed +% twice for each page. I haven't figured out what causes this, but here is a +% work around. We record the most recent page number, if it equals the page number +% of the last iteration of \cs{eqe@tb@shipout}, we do nothing; otherwise, +% execute the shipout code. +% \begin{macrocode} +\newif\iftb@shipoutPermitted \tb@shipoutPermittedtrue +\newcommand{\turnOnFTBShipout}{\global\tb@shipoutPermittedtrue} +\newcommand{\turnOffFTBShipout}{\global\tb@shipoutPermittedfalse} +% \end{macrocode} +%\changes{v3.7a}{2015/02/26}{Added a new Boolean switch \cs{iftb@shipoutPermitted} +% to turn off the shipout. Two convenience commands in support are also added, +% \cs{turnOffFTBShipout} and \cs{turnOffFTBShipout}.} +% \DescribeMacro{\turnOnFTBShipout}\cmd{\turnOnFTBShipout} turns on the shipout, +% the default, and \DescribeMacro{\turnOffFTBShipout}\cmd{\turnOffFTBShipout} +% turns it off. +% \begin{macrocode} +\newcommand{\eqe@tb@shipout}{\iftb@shipoutPermitted + \ifnum\arabic{page}=\tblastpageshipped + \let\tb@so@next\relax\else + \xdef\tblastpageshipped{\arabic{page}}% + \def\tb@so@next{\eqe@tb@ship@ut}\fi + \expandafter\tb@so@next\fi +} +\def\tblastpageshipped{-100} +% \end{macrocode} +% Here is the actual shipout code for writing to the margins. +% \begin{macrocode} +\newcommand{\eqe@tb@ship@ut}{% + \fboxsep=0pt\setlength{\unitlength}{1pt}% + \global\setbox\txtbkb@xb@t=\vbox\bgroup + \color@begingroup + \hsize=\tbmarparboxwidth + \vsize=\textheight + \MarParBoxFmt + \csname tbTopMargin\endcsname + \vskip\tbminskipbtnlayers +\set@typeset@protect + \the\txtbkt@ks + \color@endgroup\vfil + \egroup + \global\setbox\txtbkb@xt@p=\vsplit\txtbkb@xb@t to\textheight + \ifvoid\txtbkb@xb@t\global\iscarryoverfalse + \else\global\iscarryovertrue\fi +% \end{macrocode} +% We have three levels the top (\cs{tbTopMargin}), the bottom (\cs{tbBotMargin}), +% and the middle (\cs{txtbkt@ks}). \cs{tbTopMargin} is no problem but \cs{tbBotMargin} +% requires some special attention. +% \begin{macrocode} + \ifx\tbBotMargin\relax\else +% \end{macrocode} +% If \cs{tbBotMargin} is not \cs{relax}, we begin by putting \cs{tbBotMargin} +% into a \cs{vbox} under the same assumptions, and get its height. +% \begin{macrocode} + \bgroup\setbox2=\vbox{% + \color@begingroup\normalcolor + \hsize=\tbmarparboxwidth\kern0pt + \MarParBoxFmt\csname tbBotMargin\endcsname + \color@endgroup + \kern0pt + }% +% \end{macrocode} +% We reduce \cs{textheight} by the height of \cs{tbBotMargin} +% \begin{macrocode} + \dimen0=\textheight + \advance\dimen0-\ht\txtbkb@xh@ld + \advance\dimen0-\tbminskipbtnlayers +% \end{macrocode} +% We split off the top material by this amount, the new bottom +% is in \cs{txtbkb@xt@p} the new top is in \cs{box0} +% \begin{macrocode} + \setbox0=\vsplit\txtbkb@xt@p to \dimen0 +% \end{macrocode} +% The new bottom (which will overflow to the next page) is the content +% we clipped off bottom of \cs{txtbkb@xt@p} and the original overflow +% material still in \cs{txtbkb@xb@t}. +% \changes{v4.6}{2016/01/18}{Removed \cs{vfil} between unboxing, this allows +% correct breaking of margin content across pages.} +% \begin{macrocode} + \global\setbox\txtbkb@xb@t=\vbox{% + \unvbox\txtbkb@xt@p\unvbox\txtbkb@xb@t}% +% \end{macrocode} +% We then patch everything together the new top +% is in \cs{txtbkb@xt@p} the new top is in \cs{@tempboxa} followed by +% \cs{tbBotMargin} (in \cs{box}\cs{txtbkb@xh@ld}). +% \begin{macrocode} + \global\setbox\txtbkb@xt@p=\vbox{\unvbox0 + \vfill\vskip\tbminskipbtnlayers + \vfil\unvbox2\relax}\egroup + \fi + \ifodd\value{page}% + \put(\@oddllx,\@oddlly){% + \eqe@MarParBox{\unvbox\txtbkb@xt@p}}\else + \put(\@evenllx,\@evenlly){% + \eqe@MarParBox{\unvbox\txtbkb@xt@p}}\fi +% \end{macrocode} +% We see if there is any carry over, if yes, we insert into +% \cs{txtbkt@ks} for use on the next page, along with a heading, +% if any. +% \begin{macrocode} + \global\txtbkt@ks={}\ifvoid\txtbkb@xb@t\else +% \end{macrocode} +% We test whether these is a \cs{splitbotmark}, if yes, then we will +% insert it at the top of the next page with formatting. +% \begin{macrocode} + \if!\splitbotmark!\global\let\tb@sbm@exp\relax\else + \xdef\tb@sbm@exp{\noexpand\tbPreMarginHeader + \noexpand\tbMarginHeaderFmt{\splitbotmark}% + \noexpand\tbPostMarginHeader + \noexpand\par\kern3pt}% + \fi +% \end{macrocode} +% Here is the content that will be carried over to the next page, +% we insert a \cs{splitbotmark} if it is non-empty (\cs{tb@tmp@exp}). +% \begin{macrocode} + \global\txtbkt@ks=\expandafter{\tb@sbm@exp + \tb@insertCarryOver{\unvbox\txtbkb@xb@t}}% + \fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\insertpageifcarryover} +% This macro is use to generate a blank page if there is carry over from the +% previous page. It is place just after the exercises, and before a new chapter of section. +% The optional argument allows you to insert something into the new page, if one is +% automatically created. The default is \cs{null}. +% \begin{macrocode} +\newcommand{\insertpageifcarryover}[1][\null]{% +% \end{macrocode} +% We begin by starting a new page, the shipout routine of previous page +% will be initialized and can then get an accurate result for +% \cs{ifiscarryover}. +% \begin{macrocode} + \newpage +% \end{macrocode} +% If there is carryover, we create a new page by inserting +% a content into the page. If there is no carry over, we do +% now insert any content, and the page will not be created. +% \begin{macrocode} + \ifiscarryover\def\eqeifnext{\csname iftrue\endcsname}% + \PackageInfo{eqexam}{Carry over of content in margin + from page \thepage.\MessageBreak Creating a blank page}\else + \def\eqeifnext{\csname iffalse\endcsname}\fi\eqeifnext#1\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\setFullWidthHeader} +% Makes the running header full width. +% \begin{macrocode} +\newcommand{\setFullWidthHeader}{% + \setlength{\@tempdima}{% + \evensidemargin+\tbmarparboxwidth+\marginparsep}% + \edef\@headoffset{\the\@tempdima}% + \def\@evenhead{\makebox[0pt]{\makebox[0pt][l] + {\thepage}\hspace{\@headoffset}}\hfil\slshape\leftmark}% + \ifmarginsonleft + \def\@oddhead{\makebox[0pt]{\makebox[0pt][l] + {\slshape\rightmark}\hspace{\@headoffset}}\hfil\thepage}% + \else + \def\@oddhead{{\slshape\rightmark}\hfil\makebox[0pt] + {\hspace{\@headoffset}\makebox[0pt][r]{\thepage}}}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \subsection{In support of solutions at end of document and chapter} +% +% A feature that may not be used much is to have solutions at the end of each chapter. +% \begin{macro}{\chaptersolutions} +% If \cs{tb@EndOfChapterExercises} is executed, and +% \cs{chaptersolutions} is placed between chapters, we can generate +% solutions at the end of the chapters, instead of at the end of the book. +% \cs{chaptersolutions} is \cs{let} to \cs{relax} unless +% \cs{tb@EndOfChapterExercises} is executed. In this case +% \cs{chaptersolutions} inputs the the \texttt{.sol} file, then +% then opens it +% \begin{macrocode} +\newif\ifchapterexercises \chapterexercisesfalse +\let\chaptersolutions\relax +\def\tb@EndOfChapterExercises{% + \let\include@solutions@chapter\include@solutions + \def\includeexersolutions{% + \include@solutions@chapter + \global\let\include@solutions\relax + }% +% \end{macrocode} +% \cs{chaptersolutions} is redefined from \cs{relax}. Input current solutions, +% close stream, open stream. +% \begin{macrocode} + \def\chaptersolutions{% + \includeexersolutions + \immediate\closeout\ex@solns + \newwrite \ex@solns \global\let\quiz@solns\ex@solns + \immediate\openout \ex@solns \jobname.sol + \ifvspacewithsolns\writeAllAnsAtEnd\fi + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\def\writeallsolutions{\let\chaptersolutions\relax} +% \end{macrocode} +% \begin{macro}{\exercisesAtEndOfChapter} +% If you want solutions at the end of each chapter, you'll have to +% execute this command in the preamble. See \cs{initChapAfterSolns} for an +% example of usage. +% \begin{environment}{afterChapSolns} +% This comment environment is a convenience for placing content between +% chapters. +% \begin{macrocode} +\excludecomment{afterChapSolns} +%\includecomment{solnsAtEnd} +% \end{macrocode} +% (2014/05/08) There is a problem with nested comment environments when \texttt{solnsAtEnd} +% contains within it the \cs{includeexersolutions} command, especially when +% \texttt{multicols} is used. The fix seems to redefine things so that +% \texttt{solnsAtEnd} writes to a different CUT file +% \begin{macrocode} +\def\NewCommentCutFile{\def\CommentCutFile{solnsAtEnd.cut}} +\def\RestoreCommentCutFile{\def\CommentCutFile{comment.cut}} +\@ifundefined{BeforeIncludedComment}{% +\long\def\solnsAtEndcomment + #1{\message{Special comment '#1'}% + \csarg\def{#1}{\endgroup \message{Processing '#1' comment.}% + \NewCommentCutFile\SetUpCutFile + % #2 before SetUp, so we can do renaming. + \message{Comment '#1' writing to \CommentCutFile.}% + \ProcessComment{#1}}% + \csarg\def{After#1Comment}{\immediate\closeout\CommentStream + \RestoreCommentCutFile\input{solnsAtEnd.cut}\relax}% + \CommentEndDef{#1}} +}{\long\def\solnsAtEndcomment + #1{\message{Special comment '#1'}% + \csarg\def{After#1Comment}{\immediate\closeout\CommentStream + \RestoreCommentCutFile\input{solnsAtEnd.cut}\relax}% + \csarg\def{#1}{\NewCommentCutFile\BeforeIncludedComment\relax + \ProcessComment{#1}}% + \CommentEndDef{#1}} + } +\solnsAtEndcomment{solnsAtEnd} +\newcommand{\exercisesAtEndOfChapter}{% + \ifeq@nosolutions\else + \typeout{^^J!!!!!Executing in chapter solutions!!!!!^^J} + \chapterexercisestrue\tb@EndOfChapterExercises + \ifchapterexercises + \csarg\let{solnsAtEnd}\@gobble + \excludecomment{solnsAtEnd}% + \csarg\let{AftersolnsAtEndComment}\relax + \includecomment{afterChapSolns}\else + \excludecomment{afterChapSolns}\fi + \fi +} +\@onlypreamble\exercisesAtEndOfChapter +% \end{macrocode} +% \end{environment} +% \end{macro} +% \subsection{Modifying and restoring the Layout} +% The book may need a wide page format and use multi-columns to display homework sets, or +% solutions at the end if the book. +% \begin{macro}{\setFullWidthLayout} +% A command to set the page layout for the solutions in the back of the book. Typically, +% we do away with the wide margins. We also save the current values of the parameters +% we are changing so we can restore them later. +% \begin{macrocode} +\newcommand{\setFullWidthLayout}{% + \saveBasicLayoutParams + \setlength{\oddsidemargin}{0in}% + \setlength{\evensidemargin}{\oddsidemargin}% + \setlength{\textwidth}{\paperwidth-2in}% + \setlength{\linewidth}{\paperwidth-2in}% + \setlength{\columnseprule}{0pt}% + \def\@evenhead{\thepage\hfil\slshape\leftmark}% + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% +} +% \end{macrocode} +% \begin{environment}{fullwidthtext} +% When \cs{setFullWidthLayout} is in effect, we have the problem of writing text. +% Originally, I used a \cs{parbox} with width of \cs{linewidth}, but this has it problems +% when breaking across pages. We have instead an environment for writing; the list environment +% obeys the current \cs{linewidth}, which is set to \cs{paperwidth-2in}, this latter value +% may not always be correct (especially when the margins are smaller than 2in. +% \begin{macrocode} +\newenvironment{fullwidthtext}{% +\begin{list}{}{% + \setlength{\labelwidth}{0pt}\setlength{\labelsep}{0pt}% + \setlength{\itemindent}{0pt}\setlength{\itemsep}{0pt}% + \setlength{\topsep}{0pt}\setlength{\parsep}{0pt}% + \setlength{\listparindent}{\parindent}% + \setlength{\leftmargin}{0pt}\setlength{\rightmargin}{0pt} +}\item\relax}{\end{list}} +% \end{macrocode} +% \begin{macro}{\restorePageLayout} +% Restore the last saved page parameters. +% \begin{macrocode} +\newcommand{\restorePageLayout}{\newpage + \setlength{\oddsidemargin}{\tb@osms} + \setlength\evensidemargin{\tb@esms} + \setlength{\textwidth}{\tb@tws} + \setlength{\linewidth}{\tb@lws} + \setlength{\columnseprule}{\tb@csr} +} +% \end{macrocode} +% Used by \cs{setFullWidthLayout} just before the page layout parameters are changed. +% \begin{macrocode} +\newcommand{\saveBasicLayoutParams}{% + \xdef\tb@osms{\the\oddsidemargin}% + \xdef\tb@esms{\the\evensidemargin}% + \xdef\tb@tws{\the\textwidth}% + \xdef\tb@lws{\the\linewidth}% + \xdef\tb@csr{\the\columnseprule}% +} +% \end{macrocode} +% \begin{macro}{\initChapAfterSolns} +% Initializes the environment when solutions appear after each chapter. +% Example of usage, taken from fortextbook.ltx, +%\begin{verbatim} +%\begin{afterChapSolns} +%\initChapAfterSolns +%\section{Solutions to Chapter Exercises} +%\begin{fullwidthtext} +%We present short solutions to the problems. +%We present short solutions to the problems. +%We present short solutions to the problems. +%We present short solutions to the problems. +%\end{fullwidthtext} +%\bigskip +%\begin{multicols}{2}\forceNoColor +%\chaptersolutions +%\end{multicols} +%\restoreFromChapAfterSolns +%\end{afterChapSolns} +%\end{verbatim} +% \begin{macrocode} +\newcommand{\initChapAfterSolns}{\newpage + \clearTopMargin\clearBotMargin + \setFullWidthLayout +} +% \end{macrocode} +% \begin{macro}{\restoreFromChapAfterSolns} +% Restores the saved parameters at the end of the chapter solutions, see +% above for an example. +% \begin{macrocode} +\newcommand{\restoreFromChapAfterSolns}{\newpage + \restorePageLayout\setFullWidthHeader +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{environment} +% \end{macro} +% \begin{macrocode} +% End of textbook segment +% +%<*package> +% \end{macrocode} +% \subsection{We shipout in support of \texttt{fortextbook}} +% We shipout \cs{eqe@tb@shipout} to be placed in the margins on every page. +% \begin{macrocode} +\ifeqfortextbook +\AtBeginDocument{\tb@soln@choice + \ifeqwritetomargins\chkmarginboxwidth + \AddToShipoutPicture{\eqe@tb@shipout}\fi} +\fi +% +%<*textbook> +% \end{macrocode} +% +% \subsection{Modify \texttt{eqequestions} environment} +% +% We adjust the \texttt{eqequestions} environment to minimize spacing between problems. +% \begin{macrocode} +\eqequestopsep{0pt} +\eqequesparsep{0pt} +\eqequesitemsep{0pt} +\eqequeslistparindent{0pt} +\renewenvironment{eqequestions}{% + \begin{list}{}{% + \ifwithinsoldoc\let\solnItemMngt\eqeSolnItemMngt\fi + \setlength{\labelwidth}{\eqemargin}% + \setlength{\parsep}{\eqeques@parsep}% + \setlength{\itemsep}{\eqeques@itemsep} + \setlength{\topsep}{\eqeques@topsep}% + \setlength{\itemindent}{0pt}% + \setlength{\listparindent}{\eqeques@listparindent}% + \ifwithinsoldoc\settowidth{\labelsep}{\eqe@hspannerSoln}\else + \settowidth{\labelsep}{\eqe@hspannerPrb}\fi + \setlength{\leftmargin}{\labelwidth}% + }\ifwithinsoldoc\global\firstitemtrue\fi\item\relax}{\end{list}} +% \end{macrocode} +% \begin{environment}{eqepartsquestions} +% This environment is used in the SOL file with problems with parts to hang indent +% the solutions with parts. +% \begin{macrocode} +\newcommand{\eqepquestopsep}[1]{\def\eqepques@topsep{#1}} +\newcommand{\eqepquesparsep}[1]{\def\eqepques@parsep{#1}} +\newcommand{\eqepquesitemsep}[1]{\def\eqepques@itemsep{#1}} +\eqepquestopsep{\eqeques@itemsep} +\eqepquesparsep{\eqeques@parsep} +\eqepquesitemsep{\eqeques@itemsep} +\newenvironment{eqepartsquestions}{% + \begin{list}{}{% + \settowidth{\labelwidth}{\eqe@prtsepSoln\hspace{\tbsolnpartwdth}} + \setlength{\parsep}{\eqepques@parsep}% + \setlength{\itemsep}{\eqepques@itemsep}% + \setlength{\topsep}{\eqepques@topsep}% + \setlength{\itemindent}{0pt}% + \settowidth{\labelsep}{\eqe@hspannerSoln} + \setlength{\leftmargin}{\labelwidth}% + }\item\relax}{\end{list}} +% \end{macrocode} +% \end{environment} +% +% \subsection{Modifications for solutions page} +% +% \DescribeMacro{\gobbletoEndEXt} is a command to gobble all content from the current position \cs{eqEXt} +% down to \cs{endeqEXt}. In the solutions file ends with \cs{par}\cs{medskip}, which +% we gobble up too. We define \DescribeMacro{\eqExtArg}\cs{eqExtArg} to \cs{thequestionno} so we can use the problem +% number to filter out the even-problems. +% \begin{macrocode} +\long\def\gobbletoEndEXt#1\endeqEXt{\@gobbletwo} +\def\eqExtArg{\theeqquestionnoi} +% \end{macrocode} +% \begin{macrocode} +\if\load@exerquiz\eqe@NO\DoNotFitItIn\fi +\let\fillInFormatDefault\@empty +\def\exerSolnsHeadnToc{} +\renewcommand{\exerSolnInput}{% + \global\let\webnewpage\relax + \ifsolutionsonly\else\immediate\closeout\ex@solns\fi + \ifeq@nosolutions\else\newpage % 2012-03-14 + \iftherearesolutions\eq@solutionshook\eqsolutionshook + \ifsolutionsonly\else\newpage\eq@solutionshook + \eqsolutionshook\fi + \ifx\webnewpage\relax + \gdef\webnewpage{\global\let\webnewpage\newpage}% + \fi + \priorexsectitle\exerSolnsHeadnToc\priorexslinput + \InputIfFileExists{\jobname.sol}{}{\PackageWarning{exerquiz} + {!!! Solutions to exercises not found}}% + \fi + \fi +} +% \end{macrocode} +% \begin{macro}{\eqedsplyOnlyFrst} +% The default listing of a problem with multiple parts is to typeset +% \texttt{.}~\texttt{()}. Here, we do not typeset the number after +% the first time. +% \begin{macrocode} +\setcounter{partno}{1}\edef\firstPartLtr{\thepartno} +% \end{macrocode} +% ???? 6/2/11 When part (a) is hidden we need to generate the questions number +% for the the first non-hidden part. Created \cs{iffrstProbNumShown} to help +% but it not working yet. +% \begin{macrocode} +\newif\iffrstProbNumShown\frstProbNumShownfalse +\def\tb@insertDecPoint{\ifwithinsoldoc\eqedecPointSoln\else + \eqe@decPointMrg\fi} +\newcommand{\eqedsplyOnlyFrst}[2]{\def\thisPart{#2}% + \ifx\thisPart\firstPartLtr\global\frstProbNumShowntrue + \tb@mrgDigitFmt{#1}\tb@insertDecPoint\else + \iffrstProbNumShown\tb@GenProbNum{#1}\else + \global\frstProbNumShowntrue\tb@mrgDigitFmt{#1}% + \tb@insertDecPoint\fi\fi\global\eqeGenProbNumfalse +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\displayProbNumOnce} +% If a part is carried over to the next page, it may be necessary to manually +% force the display of the first digit. +%\begin{verbatim} +%\insMidMarg{\displayProbNumOnce} +%\end{verbatim} +% \begin{macrocode} +\newif\ifeqeGenProbNum \eqeGenProbNumfalse +\newcommand{\displayProbNumOnce}{\global\eqeGenProbNumtrue} % +%\def\tb@GenProbNum#1{\ifeqeGenProbNum#1\eqe@decPointMrg\else +\def\tb@GenProbNum#1{\ifeqeGenProbNum#1\tb@insertDecPoint\else + \phantom{#1\tb@insertDecPoint}\fi}% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\def\sq@priorhook{\medskip} +% \end{macrocode} +% Adjustments of spacing between problems \cs{eqexerskip}, and the check for enough +% room for the next problem. +% \begin{macrocode} +\def\default@fvsizeskip{.1} +% \end{macrocode} +% The skip prior to the beginning of an exercise +% \begin{macrocode} +\aboveexskip{0pt} +% \end{macrocode} +% The skip after the end of an exercise +% \begin{macrocode} +\belowexskip{0pt} +% \end{macrocode} +% The skip in the solutions file following an exercise OR a part of an exercise +% The text of this command should be a single token, that's why I've enclosed +% it in braces. (There is a \cs{@gobbletwo} that gobbles it up for the \texttt{studented} option.) +% \begin{macrocode} +\renewcommand\belowexsolnskip{{}} +% \end{macrocode} +% We remove the \cs{mark} from this definition, see original definition in \texttt{eqexam.def} +% \begin{macrocode} +\renewcommand\exerSolnHeader[3]{% + \ifeqforpaper\else\webnewpage\fi%\par + \noindent\@ifundefined{hypertarget} + {#3}{\hypertarget{#2}{#3}\relax}\solnhspace +} +% \end{macrocode} +% This causes the \texttt{eqexam} environment to write the user friendly name of the exam +% even if there is only one exam. +% \begin{macrocode} +\def\nNumberOfP@rts{0} +% \end{macrocode} +% +% \subsection{Some Convenience/Formatting Commands} +% +% \begin{macro}{\preExamSolnHead} +% \begin{macro}{\examSolnHeadFmt} +% \begin{macro}{\postExamSolnHead} +% These are redefinitions of commands defined in \texttt{eqexam}, +% They control the vertical spacing before and after a heading in the +% solutions at the end of the book, as well as the formatting. +% \begin{macrocode} +\renewcommand{\preExamSolnHead}{\medbreak\noindent} +\renewcommand{\examSolnHeadFmt}[1]{\textbf{#1}} +\renewcommand{\postExamSolnHead}{\smallskip} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\wrtChapSolnHead} +% Writes a chapter heading to the solution file, usage, +%\begin{verbatim} +%\wrtChapSolnHead{The New {\eqexam}} +%\end{verbatim} +% \begin{macrocode} +\newcommand{\wrtChapSolnHead}[1]{% + \writeT@SolnFile{% + \protect\preChapSolnHead + \protect\chapHeadSolnFmt{\protect\ftbFmtChapter{\thechapter}#1}% + \protect\postChapSolnHead +}} +% \end{macrocode} +% \begin{macro}{\preChapSolnHead} +% \begin{macro}{\chapHeadSolnFmt} +% \begin{macro}{\postChapSolnHead} +% Same as above, except for chapter headings. +% \begin{macrocode} +\newcommand{\preChapSolnHead}{\bigbreak\noindent} +\newcommand{\chapHeadSolnFmt}[1]{{\large\textbf{#1}}} +\newcommand{\postChapSolnHead}{\medbreak} +% \end{macrocode} +% \begin{macro}{\ftbFmtChapter} +% This command may (optionally) insert the chapter number into the chapter title passed +% to \cs{wrtChapSolnHead}. The default is to pass the chapter name (``Chapter'') and chapter number. +% If you say \verb!\let\ftbFmtChapter\@gobble!, the chapter name and number will not appear. +% You can redefine this command as desired. +% \begin{macrocode} +\newcommand{\ftbFmtChapter}[1]{\chaptername\space#1.\space\ignorespaces} +% \end{macrocode} +% In the solution manual, all these +%chapter commands may be redefined like so +%\begin{verbatim} +%\let\preChapSolnHead\relax +%\let\chapHeadSolnFmt\chapter +%\let\ftbFmtChapter\@gobble +%\let\postChapSolnHead\relax +%\end{verbatim} +% In fact, let's make this into a command. +% \begin{macro}{\convertChapHeadToChapters} +%In the solutions manual, the chapter headings will become chapters of the manual, rather than +%just a bold faced heading. +% \begin{macrocode} +\newcommand{\convertChapHeadToChapters}{% + \let\preChapSolnHead\relax + \let\chapHeadSolnFmt\chapter + \let\ftbFmtChapter\@gobble + \let\postChapSolnHead\relax +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\probSet} +% A simple command to announce the problem set. +%\begin{verbatim} +%\subsection*{\probSet{\thesection}} +%\end{verbatim} +% See also the definition for the \texttt{probset} environment below. +% \begin{macrocode} +\newcommand{\probSet}[1]{Problem Set #1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\annotPage} +% Use to annotation the page number onto a solution heading, for example, +%\begin{verbatim} +%\begin{exam}[\thesection. Another Section\annotPage]{\autoExamName} +%\end{verbatim} +% or using the \texttt{probset} environment defined below +%\begin{verbatim} +%\begin{probset}{{\thesection} Setting the page layout\annotPage} +%\end{verbatim} +% \begin{macrocode} +\newcommand{\annotPage}{\protect\annotThePage{\thepage}} +\newcommand{\annotThePage}[1]{\space(page\protect~#1)} +% \end{macrocode} +% \end{macro} +% \subsection{The \texttt{probset} and \texttt{example} environments} +% We define two environments based. The first (\texttt{probset}) is based on the +% \texttt{exam} environment; the second (example) is based on the \texttt{exercise} environment. +% \begin{environment}{probset} +% A convenience environment, it is the \texttt{exam} environment, renamed, with +% different arguments. \texttt{\#1} is the heading that will appear in the margins, +% and \texttt{\#2} is the heading to appear in the back of the book. +%\changes{v3.0n}{2011/09/18}{Added an \cs{edef} in case \cs{thesection} does not get +% expanded early enough to display correctly in the margins.} +% \begin{macrocode} +\def\noProbHeader{NPH} +\newenvironment{probset}[2][\probSet{\thesection}]{% + \exam[#2]{\autoExamName}\ifx#1\noProbHeader\else + \protected@edef\ftb@tmp@exp{\noexpand\insProbHead{#1}}% + \ftb@tmp@exp\fi}{\endexam} +% \end{macrocode} +% \end{environment} +% \begin{macrocode} +\newcounter{exampleno}[section] +\renewcommand{\theexampleno}{\arabic{section}.\arabic{exampleno}} +% \end{macrocode} +% \textbf{Note:} The counter is \texttt{exampleno} and is designed to show the section +% number and example number, and to reset at each section. To change the definition +% of \cs{theexampleno} to reflect the chapter number followed by the example number, and +% resetting at the beginning of each new chapter, the following code is needed. +%\begin{verbatim} +%\usepackage{remreset} +%\@removefromreset{exampleno}{section} +%\renewcommand{\theexampleno}{\arabic{chapter}.\arabic{exampleno}} +%\@addtoreset{exampleno}{chapter} +%\end{verbatim} +%\DescribeMacro{\examplenoname} is the label placed on the example. +% \begin{macrocode} +\newcommand{\examplenoname}{Example} +% \end{macrocode} +% \begin{environment}{example} +% A simple example environment, based on the \texttt{exercise} environment. +% \begin{macrocode} +\newenvironment{example}{%\medskip + \belowexskip{\medskipamount}\aboveexskip{\medskipamount}% + \makeRoomForProb{\@nbaselineskip\baselineskip}{}% + \renewcommand\exlabel{Example}% + \renewcommand\exlabelformat{\textbf{\exlabel~\theexampleno.}}% + \let\eq@fititin\eqfititin + \renewcommand\exrtnlabelformat{$\square$}% + \def\eqexheader@wrapper{\eqexheader}% + \SolutionsAfter + \begin{exercise}[exampleno]}{\end{exercise}} +% \end{macrocode} +% \end{environment} +% \begin{environment}{example*} +% An example environment with parts. +% \begin{macrocode} +\newenvironment{example*}{%\medskip + \belowexskip{\medskipamount}\aboveexskip{\medskipamount}% + \makeRoomForProb{\@nbaselineskip\baselineskip}{}% + \renewcommand\exlabel{Example}% + \renewcommand\exlabelformat{\textbf{\exlabel~\theexampleno.}}% + \let\eq@fititin\eqfititin + \renewcommand\exrtnlabelformat{$\square$}% + \def\eqexheader@wrapper{\eqexheader}% + \SolutionsAfter + \begin{exercise*}[exampleno]}{\end{exercise*}} +% \end{macrocode} +% \end{environment} +% We set some parameters, to values better suited for the option. +% \begin{macrocode} +\setDefaultfvsizeskip{.1} +\nbaselineskip{4} +% \end{macrocode} +% \subsection{Commands in support of Solution Manuals} +% Generally, the solution manual source file should have the same +% packages as the source file for the book itself, perhaps with a few exceptions, +% but definitely the \textsf{eqexam} package is required with its \texttt{fortextbook} option. +% +% At this time, we provide only two commands, these are \cs{ftbInputBookAux} and +% \cs{ftbInputSolnFiles}. +% \begin{macro}{\ftbInputBookAux} +% This command is used to input the auxiliary files of the master source file. It takes +% one argument, the name of the master source file (\texttt{myBook.ltx} or \texttt{myBook.tex}). +% If the extension is not present, it is assumed to be \texttt{.tex}. +%\changes{v3.0f}{2011/08/13}{Added \cs{ftbInputBookAux} to support solution manual} +% \begin{macrocode} +\newcommand{\ftbInputBookAux}[1]{% + \filename@parse{#1}\@ifundefined{filename@ext}% + {\def\filename@ext{tex}}{}% + \xdef\tbBaseName{\filename@base}% + \xdef\tbSourceFile{\filename@base.\filename@ext}% +% \end{macrocode} +% In the next 4 lines, we save \cs{@writefile} and \cs{@setckpt}, and \cs{let} +% them to \cs{@gobbletwo}. We restore their definitions after we input the aux files. +% We include the aux files of the source file in case there are some cross references +% in the solution files, or the body of the text would like to refer back to the +% original book. (Seems unlikely.) +% \begin{macrocode} + \let\save@writefile\@writefile + \let\@writefile\@gobbletwo + \let\save@setckpt\@setckpt + \let\@setckpt\@gobbletwo + \makeatletter + \InputIfFileExists{\tbBaseName.aux}{% + \PackageInfo{eqexam} + {Inputting auxiliary files of\MessageBreak\tbSourceFile}% + }{% + \PackageError{eqexam} + {Auxiliary files for \tbSourceFile\space were not found} + {Compile the source file \tbSourceFile\space + three times\MessageBreak% + to create the required auxiliary files.}% + }% + \makeatother +% \end{macrocode} +% The solution files really shouldn't have a label, but if we do +% we'll save the {\LaTeX} definition of \cs{label}, and \cs{let} +% it two \cs{@gobble}. Within the body of the solutions, the +% command \cs{ftblabel} may be used to cross reference, if needed. +% +% \begin{macrocode} + \global\let\ftblabel\label + \let\label\@gobble + \let\@writefile\save@writefile + \let\@setckpt\save@setckpt +} +\@onlypreamble\ftbInputBookAux +% \end{macrocode} +% \begin{macro}{\restorelabel} +% \begin{macro}{\gobblelabel} +% These two are used to restore the usual definition of \cs{label}, and to +% cancel it out by letting it to \cs{@gobble}. +% \begin{macrocode} +\newcommand{\restorelabel}{\global\let\label\ftblabel} +\newcommand{\gobblelabel}{\let\label\@gobble} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\ftbInputSolnFiles} +% In the body of the text, place \cs{ftbInputSolnFiles} in vertical mode. +% This will input the \texttt{.sol} file of the master source document. +% The optional argument is the name of the solution file. The default name +% is \verb!\tbBaseName.sol!, where \cs{tbBaseName} was defined in +% \cs{ftbInputBookAux}. If no extension is specified, an extension of \texttt{.sol} +% is assumed. The original \texttt{.sol} may have changed its name, if someone +% renamed it (to keep it from being overwritten). The solution file may be editing (by hand) +% as needed. +%\changes{v3.0f}{2011/08/13}{Added \cs{ftbInputSolnFiles} to support solution manual} +% \begin{macrocode} +\newcommand{\ftbInputSolnFiles}[1][\tbBaseName.sol]{% + \filename@parse{#1}\@ifundefined{filename@ext}% + {\def\filename@ext{sol}}{}% + \xdef\tbBaseName{\filename@base}% + \xdef\tbSourceFile{\filename@base.\filename@ext}% + \InputIfFileExists{\tbBaseName.sol}{% + \PackageInfo{eqexam} + {Inputting solutions file \tbBaseName.sol\MessageBreak}% + }{% + \PackageError{eqexam} + {Solutions file for \tbSourceFile\space was not found}% + {Compile the source files three times}% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +% End of textbook segment +% +%<*ftbsty> +% \end{macrocode} +% \section{\textsf{fortextbook} Style File}\label{fortextbookstyle} +% One person said it would be nice to separate \textsf{eqexam} from the \texttt{fortextbook} option, and +% have \textsf{fortextbook} as a \texttt{separate} style (package). Rather than spending tens of hours separating them +% I create a simple ``wrapper'' package, which simply calls \textsf{eqexam} with the \texttt{fortextook} option along +% with all the recommended options. +%\changes{v3.0p}{2011/09/22}{Added the wrapper package fortextbook.} +%\par\medskip\noindent +% \textbf{Usage:} +%\begin{verbatim} +%\documentclass[twoside,letterpaper]{book} +%\usepackage[fleqn]{amsmath} +%\usepackage{fortextbook} +%... +%\end{verbatim} +% Below is the style. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{fortextbook} + [2012/03/14 v1.0 A fortextbook Package (dps)] +\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{eqexam}} +\ProcessOptions +\RequirePackage[% + ftbsolns,fortextbook,usecustomdesign, + forcolorpaper,noseparationrule,usexkv +]{eqexam} +% \end{macrocode} +% In support of this style, I've also defined \cs{NoSolutions} to compile the document +% without creating the solutions at the end of the file (this reduces the amount if IO +% when compiling). I've also defined a special option \texttt{nocustomdesign} which +% cancels out the \texttt{usecustomdesign} option. +% \begin{macrocode} +% End of ftbsty segment +% +%<*package> +% \end{macrocode} +% \begin{center} +% \rule{.67\linewidth}{.4pt} +% \end{center} +% \paragraph*{Input \texttt{eqtextb.def}.} +% Back in the main package, we choose this point to input the +% \texttt{fortextbook} code (\texttt{eqtextb.def}) if the +% \texttt{fortextbook} option is taken. +% \begin{macrocode} +\edef\ftbInputEqTextb{\ifeqfortextbook\noexpand + \InputIfFileExists{eqtextb.def}{}{}\fi} +\ftbInputEqTextb +% \end{macrocode} +% \begin{center} +% \rule{.67\linewidth}{.4pt} +% \end{center} +% +% \section{\textsf{xkeyval} Extensions} +% +% We load this material if \textsf{xkeyval} exists, and if the document author has specified +% the \texttt{usexkv} option. +% +% \texttt{2014/12/19} Now, the \texttt{usexkeys} is on by default. +% \begin{macrocode} +%\IfFileExists{xkeyval}{% +% \if\eq@usexkeys\eqe@YES\RequirePackage{xkeyval}\else +% \endinput\fi}{\endinput} +% \end{macrocode} +% We redefine selected commands if the user has specified the \texttt{usexkv} option. +% +%\paragraph*{New options for \cs{fillin}} +% \begin{macro}{underline} +% Underline the fillin +% \begin{macro}{u,b} +% Legacy parameters, underlines (\texttt{u}) or leaves a blank space (\texttt{b}) +% \begin{macro}{boxed} +% Boxes in the response region +% \begin{macro}{boxpretext} +% When boxed is use, use this to insert text in front of the answer, for example, \texttt{x=} +% \begin{macro}{boxsize} +% When boxed is taken, use boxsize to set the size of the box; permissible choices are +% tiny, scriptsize, footnotesize, small, normalsize, large, Large, LARGE, huge, Huge +% \begin{macro}{align} +% Align the answer within the response region, permissible values are \texttt{l}, \texttt{c}, \texttt{r}. +% \begin{macro}{color} +% The color of the response (named color) +% \begin{macro}{format} +% Special formatting for the answer, the default is \cs{bfseries} +% \begin{macro}{enclosesoln} +% This Boolean key only takes effect when the +% \texttt{boxed} key is used, and when either the \texttt{nosolutions} or the +% \texttt{vspacewithsolns} option is taken. When these conditions are +% met, a box is created around the solution (the third parameter of \cs{fillin}); the solution +% is enclosed in a \cs{phantom} so it is not seen, but the dimensions of the solution are used. +% This key allows you to create a box or arbitrary dimension. +%\changes{v2.0j}{2011/04/19}{added the \texttt{enclosesoln} key to \texttt{eqFillin} family.} +% \begin{macro}{fitwidth} +%\changes{v3.0i}{2011/08/18}{added the \texttt{fitwidth} key to \texttt{eqFillin} family.} +% The \texttt{fitwidth} option uses the natural width of the answer to create the fillin +% when the \texttt{answerkey} option is in effect; otherwise it uses the second parameter \texttt{\#2}. +% \begin{macro}{parbox} +% The \texttt{parbox} parameter may be used to create a multiline \cs{fillin} +% box. The value of \texttt{parbox} is the same as the first three parameters +% of the {\LaTeX} command \cs{parbox}, e.g., \verb!parbox={[t][.5in][t]}!. +% The value needs to be enclosed in braces. +% \changes{v3.0w}{2012/03/27}{Added \texttt{parbox}}% +% \begin{macro}{hiddenbox} +% When the \texttt{boxed} option is used, this option resets the \cs{fbox} +% parameters to \texttt{0pt}, making the box ``hidden.'' +%\changes{v3.0w}{2012/03/27}{Added \texttt{hiddenbox} options} +%\par\medskip\noindent +% Below are the \textsf{xkeyval} definitions of the keys recognized by \cs{fillin}. +%\changes{v4.5a}{2015/11/10}{Added some logic to the underline key} +% Add some logic to the \texttt{underline} key, now it is equivalent to the +% \texttt{b} key. +% \begin{macrocode} +\define@boolkey{eqFillin}{underline}[true]{} +\define@key{eqFillin}{u}[]{\KV@eqFillin@underlinetrue} +\define@key{eqFillin}{b}[]{\KV@eqFillin@underlinefalse} +\define@boolkey{eqFillin}{boxed}[true]{} +\define@key{eqFillin}{boxpretext}[]{\def\eq@fillintext{#1}} +\let\eq@fillintext\@empty +% \end{macrocode} +% If the user just says \texttt{parbox,...} the value of +% \cs{eq@fillinparbox} is \cs{relax}. If \texttt{parbox} +% does not appear in the option list, \cs{eq@fillinparbox} +% has a default value of \cs{@empty}. In this way, we can +% distinguish between \texttt{parbox} with the empty value, +% and \texttt{parbox} not present at all. +% \begin{macrocode} +\define@key{eqFillin}{parbox}[\relax]{\def\eq@fillinparbox{#1}} +\let\eq@fillinparbox\@empty +\define@key{eqFillin}{hiddenbox}[]{% + \def\eq@fillinhiddenbox{% + \setlength{\fboxrule}{0pt}\setlength{\fboxsep}{0pt}}} +\let\eq@fillinhiddenbox\@empty +\define@boolkey{eqFillin}{enclosesoln}[true]{} +\define@choicekey+{eqFillin}{boxsize}{tiny,scriptsize,footnotesize,% + small,normalsize,large,Large,LARGE,huge,Huge}[normalsize]{% + \def\eq@eqFillin@boxsize{\text{\csname#1\endcsname\strut}}% +}{\PackageWarning{eqexam}{Bad choice for boxsize, permissible values + are tiny, scriptsize, footnotesize, small, normalsize, + large, Large, LARGE, huge and Huge. Try again}} +\def\eq@eqFillin@boxsize{\text{\normalsize\strut}} +% \end{macrocode} +% \changes{v5.1g}{2018/02/14}{Added \string\texttt{fontsize} and \string\texttt{fboxsep} keys} +% \begin{macrocode} +\define@key{eqFillin}{fboxsep}[3pt]{\def\eq@fillin@fboxsep{#1}} +\def\eq@fillin@fboxsep{3pt} +\define@choicekey+{eqFillin}{fontsize}{tiny,scriptsize,footnotesize,% + small,normalsize,large,Large,LARGE,huge,Huge}[normalsize]{% + \def\eq@eqFillin@fontsize{\csname#1\endcsname}% +}{\PackageWarning{eqexam}{Bad choice for boxsize, permissible values + are tiny, scriptsize, footnotesize, small, normalsize, + large, Large, LARGE, huge and Huge. Try again}} +\def\eq@eqFillin@fontsize{\ifmmode\else\normalsize\fi} +\define@key{eqFillin}{color}[\eq@fillinColor]{\edef\eq@fillin@color{#1}} +% \end{macrocode} +% \changes{v3.0x}{2012/04/03}{Added \cs{eqe@align@hfill} to \texttt{align} property. +% used to set position of content when \texttt{parbox} is used.} +% \begin{macrocode} +\define@choicekey+{eqFillin}{align}[\val\nr]% + {l,r,c}[\eq@eqFillin@align@default]{% + \def\eq@eqFillin@align{#1}% + \ifcase\nr\relax + \def\eqe@align@hfill{}\or + \def\eqe@align@hfill{\hfill}\or + \def\eqe@align@hfill{\hfil}\fi + }{% + \PackageWarning{eqexam}{Bad choice for align, permissible values + are l, r, and c. Try again}} +\let\eqe@align@hfill\relax +% \end{macrocode} +% \DescribeMacro{defaultalign} is used to change the values of the default macros +% \cs{eq@eqFillin@align@default} and \cs{eqe@align@hfill@default} for the \texttt{align} key together. +% \begin{macrocode} +\define@choicekey+{eqFillin}{defaultalign}[\val\nr]{l,r,c}[c]{% + \def\eq@eqFillin@align@default{#1}% + \ifcase\nr\relax + \def\eqe@align@hfill@default{}\or + \def\eqe@align@hfill@default{\hfill}\or + \def\eqe@align@hfill@default{\hfil}\fi + }{% + \PackageWarning{eqexam}{Bad choice for defaultalign, permissible + values are l, r, and c. Try again}} +\setkeys{eqFillin}{defaultalign=c} +% \end{macrocode} +% \DescribeMacro{\fillInFormatDefault} is the default fill-in format +% \begin{macrocode} +\renewcommand{\fillInFormatDefault}{\normalfont} +\define@key{eqFillin}{format}[\fillInFormatDefault]{% + \def\eq@fillin@format{#1}} +\def\eq@fillin@format{\bfseries} +\def\eqe@fbox@corr#1{#1-2\fboxsep-2\fboxrule} +\define@boolkey{eqFillin}{fitwidth}[true]{} % +% \end{macrocode} +% \begin{macro}{boxcmd} +% The \texttt{boxcmd} key is used to define a boxing command. The default +% is either \cs{boxed} or \cs{fbox}. You can say +% |boxcmd={\fboxcolor{blue}{yellow}}| to obtain a box with a blue frame +% and yellow background. +%\changes{v3.1c}{2012/07/30}{Added boxcmd to \cs{fillin}} +% \begin{macrocode} +\@ifundefined{boxed}{% + \def\eq@fillin@defaultbox{\fbox}% + \def\eq@fillin@boxcmd{\fbox}% + }{% + \def\eq@fillin@defaultbox{\boxed}% + \def\eq@fillin@boxcmd{\boxed}% + } +% \end{macrocode} +% \begin{macro}{ulcmd} +% The \texttt{ulcmd} key is used to define a underlining command. The default +% is either \texttt{underline} or \texttt{underbar}. You can say +% |ulcmd=underline| to obtained an underline using \cs{underline}. +%\changes{v3.1c}{2012/07/30}{Added ulcmd to \cs{fillin}} +% \begin{macrocode} +\define@key{eqFillin}{boxcmd}% + [\eq@fillin@defaultbox]{\def\eq@fillin@boxcmd{#1}} +\@ifundefined{underbar}{% + \def\eq@fillin@defaultul{underline}% + \def\eq@fillin@ulcmd{\underline}% + }{% + \def\eq@fillin@defaultul{underbar}% + \def\eq@fillin@ulcmd{\underbar}% + } +% \end{macrocode} +% (2017/01/28) Added custom underline option, the author must define \cs{ulcustom} and specify +% \texttt{ulcmd=custom}. +% \changes{v4.6c}{2017/01/28}{added custom underline option} +% \begin{macrocode} +\edef\ulcustom{\expandafter\noexpand\eq@fillin@ulcmd} +\edef\temp@exp{\noexpand +\define@choicekey+{eqFillin}{ulcmd} + {underbar,underline,custom}[\eq@fillin@defaultul]} +\temp@exp{\def\@rgi{#1}\def\eq@custom{custom}\ifx\@rgi\eq@custom + \def\eq@fillin@ulcmd{\@nameuse{ulcustom}}\else + \def\eq@fillin@ulcmd{\@nameuse{#1}}\fi +}{\PackageWarning{aeb}{Bad choice for ulcmd, permissible values + are underbar and underline. Try again}} +% \end{macrocode} +% (2013/02/16) \DescribeMacro{lift}\texttt{lift} lifts (actually lowers) the underline by the amount specified. +% \DescribeMacro{autolift}\texttt{autolift} measures the depth of the content and lifts +% (actually lowers) the underline by that amount. \DescribeMacro{addtoautolift}\texttt{addtoautolift} +% works with \texttt{autolift} to add the specified amount to the amount of lift as calculated +% by \texttt{autolift}. +% \begin{macrocode} +\define@key{eqFillin}{lift}[-1sp]{\def\eq@fillin@lift{#1}} +\define@boolkey{eqFillin}{autolift}[true]{} % +\define@key{eqFillin}{addtoautolift}[0pt]{% + \def\eq@fillin@addtoautolift{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% The macro \cs{eqe@getiiiOpts} is based on early parsing code of \cs{parbox}. +% It picks up three optional parameters and saves their values under the +% commands \cs{eqe@opts@argi}, \cs{eqe@opts@argii}, \cs{eqe@opts@argiii}. +% We are interested in \cs{eqe@opts@argiii}, which specifies the depth of +% the \cs{parbox}. If the \texttt{boxed} option is taken, we reduce the value +% of \cs{eqe@opts@argiii} by \texttt{2\string\fboxsep+2\string\fboxrule} so +% that the height will be exactly as specified. The macro \cs{eqe@getiiiOpts} +% is used with the \texttt{parbox} option of \cs{fillin}. +% The macro \cs{eqe@getiiiOpts} has syntax: +%\begin{quote} +% \cs{eqe@getiiiOpts[\meta{pos}][\meta{height}][\meta{inner-pos}]} +%\end{quote} +% \begin{macrocode} +\def\eqe@getiiiOpts{% + \@ifnextchar[%] + \i@eqe@getiiiOpts + {\iii@eqe@getiiiOpts{c}{\relax}[s]}} +% \end{macrocode} +% Get \meta{pos} +% \begin{macrocode} +\def\i@eqe@getiiiOpts[#1]{% + \@ifnextchar[%] + {\ii@eqe@getiiiOpts{#1}}% + {\iii@eqe@getiiiOpts{#1}{\relax}[s]}} +% \end{macrocode} +% Get \meta{height} +% \begin{macrocode} +\def\ii@eqe@getiiiOpts#1[#2]{% + \@ifnextchar[%] + {\iii@eqe@getiiiOpts{#1}{#2}}% + {\iii@eqe@getiiiOpts{#1}{#2}[#1]}} +% \end{macrocode} +% Get \meta{inner-pos} +% \begin{macrocode} +\def\iii@eqe@getiiiOpts#1#2[#3]{% + \def\eqe@opts@argi{#1}% + \def\eqe@opts@argii{#2}% + \def\eqe@opts@argiii{#3}} +% \end{macrocode} +% \paragraph*{Redefine the \cs{fillin} command} +% \begin{macro}{\fillin} +% Re-worked \cs{fillin} to have \textsf{xkeyval} in the optional first parameter. +% The syntax is illustrated below. +%\begin{verbatim} +% \fillin[ +% underline=true|false,u,b,boxed=true|false,boxpretext=, +% align=l|r|c,boxsize=\tiny|..\normalsize|\large|...|\Huge, +% color=,format=<\bfseries|\ttfamily|\Large|whatever> +% ]{}{} +%\end{verbatim} +% \changes{v4.5}{2015/11/10}{Added \cs{setfillinDefaults}} +% \DescribeMacro{\setfillinDefaults}\cmd{\setfillinDefaults} sets any default +% options for \cs{fillin} the document author wants. +% \begin{macrocode} +\newcommand{\setfillinDefaults}[1]{\def\eqe@argi{#1}\ifx\eqe@argi\@empty + \let\eqe@setfillinDefaults\@empty\else + \def\eqe@setfillinDefaults{#1}\fi} +\let\eqe@setfillinDefaults\@empty +% \end{macrocode} +% The \DescribeMacro\fillineol\cs{fillineol} command is used to extend the \cs{fillin} box or line +% to the end of the line. +%\begin{flushleft}\ttfamily +%\quad\string\fillineol*\darg{\ameta{phrase}}[\ameta{opts}]\darg{\ameta{ans}} +% \end{flushleft} +% Normally, \cs{fillineol} is placed at the beginning of a line. The command measures the length +% of \texttt{\darg{\ameta{phrase}}}, subtracts this from \cs{linewidth} and uses this value +% as the width of the underlying \cs{fillin}. When the star-form is used, the \textsf{collectbox} package +% is required; in the star-form, \ameta{phrase} can contain verbatim text. +% \changes{v5.1h}{2018/02/18}{Added \string\cs{mtoeol}} +% \changes{v5.1i}{2018/02/19}{Changed name to \string\cs{fillineol} and changed order of arguments} +% \begin{macrocode} +\AtBeginDocument{\@ifpackageloaded{collectbox} + {\let\eqe@cb\eqe@YES}{\let\eqe@cb\eqe@NO}} +\def\fillineolTooLongMsg{\PackageWarning{eqexam}{% + The 'phrase' you are measuring is longer than\MessageBreak + \string\linewidth. Changing length to 0pt in hopes you\MessageBreak + can fix things}} +\def\fillineolNoCBMsg{\PackageWarning{eqexam}{% + For the \string\fillineol*\space form, the + collectbox package\MessageBreak + is required, but not loaded at this time.\MessageBreak + Switching to \string\fillineol\space in hopes you + load collectbox\MessageBreak + next time or you remove the star-option if not\MessageBreak + really needed}} +\newcommand\fillineol{\@ifstar{\ifx\eqe@cb\eqe@YES + \let\eqe@next\cbfillineol\else + \def\eqe@next{\fillineolNoCBMsg\fillineol@i}\fi + \eqe@next}{\fillineol@i}} +\newcommand{\fillineol@i}[1]{\bgroup\setbox\z@\hbox{#1}\fillineol@ii} +\newcommand\fillineol@ii[2][]{\setlength\eqetmplengthb{\linewidth-\wd\z@}% + \ifdim\eqetmplengthb<0pt\eqetmplengthb0pt\fillineolTooLongMsg\fi + \unhbox\z@\fillin[#1]{\eqetmplengthb}{#2}\egroup} +\newcommand\cbfillineol{\bgroup\collectboxto{\@tempboxa} + {\setlength{\eqetmplengthb}{\linewidth-\wd\@tempboxa}% + \ifdim\eqetmplengthb<0pt\eqetmplengthb0pt\fillineolTooLongMsg\fi + \unhbox\@tempboxa\cbfillineol@i}} +\newcommand\cbfillineol@i[2][]{\fillin[#1]{\eqetmplengthb}{#2}\egroup} +% \end{macrocode} +% We finally begin the \DescribeMacro\fillin\cs{fillin} command. +% \begin{macrocode} +\renewcommand{\fillin}[3][]{\begingroup +% \end{macrocode} +% \cs{ifsp@expand} is defined in \textsf{spdef} package. This is a version +% if \cs{ifsp} that expands correctly in an \cs{edef}. +% \begin{macrocode} + \expandafter\let\expandafter\ifsp\csname ifsp@expand\endcsname +% \end{macrocode} +% Get the keys indicated by the document author. +% \begin{macrocode} + \setkeys{eqFillin}{boxsize,underline=true,boxed=false,% + boxpretext,color,format,enclosesoln=false,fitwidth=false,lift,% + autolift=false,addtoautolift}% + \ifx\eqe@setfillinDefaults\@empty\else + \protected@edef\eq@temp@exp{\noexpand + \setkeys{eqFillin}{\eqe@setfillinDefaults}}% + \eq@temp@exp + \fi + \protected@edef\eq@temp@exp{\noexpand\setkeys{eqFillin}{#1}}% + \eq@temp@exp + \fboxsep\eq@fillin@fboxsep\relax +% \end{macrocode} +% If boxed, we turn underlining off +% \begin{macrocode} + \ifKV@eqFillin@boxed\KV@eqFillin@underlinefalse\fi +% \end{macrocode} +% Put \cs{eq@fillin@lift} to \texttt{-2sp} as a signal not to use +% the \texttt{lift} value in the case the author specified \texttt{autofill} +% and \texttt{lift}. +% \begin{macrocode} + \ifKV@eqFillin@autolift\def\eq@fillin@lift{-2sp}\fi +% \end{macrocode} +% Get the second parameter. +% \changes{v5.1h}{2018/02/18}{Added test, 0pt same as empty width} +% \begin{macrocode} + \edef\eqe@argii{#2}\ifx\eqe@argii\@empty\else + \ifdim\eqe@argii=0pt\let\eqe@argii\@empty\fi\fi +% \end{macrocode} +% We reset \cs{fboxrule} and \cs{fboxsep} as needed. +% \begin{macrocode} + \eq@fillinhiddenbox +% \end{macrocode} +% If the document author uses the \texttt{hiddenbox} option, +% this option assumes the \texttt{boxed} option as well so we'll +% set \cs{KV@eqFillin@boxedtrue} to signal the \texttt{boxed} option. +% \begin{macrocode} + \ifx\eq@fillinhiddenbox\@empty\else + \KV@eqFillin@boxedtrue\fi +% \end{macrocode} +% If the \texttt{parbox} option is taken, we define the third parameter +% to be wrapped in a \cs{parbox}. +% \begin{macrocode} + \ifx\eq@fillinparbox\@empty\def\eqe@argiii{#3}\else +% \end{macrocode} +% If \texttt{parbox} is specified, we make \texttt{align=l} the default. +% \begin{macrocode} + \ifx\eqe@align@hfill\relax + \def\eq@eqFillin@align{l}\def\eqe@align@hfill{}\fi +% \end{macrocode} +% If \texttt{parbox} is specified, we get its three optional +% parameters so we can manipulate the width parameter. +% \begin{macrocode} + \expandafter\eqe@getiiiOpts\eq@fillinparbox\relax +% \end{macrocode} +% Now, if this is to be \texttt{boxed}, we reduce the height +% of the box (\cs{boxed} increases the height by +% \texttt{2\string\fboxrule+2\string\fboxrule} +% \begin{macrocode} + \ifKV@eqFillin@boxed +% \end{macrocode} +% \cs{eqe@opts@argii} has a value of \cs{relax} if the document author +% did not specify a height for the box. +% \begin{macrocode} + \expandafter\ifx\eqe@opts@argii\relax\else + \edef\eqe@opts@argii{\expandafter + \eqe@fbox@corr\expandafter{\eqe@opts@argii}}\fi + \fi +% \end{macrocode} +% We need to feed \cs{parbox} the parameters it expects, so, if the +% height parameter is not given, we just pass the first argument; +% otherwise, we pass all three parameters. +% \begin{macrocode} + \edef\eqe@parboxOptArgs{[\eqe@opts@argi]% + \expandafter\ifx\eqe@opts@argii\relax\else + [\eqe@opts@argii][\eqe@opts@argiii]\fi}% +% \end{macrocode} +% Now we build the third parameter, \cs{eqe@argiii}. +% \begin{macrocode} + \def\eqe@argiii{\expandafter\parbox\eqe@parboxOptArgs{\eqe@bw}% +% \end{macrocode} +% We insert \cs{eqe@align@hfill}, which is synchronized to the value of +% the \texttt{align} key to move the \cs{parbox} contents to left aligned, centered, +% or right aligned. \cs{eqe@align@hfill} will only be effective if \texttt{\#3} is +% enclosed in a narrower box. +% \begin{macrocode} + {\eqe@align@hfill\ifKV@eqFillin@boxed\eq@fillintext\fi#3}}% + \fi +% \end{macrocode} +% If \cs{eqe@align@hfill} is still equal to \cs{relax}, give it the default +% value. +% \begin{macrocode} + \ifx\eqe@align@hfill\relax + \def\eq@eqFillin@align{c}% + \edef\eqe@align@hfill{\eqe@align@hfill@default}\fi + \ifmmode\let\@eqmath\ensuremath\else\let\@eqmath\text\fi +% \end{macrocode} +% We re-calculate the width of the formatted box +% \begin{macrocode} + \ifx\eq@fillinparbox\@empty + \ifx\eqe@argii\@empty +% \end{macrocode} +% If no \texttt{parbox} option and if the second argument is empty, +% we set width based on the natural width of \texttt{\#3} +% \begin{macrocode} + \settowidth{\eqetmplengthb}{\@eqmath{\eq@eqFillin@fontsize + \eq@fillin@format\ifKV@eqFillin@boxed\eq@fillintext\fi + \eqe@argiii}}% + \ifKV@eqFillin@boxed + \setlength{\eqetmplengthb}{% + \eqetmplengthb+2\fboxsep+2\fboxrule}% + \fi + \else +% \end{macrocode} +% If \texttt{\#2} is nonempty, we use this value. +% \begin{macrocode} + \setlength{\eqetmplengthb}{#2}% + \fi + \else +% \end{macrocode} +% \texttt{parbox} option with empty second argument, use \cs{linewidth}. +% for width +% \begin{macrocode} + \ifx\eqe@argii\@empty + \setlength{\eqetmplengthb}{\linewidth}% + \PackageWarning{eqexam}{Parameter \#2 + is empty with parbox option,\MessageBreak + using \string\linewidth\space for width% + }% + \else +% \end{macrocode} +% \texttt{parbox} option with second argument, use \texttt{\#2} +% for width +% \begin{macrocode} + \setlength{\eqetmplengthb}{#2}% + \fi + \fi +% \end{macrocode} +% Return \cs{ifsp} to its default definition. +% \begin{macrocode} + \expandafter\let\expandafter\ifsp\csname ifsp@default\endcsname +% \end{macrocode} +% Save the final calculated width as \cs{eqe@bw}. +% \begin{macrocode} + \edef\eqe@bw{\the\eqetmplengthb}% +% \end{macrocode} +% Set the underline option, \dots +% \begin{macrocode} + \ifKV@eqFillin@underline\let\@fillinFmt\eq@fillin@ulcmd + \else\let\@fillinFmt\relax\fi +% \end{macrocode} +% however, if \texttt{parbox} is specified, we remove the underlining, +% if any. +% \begin{macrocode} + \ifx\eq@fillinparbox\@empty\else + \ifKV@eqFillin@underline\let\@fillinFmt\relax +% \ifx\@fillinFmt\underbar\let\@fillinFmt\relax + \PackageInfo{eqexam}{Removing underline option, not permissible + \MessageBreak with parbox option}% + \fi\fi +% \end{macrocode} +% \paragraph*{Build the \cs{fillin} box.} After the preliminaries, we +% create the requested answer field. We begin by building the answer +% field for the case of \cs{ifeq@proofing} is true (which occurs when +% the \texttt{answerkey} is used. +% \begin{macrocode} + \ifeq@proofing + \ifKV@eqFillin@fitwidth +% \end{macrocode} +% If the \texttt{fitwidth} option is taken, we measure the width +% of the box. Ignored when the \texttt{parbox} option is used. +% \begin{macrocode} + \settowidth{\eqetmplengthb}{\@eqmath{\eq@fillin@format + \ifx\eq@fillinparbox\@empty\ifKV@eqFillin@boxed + \eq@fillintext\fi\fi\eqe@argiii}}% +% \end{macrocode} +% If boxed, we increase the width by +% \texttt{2\string\fboxsep+2\string\fboxrule}; when content is \cs{boxed}, +% the dimensions are reduced. +% \begin{macrocode} + \ifKV@eqFillin@boxed + \setlength{\eqetmplengthb}{% + \eqetmplengthb+2\fboxsep+2\fboxrule}% + \fi + \edef\eqe@bw{\the\eqetmplengthb}% + \fi +% \end{macrocode} +% We build the fill-in field for the case of \texttt{boxed}. +% \begin{macrocode} + \ifKV@eqFillin@boxed + \ifmmode\let\@eqmath\ensuremath\else\let\@eqmath\text\fi +% \mbox{\eq@fillin@format\ensuremath{\boxed{% + \setbox\z@\hbox{\@eqmath{\eq@fillin@boxcmd{% +% \eq@fillin@format\ensuremath{\eq@fillin@boxcmd{% + \eq@eqFillin@boxsize + \@fillinFmt{\eq@eqFillin@fontsize % dpsf0214 + \ifKV@eqFillin@boxed + \edef\eqe@bw{\eqe@fbox@corr{\eqe@bw}}% + \fi +% \end{macrocode} +% \changes{v2.0h}{2011/04/14}{Modified the calculation of the width +% of \cs{fillin}, the width of enclosing box now equals the requested +% width} +% When the boxed option is taken, we adjust the width of the \cs{makebox} +% to get the desired width \texttt{\#2}. +% \begin{macrocode} + \makebox[\eqe@bw][\eq@eqFillin@align]{\strut + \@eqmath{\eq@fillin@format\color{\eq@fillin@color}% + \ifx\eq@fillinparbox\@empty + \eq@fillintext\fi\eqe@argiii}}% + }% end \@fillinFmt + }}}% end \mbox + \setlength{\@tempdima}{\ht0+\dp0}% + \xdef\fillinTotalHeight{\the\@tempdima}% + \mbox{\unhbox\z@}% + \else +% \end{macrocode} +% The content is not to be boxed. +% \begin{macrocode} + \ifmmode\let\@eqmath\ensuremath\else\let\@eqmath\relax\fi + \setbox\z@\hbox{\eq@eqFillin@fontsize % dpsf0214 +% \end{macrocode} +% A value of \texttt{-1sp} signals that \texttt{lift} has not been specified, +% nor has \texttt{autofill} been specified. So we use the usual code for underlining. +% \begin{macrocode} + \ifdim\eq@fillin@lift=-1sp\relax + \@fillinFmt{\makebox[\eqe@bw][\eq@eqFillin@align]{\strut + \color{\eq@fillin@color}% + \@eqmath{\eq@fillin@format\eqe@argiii}}}% + \else +% \end{macrocode} +% (2014/02/16) The \texttt{autolift} or \texttt{lift} keys are specified. +% If \texttt{autofill}, put contents in a box. Set \cs{@tempdima} to +% \texttt{\cs{dp2}+\cs{eq@fillin@addtoautolift}}, the latter normally has +% a value of \texttt{0pt} unless specified on the option list. +% \begin{macrocode} + \ifKV@eqFillin@autolift + \setbox2=\hbox{\@eqmath{\eq@fillin@format\eqe@argiii}}% + \setlength{\@tempdima}{\dp2+\eq@fillin@addtoautolift}% + \edef\eq@fillin@lift{\the\@tempdima}\fi +% \end{macrocode} +% (2014/02/16) We lower by an amount of \cs{eq@fillin@lift}, but raise the context +% by that same amount. +% \begin{macrocode} + \raisebox{-\eq@fillin@lift}{\@fillinFmt{% + \makebox[\eqe@bw][\eq@eqFillin@align]{\strut + \color{\eq@fillin@color}% + \raisebox{\eq@fillin@lift}{\@eqmath{\eq@fillin@format + \eqe@argiii}}}}}% + \fi + }\setlength{\@tempdima}{\ht0+\dp0}% + \xdef\fillinTotalHeight{\the\@tempdima}% + \mbox{\unhbox\z@}% + \fi + \else +% \end{macrocode} +% We begin the case of not \cs{ifeq@proofing}, that is, the document author +% is not compiling with the \texttt{answerkey} option. +% \begin{macrocode} + \ifKV@eqFillin@boxed +% \mbox{\eq@fillin@format\ensuremath{\boxed{% +% \eq@fillin@format\ensuremath{\eq@fillin@boxcmd{% + \setbox\z@\hbox{\eq@eqFillin@fontsize % dpsf0214 + \@eqmath{\eq@fillin@format + \eq@fillin@boxcmd{\eq@eqFillin@boxsize\ifeq@nosolutions + \rlap{\@eqmath{\eq@eqFillin@fontsize % dpsf0214 + \eq@fillintext}}\fi + \ifvspacewithsolns % dpsf0214 \eq@eqFillin@fontsize + \rlap{\@eqmath{\eq@eqFillin@fontsize\eq@fillintext}}\fi + \@fillinFmt{% +% \end{macrocode} +% We do a similar thing if proofing is not active (\texttt{nosolutions} is taken). +% \begin{macrocode} + \makebox[\eqe@fbox@corr{\eqe@bw}]{% + \ifKV@eqFillin@enclosesoln\phantom + {\setlength\eqetmplengthb{\eqe@bw-2\fboxsep}% + \edef\eqe@bw{\the\eqetmplengthb}% + \@eqmath{\eqe@argiii}}\else + \strut\hfill\fi + }% + }%end \@fillinFmt + }}}% end \hbox + \setlength{\@tempdima}{\ht0+\dp0}% + \xdef\fillinTotalHeight{\the\@tempdima}% + \mbox{\unhbox\z@}% + \else +% \end{macrocode} +% This is the case where the field is \emph{not} boxed. +% \begin{macrocode} + \setbox\z@\hbox{\eq@eqFillin@fontsize % dpsf0214 + \ifdim\eq@fillin@lift=-1sp\relax + \@fillinFmt{\makebox[\eqe@bw]{% +% \phantom{\@eqmath{\eqe@argiii}} + \strut\hfil}}% + \else + \ifKV@eqFillin@autolift + \setbox2=\hbox{\@eqmath{\eq@fillin@format + \eqe@argiii}}% + \setlength{\@tempdima}% + {\dp2+\eq@fillin@addtoautolift}% + \edef\eq@fillin@lift{\the\@tempdima}\fi + \raisebox{-\eq@fillin@lift}{\@fillinFmt{% + \makebox[\eqe@bw]{\raisebox{\eq@fillin@lift} + {\phantom{\@eqmath{\eq@fillin@format + \eqe@argiii}}\strut\hfil}}}}% + \fi + }\setlength{\@tempdima}{\ht0+\dp0}% + \xdef\fillinTotalHeight{\the\@tempdima}% + \mbox{\unhbox\z@}% + \fi +% \end{macrocode} +% \paragraph*{Online Code.} If the \texttt{quiz} environment is defined, +% and the user has asked for \texttt{online} option we build a text field. +% \begin{macrocode} + \@ifundefined{@quiz}{}{% + \if\eq@online\eqe@YES\relax + \ifeq@nosolutions + \ifeq@solutionsafter\else + \ifx\eq@insertverticalspace\eqe@YES\relax +% \end{macrocode} +% OK, we get this far if we choose \texttt{online} (or higher) and +% if \texttt{nosolutions} (which includes the \texttt{vspacewithsolns} +% option). We require \cs{eq@insertverticalspace} to be \texttt{y}. +% This last value is the default (\cs{SpaceToWork}). +% \begin{macrocode} + \stepcounter{@cntfillin}% + \edef\fieldName{% + \if\probstar*eqexam.\curr@quiz.fillin.% + \theeqquestionnoi.part\thepartno.% + fi\the@cntfillin% + \else + eqexam.\curr@quiz.fillin.% + \theeqquestionnoi.fi\the@cntfillin% + \fi + }\ifx\eq@fillinparbox\@empty +% \end{macrocode} +% If the \texttt{parbox} option is not taken, we build a text field with height \texttt{11bp} +% \begin{macrocode} + \raisebox{-1bp}{\makebox[0pt][r]{% + \textField[\BC{}\presets{\eqe@optsFillIn}] + {\fieldName}{#2}{\fillinTotalHeight}}}\else +% \end{macrocode} +% If the user has taken the \texttt{parbox} option, then the text field becomes a multiline +% field, with height equal to the requested height. +% \begin{macrocode} + \setlength{\@tempdima}% + {\eqe@opts@argii+2\fboxrule+2\fboxsep}% + \raisebox{-1bp}{\makebox[0pt][r]{% + \textField[\BC{}\presets{\eqe@optsFillIn} + \Ff{\FfMultiline}]{\fieldName}{#2} + {\fillinTotalHeight}}}\fi + \fi + \fi + \fi + \fi + }% +% \end{macrocode} +% \changes{v5.1d}{2018/02/02}{removed \string\cs{space}\string\cs{ignorespaces} from \string\cs{fillin}} +% Removed |\space\ignorespaces| +% \begin{macrocode} + \fi\endgroup} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\TF} +% The \cs{TF} command depends on \cs{fillin}, so we make the appropriate changes. +% \begin{macrocode} +\renewcommand\TF[2][\defaultTFwidth]{% + \def\eqe@next{\fillin[underline]{#1}{#2}}% + \ifdim\eq@extralabelsep=0pt\relax\else + \if\probstar*\relax\if\exerwparts@cols0 + \def\eqe@next{\makebox[0pt][r]{% + \fillin[underline]{#1}{#2}}\ignorespaces}% + \fi\fi\fi\eqe@next +} +% \end{macrocode} +% \end{macro} +% This marks the end of the \textsf{eqexam} package. dps +% \begin{macrocode} +% +% \end{macrocode} +\endinput + + + +\renewenvironment{solnexer@woparts}[1][]{\gdef\sameVspace{#1}% + \def\eqe@next{\expandafter\solutionFLSAVE\expandafter[#1]}% + \global\gridpgbrkfalse + \if@eqlinedfiller + \ifKV@eqefillLines@bgonly\leavevmode\fi + \ifanswerkey\turnfl@nskeyOnOff % dps16 + \ifeqe@flextended + \def\eqe@next{\vspacewithkeyOff + \vbadness=10000 +% \end{macrocode} +% When conditions are right (\opt{answerkey} is in force and \cs{ifeqe@flextended} is true), +% we take the contents of the \env{solution} environment and place it in the +% box \cs{eqe@anskeyflsplit}. +% \begin{macrocode} + \fl@getcontent + \ifx\exsolafter\@empty\else + \noindent\exsolafter\space\ignorespaces\fi + }% + \fi + \fi + \fi + \eqe@next +}{% + \let\eqe@next\endsolutionFLSAVE + \if@eqlinedfiller + \ifanswerkey + \ifeqe@flextended + \ifcont@nnot + \def\eqe@next{\fls@vebaselinelineskip % dps22 + \egroup % end of \setbox\eqe@nskeyflsplit + \let\exsolafter\@empty + \def\solnsafterSkipAmt{-\baselineskip}% + \expandafter\solutionFLSAVE + \expandafter[\sameVspace]\endsolutionFLSAVE + }% + \else + \PackageWarning{eqexam}{For solutions to appear, + you must first\MessageBreak + expand \string\turnContAnnotOn}% + \fi + \fi + \fi + \fi + \eqe@next +} + + \ifcont@nnot + \def\eqe@next{\fls@vebaselinelineskip % dps22 + \egroup % end of \setbox\eqe@nskeyflsplit + \let\exsolafter\@empty + \def\solnsafterSkipAmt{-\baselineskip}% + \expandafter\solutionFLSAVE + \expandafter[\sameVspace]\endsolutionFLSAVE + }% + \else + \PackageWarning{eqexam}{For solutions to appear, + you must first\MessageBreak + expand \string\turnContAnnotOn}% + \fi diff --git a/macros/latex/contrib/eqexam/eqexam.ins b/macros/latex/contrib/eqexam/eqexam.ins new file mode 100644 index 0000000000..a5fd9e5387 --- /dev/null +++ b/macros/latex/contrib/eqexam/eqexam.ins @@ -0,0 +1,63 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 2005--2018 D. P. Story +%% +%% This file is part of the `AcroTeX eDucation Bundle'. +%% ------------------------------------------- +%% +%% It may be distributed under the conditions of the LaTeX Project Public +%% License, either version 1.2 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.2 or later is part of all distributions of LaTeX +%% version 1999/12/01 or later. +%% +%% --------------- start of docstrip commands ------------------ +%% +\def\filedate{2018/02/19} +\def\batchfile{eqexam.ins} +\input docstrip + +\ifx\generate\undefined + \Msg{**********************************************} + \Msg{*} + \Msg{* This installation requires docstrip} + \Msg{* version 2.4 or later.} + \Msg{*} + \Msg{* An older version of docstrip has been input} + \Msg{*} + \Msg{**********************************************} + \errhelp{Move or rename old docstrip.tex and get a newer one.} + \errmessage{Old docstrip in input path} + \batchmode + \csname @@end\endcsname\end +\fi + +\keepsilent +\askforoverwritefalse +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\preamble +\endpreamble + +\generate{% + \file{eqexam.sty}{\from{eqexam.dtx}{copyright,package}} + \file{eqalone.def}{\from{eqexam.dtx}{copyright,standalone}} + \file{eqtextb.def}{\from{eqexam.dtx}{copyright,textbook}} + \file{fortextbook.sty}{\from{eqexam.dtx}{copyright,ftbsty}} + \file{flextended.def}{\from{eqexam.dtx}{copyright,flextended}} + \file{eqexam.drv}{\from{eqexam.dtx}{copyright,driver}} +} +\Msg{***************************************************************} +\Msg{*} +\Msg{* \space To finish the installation you have to copy the files } +\Msg{*} +\Msg{* \space *.sty, *.cfg and *.def into a directory searched by TeX} +\Msg{*} +\Msg{***************************************************************} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\endinput diff --git a/macros/latex/contrib/eqexam/examples/coorplane.eps b/macros/latex/contrib/eqexam/examples/coorplane.eps new file mode 100644 index 0000000000..5ca2b1eeb6 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/coorplane.eps @@ -0,0 +1,9923 @@ +%!PS-Adobe-3.1 EPSF-3.0 +%ADO_DSC_Encoding: Windows Roman +%%Title: coorplane.pdf +%%Creator: Adobe Acrobat 10.0.1 +%%For: D. P. Story +%%CreationDate: 4/8/2011, 3:22:34 PM +%%BoundingBox: -1 0 273 191 +%%HiResBoundingBox: 0 0 272.7656 190.2490 +%%CropBox: 0 0 272.7656 190.2490 +%%LanguageLevel: 2 +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentNeededFeatures: (atend) +%%DocumentSuppliedFeatures: (atend) +%%DocumentData: Clean7Bit +%%Pages: (atend) +%%DocumentProcessColors: Black +%%DocumentCustomColors: (atend) +%%EndComments +%%BeginDefaults +%%ViewingOrientation: 1 0 0 1 +%%EndDefaults +%%BeginProlog +%%BeginResource: procset Adobe_AGM_Utils 1.0 0 +%%Version: 1.0 0 +%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{currentpacking true setpacking}if +userdict/Adobe_AGM_Utils 75 dict dup begin put +/bdf +{bind def}bind def +/nd{null def}bdf +/xdf +{exch def}bdf +/ldf +{load def}bdf +/ddf +{put}bdf +/xddf +{3 -1 roll put}bdf +/xpt +{exch put}bdf +/ndf +{ + exch dup where{ + pop pop pop + }{ + xdf + }ifelse +}def +/cdndf +{ + exch dup currentdict exch known{ + pop pop + }{ + exch def + }ifelse +}def +/gx +{get exec}bdf +/ps_level + /languagelevel where{ + pop systemdict/languagelevel gx + }{ + 1 + }ifelse +def +/level2 + ps_level 2 ge +def +/level3 + ps_level 3 ge +def +/ps_version + {version cvr}stopped{-1}if +def +/set_gvm +{currentglobal exch setglobal}bdf +/reset_gvm +{setglobal}bdf +/makereadonlyarray +{ + /packedarray where{pop packedarray + }{ + array astore readonly}ifelse +}bdf +/map_reserved_ink_name +{ + dup type/stringtype eq{ + dup/Red eq{ + pop(_Red_) + }{ + dup/Green eq{ + pop(_Green_) + }{ + dup/Blue eq{ + pop(_Blue_) + }{ + dup()cvn eq{ + pop(Process) + }if + }ifelse + }ifelse + }ifelse + }if +}bdf +/AGMUTIL_GSTATE 22 dict def +/get_gstate +{ + AGMUTIL_GSTATE begin + /AGMUTIL_GSTATE_clr_spc currentcolorspace def + /AGMUTIL_GSTATE_clr_indx 0 def + /AGMUTIL_GSTATE_clr_comps 12 array def + mark currentcolor counttomark + {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put + /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop + /AGMUTIL_GSTATE_fnt rootfont def + /AGMUTIL_GSTATE_lw currentlinewidth def + /AGMUTIL_GSTATE_lc currentlinecap def + /AGMUTIL_GSTATE_lj currentlinejoin def + /AGMUTIL_GSTATE_ml currentmiterlimit def + currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf + /AGMUTIL_GSTATE_sa currentstrokeadjust def + /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def + /AGMUTIL_GSTATE_op currentoverprint def + /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def + /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def + currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf + cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf + /AGMUTIL_GSTATE_ht currenthalftone def + /AGMUTIL_GSTATE_flt currentflat def + end +}def +/set_gstate +{ + AGMUTIL_GSTATE begin + AGMUTIL_GSTATE_clr_spc setcolorspace + AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get + /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor + AGMUTIL_GSTATE_fnt setfont + AGMUTIL_GSTATE_lw setlinewidth + AGMUTIL_GSTATE_lc setlinecap + AGMUTIL_GSTATE_lj setlinejoin + AGMUTIL_GSTATE_ml setmiterlimit + AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash + AGMUTIL_GSTATE_sa setstrokeadjust + AGMUTIL_GSTATE_clr_rnd setcolorrendering + AGMUTIL_GSTATE_op setoverprint + AGMUTIL_GSTATE_bg cvx setblackgeneration + AGMUTIL_GSTATE_ucr cvx setundercolorremoval + AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx + AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer + AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or + { + currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne + { + mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark + }if + }{ + AGMUTIL_GSTATE_ht sethalftone + }ifelse + AGMUTIL_GSTATE_flt setflat + end +}def +/get_gstate_and_matrix +{ + AGMUTIL_GSTATE begin + /AGMUTIL_GSTATE_ctm matrix currentmatrix def + end + get_gstate +}def +/set_gstate_and_matrix +{ + set_gstate + AGMUTIL_GSTATE begin + AGMUTIL_GSTATE_ctm setmatrix + end +}def +/AGMUTIL_str256 256 string def +/AGMUTIL_src256 256 string def +/AGMUTIL_dst64 64 string def +/AGMUTIL_srcLen nd +/AGMUTIL_ndx nd +/AGMUTIL_cpd nd +/capture_cpd{ + //Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf +}def +/thold_halftone +{ + level3 + {sethalftone currenthalftone} + { + dup/HalftoneType get 3 eq + { + sethalftone currenthalftone + }{ + begin + Width Height mul{ + Thresholds read{pop}if + }repeat + end + currenthalftone + }ifelse + }ifelse +}def +/rdcmntline +{ + currentfile AGMUTIL_str256 readline pop + (%)anchorsearch{pop}if +}bdf +/filter_cmyk +{ + dup type/filetype ne{ + exch()/SubFileDecode filter + }{ + exch pop + } + ifelse + [ + exch + { + AGMUTIL_src256 readstring pop + dup length/AGMUTIL_srcLen exch def + /AGMUTIL_ndx 0 def + AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ + 1 index exch get + AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put + /AGMUTIL_ndx AGMUTIL_ndx 1 add def + }for + pop + AGMUTIL_dst64 0 AGMUTIL_ndx getinterval + } + bind + /exec cvx + ]cvx +}bdf +/filter_indexed_devn +{ + cvi Names length mul names_index add Lookup exch get +}bdf +/filter_devn +{ + 4 dict begin + /srcStr xdf + /dstStr xdf + dup type/filetype ne{ + 0()/SubFileDecode filter + }if + [ + exch + [ + /devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx + currentdict/srcStr get/readstring cvx/pop cvx + /dup cvx/length cvx 0/gt cvx[ + Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx + names_index Names length currentdict/srcStr get length 1 sub{ + 1/index cvx/exch cvx/get cvx + currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx + Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx + }for + currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx + ]cvx/if cvx + /end cvx + ]cvx + bind + /exec cvx + ]cvx + end +}bdf +/AGMUTIL_imagefile nd +/read_image_file +{ + AGMUTIL_imagefile 0 setfileposition + 10 dict begin + /imageDict xdf + /imbufLen Width BitsPerComponent mul 7 add 8 idiv def + /imbufIdx 0 def + /origDataSource imageDict/DataSource get def + /origMultipleDataSources imageDict/MultipleDataSources get def + /origDecode imageDict/Decode get def + /dstDataStr imageDict/Width get colorSpaceElemCnt mul string def + imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse + { + /imbufCnt imageDict/DataSource get length def + /imbufs imbufCnt array def + 0 1 imbufCnt 1 sub{ + /imbufIdx xdf + imbufs imbufIdx imbufLen string put + imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put + }for + DeviceN_PS2{ + imageDict begin + /DataSource[DataSource/devn_sep_datasource cvx]cvx def + /MultipleDataSources false def + /Decode[0 1]def + end + }if + }{ + /imbuf imbufLen string def + Indexed_DeviceN level3 not and DeviceN_NoneName or{ + /srcDataStrs[imageDict begin + currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse + { + Width Decode length 2 div mul cvi string + }repeat + end]def + imageDict begin + /DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def + /Decode[0 1]def + end + }{ + imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put + imageDict/Decode[0 1]put + }ifelse + }ifelse + imageDict exch + load exec + imageDict/DataSource origDataSource put + imageDict/MultipleDataSources origMultipleDataSources put + imageDict/Decode origDecode put + end +}bdf +/write_image_file +{ + begin + {(AGMUTIL_imagefile)(w+)file}stopped{ + false + }{ + Adobe_AGM_Utils/AGMUTIL_imagefile xddf + 2 dict begin + /imbufLen Width BitsPerComponent mul 7 add 8 idiv def + MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{ + /imbuf imbufLen string def + }if + 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ + pop + MultipleDataSources{ + 0 1 DataSource length 1 sub{ + DataSource type dup + /arraytype eq{ + pop DataSource exch gx + }{ + /filetype eq{ + DataSource exch get imbuf readstring pop + }{ + DataSource exch get + }ifelse + }ifelse + AGMUTIL_imagefile exch writestring + }for + }{ + DataSource type dup + /arraytype eq{ + pop DataSource exec + }{ + /filetype eq{ + DataSource imbuf readstring pop + }{ + DataSource + }ifelse + }ifelse + AGMUTIL_imagefile exch writestring + }ifelse + }for + end + true + }ifelse + end +}bdf +/close_image_file +{ + AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile +}def +statusdict/product known userdict/AGMP_current_show known not and{ + /pstr statusdict/product get def + pstr(HP LaserJet 2200)eq + pstr(HP LaserJet 4000 Series)eq or + pstr(HP LaserJet 4050 Series )eq or + pstr(HP LaserJet 8000 Series)eq or + pstr(HP LaserJet 8100 Series)eq or + pstr(HP LaserJet 8150 Series)eq or + pstr(HP LaserJet 5000 Series)eq or + pstr(HP LaserJet 5100 Series)eq or + pstr(HP Color LaserJet 4500)eq or + pstr(HP Color LaserJet 4600)eq or + pstr(HP LaserJet 5Si)eq or + pstr(HP LaserJet 1200 Series)eq or + pstr(HP LaserJet 1300 Series)eq or + pstr(HP LaserJet 4100 Series)eq or + { + userdict/AGMP_current_show/show load put + userdict/show{ + currentcolorspace 0 get + /Pattern eq + {false charpath f} + {AGMP_current_show}ifelse + }put + }if + currentdict/pstr undef +}if +/consumeimagedata +{ + begin + AGMIMG_init_common + currentdict/MultipleDataSources known not + {/MultipleDataSources false def}if + MultipleDataSources + { + DataSource 0 get type + dup/filetype eq + { + 1 dict begin + /flushbuffer Width cvi string def + 1 1 Height cvi + { + pop + 0 1 DataSource length 1 sub + { + DataSource exch get + flushbuffer readstring pop pop + }for + }for + end + }if + dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and + { + Width Height mul cvi + { + 0 1 DataSource length 1 sub + {dup DataSource exch gx length exch 0 ne{pop}if}for + dup 0 eq + {pop exit}if + sub dup 0 le + {exit}if + }loop + pop + }if + } + { + /DataSource load type + dup/filetype eq + { + 1 dict begin + /flushbuffer Width Decode length 2 idiv mul cvi string def + 1 1 Height{pop DataSource flushbuffer readstring pop pop}for + end + }if + dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and + { + Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul + { + DataSource length dup 0 eq + {pop exit}if + sub dup 0 le + {exit}if + }loop + pop + }if + }ifelse + end +}bdf +/addprocs +{ + 2{/exec load}repeat + 3 1 roll + [5 1 roll]bind cvx +}def +/modify_halftone_xfer +{ + currenthalftone dup length dict copy begin + currentdict 2 index known{ + 1 index load dup length dict copy begin + currentdict/TransferFunction known{ + /TransferFunction load + }{ + currenttransfer + }ifelse + addprocs/TransferFunction xdf + currentdict end def + currentdict end sethalftone + }{ + currentdict/TransferFunction known{ + /TransferFunction load + }{ + currenttransfer + }ifelse + addprocs/TransferFunction xdf + currentdict end sethalftone + pop + }ifelse +}def +/clonearray +{ + dup xcheck exch + dup length array exch + Adobe_AGM_Core/AGMCORE_tmp -1 ddf + { + Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf + dup type/dicttype eq + { + Adobe_AGM_Core/AGMCORE_tmp get + exch + clonedict + Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf + }if + dup type/arraytype eq + { + Adobe_AGM_Core/AGMCORE_tmp get exch + clonearray + Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf + }if + exch dup + Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put + }forall + exch{cvx}if +}bdf +/clonedict +{ + dup length dict + begin + { + dup type/dicttype eq + {clonedict}if + dup type/arraytype eq + {clonearray}if + def + }forall + currentdict + end +}bdf +/DeviceN_PS2 +{ + /currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and +}bdf +/Indexed_DeviceN +{ + /indexed_colorspace_dict AGMCORE_gget dup null ne{ + dup/CSDBase known{ + /CSDBase get/CSD get_res/Names known + }{ + pop false + }ifelse + }{ + pop false + }ifelse +}bdf +/DeviceN_NoneName +{ + /Names where{ + pop + false Names + { + (None)eq or + }forall + }{ + false + }ifelse +}bdf +/DeviceN_PS2_inRip_seps +{ + /AGMCORE_in_rip_sep where + { + pop dup type dup/arraytype eq exch/packedarraytype eq or + { + dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and + { + /currentcolorspace exch AGMCORE_gput + false + }{ + true + }ifelse + }{ + true + }ifelse + }{ + true + }ifelse +}bdf +/base_colorspace_type +{ + dup type/arraytype eq{0 get}if +}bdf +/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse +{ + /pdfmark_5{cleartomark}bind def +}{ + /pdfmark_5{pdfmark}bind def +}ifelse +/ReadBypdfmark_5 +{ + currentfile exch 0 exch/SubFileDecode filter + /currentdistillerparams where + {pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse + {flushfile cleartomark} + {/PUT pdfmark}ifelse +}bdf +/ReadBypdfmark_5_string +{ + 2 dict begin + /makerString exch def string/tmpString exch def + { + currentfile tmpString readline not{pop exit}if + makerString anchorsearch + { + pop pop cleartomark exit + }{ + 3 copy/PUT pdfmark_5 pop 2 copy(\n)/PUT pdfmark_5 + }ifelse + }loop + end +}bdf +/xpdfm +{ + { + dup 0 get/Label eq + { + aload length[exch 1 add 1 roll/PAGELABEL + }{ + aload pop + [{ThisPage}<<5 -2 roll>>/PUT + }ifelse + pdfmark_5 + }forall +}bdf +/lmt{ + dup 2 index le{exch}if pop dup 2 index ge{exch}if pop +}bdf +/int{ + dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul exch pop add exch pop +}bdf +/ds{ + Adobe_AGM_Utils begin +}bdf +/dt{ + currentdict Adobe_AGM_Utils eq{ + end + }if +}bdf +systemdict/setpacking known +{setpacking}if +%%EndResource +%%BeginResource: procset Adobe_AGM_Core 2.0 0 +%%Version: 2.0 0 +%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{ + currentpacking + true setpacking +}if +userdict/Adobe_AGM_Core 209 dict dup begin put +/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def +/AGMCORE_str256 256 string def +/AGMCORE_save nd +/AGMCORE_graphicsave nd +/AGMCORE_c 0 def +/AGMCORE_m 0 def +/AGMCORE_y 0 def +/AGMCORE_k 0 def +/AGMCORE_cmykbuf 4 array def +/AGMCORE_screen[currentscreen]cvx def +/AGMCORE_tmp 0 def +/AGMCORE_&setgray nd +/AGMCORE_&setcolor nd +/AGMCORE_&setcolorspace nd +/AGMCORE_&setcmykcolor nd +/AGMCORE_cyan_plate nd +/AGMCORE_magenta_plate nd +/AGMCORE_yellow_plate nd +/AGMCORE_black_plate nd +/AGMCORE_plate_ndx nd +/AGMCORE_get_ink_data nd +/AGMCORE_is_cmyk_sep nd +/AGMCORE_host_sep nd +/AGMCORE_avoid_L2_sep_space nd +/AGMCORE_distilling nd +/AGMCORE_composite_job nd +/AGMCORE_producing_seps nd +/AGMCORE_ps_level -1 def +/AGMCORE_ps_version -1 def +/AGMCORE_environ_ok nd +/AGMCORE_CSD_cache 0 dict def +/AGMCORE_currentoverprint false def +/AGMCORE_deltaX nd +/AGMCORE_deltaY nd +/AGMCORE_name nd +/AGMCORE_sep_special nd +/AGMCORE_err_strings 4 dict def +/AGMCORE_cur_err nd +/AGMCORE_current_spot_alias false def +/AGMCORE_inverting false def +/AGMCORE_feature_dictCount nd +/AGMCORE_feature_opCount nd +/AGMCORE_feature_ctm nd +/AGMCORE_ConvertToProcess false def +/AGMCORE_Default_CTM matrix def +/AGMCORE_Default_PageSize nd +/AGMCORE_Default_flatness nd +/AGMCORE_currentbg nd +/AGMCORE_currentucr nd +/AGMCORE_pattern_paint_type 0 def +/knockout_unitsq nd +currentglobal true setglobal +[/CSA/Gradient/Procedure] +{ + /Generic/Category findresource dup length dict copy/Category defineresource pop +}forall +setglobal +/AGMCORE_key_known +{ + where{ + /Adobe_AGM_Core_Id known + }{ + false + }ifelse +}ndf +/flushinput +{ + save + 2 dict begin + /CompareBuffer 3 -1 roll def + /readbuffer 256 string def + mark + { + currentfile readbuffer{readline}stopped + {cleartomark mark} + { + not + {pop exit} + if + CompareBuffer eq + {exit} + if + }ifelse + }loop + cleartomark + end + restore +}bdf +/getspotfunction +{ + AGMCORE_screen exch pop exch pop + dup type/dicttype eq{ + dup/HalftoneType get 1 eq{ + /SpotFunction get + }{ + dup/HalftoneType get 2 eq{ + /GraySpotFunction get + }{ + pop + { + abs exch abs 2 copy add 1 gt{ + 1 sub dup mul exch 1 sub dup mul add 1 sub + }{ + dup mul exch dup mul add 1 exch sub + }ifelse + }bind + }ifelse + }ifelse + }if +}def +/np +{newpath}bdf +/clp_npth +{clip np}def +/eoclp_npth +{eoclip np}def +/npth_clp +{np clip}def +/graphic_setup +{ + /AGMCORE_graphicsave save store + concat + 0 setgray + 0 setlinecap + 0 setlinejoin + 1 setlinewidth + []0 setdash + 10 setmiterlimit + np + false setoverprint + false setstrokeadjust + //Adobe_AGM_Core/spot_alias gx + /Adobe_AGM_Image where{ + pop + Adobe_AGM_Image/spot_alias 2 copy known{ + gx + }{ + pop pop + }ifelse + }if + /sep_colorspace_dict null AGMCORE_gput + 100 dict begin + /dictstackcount countdictstack def + /showpage{}def + mark +}def +/graphic_cleanup +{ + cleartomark + dictstackcount 1 countdictstack 1 sub{end}for + end + AGMCORE_graphicsave restore +}def +/compose_error_msg +{ + grestoreall initgraphics + /Helvetica findfont 10 scalefont setfont + /AGMCORE_deltaY 100 def + /AGMCORE_deltaX 310 def + clippath pathbbox np pop pop 36 add exch 36 add exch moveto + 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto + 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath + 0 AGMCORE_&setgray + gsave 1 AGMCORE_&setgray fill grestore + 1 setlinewidth gsave stroke grestore + currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto + /AGMCORE_deltaY 12 def + /AGMCORE_tmp 0 def + AGMCORE_err_strings exch get + { + dup 32 eq + { + pop + AGMCORE_str256 0 AGMCORE_tmp getinterval + stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt + { + currentpoint AGMCORE_deltaY sub exch pop + clippath pathbbox pop pop pop 44 add exch moveto + }if + AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show + 0 1 AGMCORE_str256 length 1 sub + { + AGMCORE_str256 exch 0 put + }for + /AGMCORE_tmp 0 def + }{ + AGMCORE_str256 exch AGMCORE_tmp xpt + /AGMCORE_tmp AGMCORE_tmp 1 add def + }ifelse + }forall +}bdf +/AGMCORE_CMYKDeviceNColorspaces[ + [/Separation/None/DeviceCMYK{0 0 0}] + [/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind] + [/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind] + [/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind] + [/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind] + [/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind] + [/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind] + [/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind] + [/Separation(Cyan)/DeviceCMYK{0 0 0}] + [/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind] + [/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind] + [/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind] + [/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}] + [/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind] + [/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}] + [/DeviceCMYK] +]def +/ds{ + Adobe_AGM_Core begin + /currentdistillerparams where + { + pop currentdistillerparams/CoreDistVersion get 5000 lt + {<>setdistillerparams}if + }if + /AGMCORE_ps_version xdf + /AGMCORE_ps_level xdf + errordict/AGM_handleerror known not{ + errordict/AGM_handleerror errordict/handleerror get put + errordict/handleerror{ + Adobe_AGM_Core begin + $error/newerror get AGMCORE_cur_err null ne and{ + $error/newerror false put + AGMCORE_cur_err compose_error_msg + }if + $error/newerror true put + end + errordict/AGM_handleerror get exec + }bind put + }if + /AGMCORE_environ_ok + ps_level AGMCORE_ps_level ge + ps_version AGMCORE_ps_version ge and + AGMCORE_ps_level -1 eq or + def + AGMCORE_environ_ok not + {/AGMCORE_cur_err/AGMCORE_bad_environ def}if + /AGMCORE_&setgray systemdict/setgray get def + level2{ + /AGMCORE_&setcolor systemdict/setcolor get def + /AGMCORE_&setcolorspace systemdict/setcolorspace get def + }if + /AGMCORE_currentbg currentblackgeneration def + /AGMCORE_currentucr currentundercolorremoval def + /AGMCORE_Default_flatness currentflat def + /AGMCORE_distilling + /product where{ + pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and + }{ + false + }ifelse + def + /AGMCORE_GSTATE AGMCORE_key_known not{ + /AGMCORE_GSTATE 21 dict def + /AGMCORE_tmpmatrix matrix def + /AGMCORE_gstack 32 array def + /AGMCORE_gstackptr 0 def + /AGMCORE_gstacksaveptr 0 def + /AGMCORE_gstackframekeys 14 def + /AGMCORE_&gsave/gsave ldf + /AGMCORE_&grestore/grestore ldf + /AGMCORE_&grestoreall/grestoreall ldf + /AGMCORE_&save/save ldf + /AGMCORE_&setoverprint/setoverprint ldf + /AGMCORE_gdictcopy{ + begin + {def}forall + end + }def + /AGMCORE_gput{ + AGMCORE_gstack AGMCORE_gstackptr get + 3 1 roll + put + }def + /AGMCORE_gget{ + AGMCORE_gstack AGMCORE_gstackptr get + exch + get + }def + /gsave{ + AGMCORE_&gsave + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gstackptr 1 add + dup 32 ge{limitcheck}if + /AGMCORE_gstackptr exch store + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gdictcopy + }def + /grestore{ + AGMCORE_&grestore + AGMCORE_gstackptr 1 sub + dup AGMCORE_gstacksaveptr lt{1 add}if + dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known + {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse + /AGMCORE_gstackptr exch store + }def + /grestoreall{ + AGMCORE_&grestoreall + /AGMCORE_gstackptr AGMCORE_gstacksaveptr store + }def + /save{ + AGMCORE_&save + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gstackptr 1 add + dup 32 ge{limitcheck}if + /AGMCORE_gstackptr exch store + /AGMCORE_gstacksaveptr AGMCORE_gstackptr store + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gdictcopy + }def + /setoverprint{ + dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint + }def + 0 1 AGMCORE_gstack length 1 sub{ + AGMCORE_gstack exch AGMCORE_gstackframekeys dict put + }for + }if + level3/AGMCORE_&sysshfill AGMCORE_key_known not and + { + /AGMCORE_&sysshfill systemdict/shfill get def + /AGMCORE_&sysmakepattern systemdict/makepattern get def + /AGMCORE_&usrmakepattern/makepattern load def + }if + /currentcmykcolor[0 0 0 0]AGMCORE_gput + /currentstrokeadjust false AGMCORE_gput + /currentcolorspace[/DeviceGray]AGMCORE_gput + /sep_tint 0 AGMCORE_gput + /devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput + /sep_colorspace_dict null AGMCORE_gput + /devicen_colorspace_dict null AGMCORE_gput + /indexed_colorspace_dict null AGMCORE_gput + /currentcolor_intent()AGMCORE_gput + /customcolor_tint 1 AGMCORE_gput + /absolute_colorimetric_crd null AGMCORE_gput + /relative_colorimetric_crd null AGMCORE_gput + /saturation_crd null AGMCORE_gput + /perceptual_crd null AGMCORE_gput + currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf + cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf + << + /MaxPatternItem currentsystemparams/MaxPatternCache get + >> + setuserparams + end +}def +/ps +{ + /setcmykcolor where{ + pop + Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put + }if + Adobe_AGM_Core begin + /setcmykcolor + { + 4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput + 1 sub 4 1 roll + 3{ + 3 index add neg dup 0 lt{ + pop 0 + }if + 3 1 roll + }repeat + setrgbcolor pop + }ndf + /currentcmykcolor + { + /currentcmykcolor AGMCORE_gget aload pop + }ndf + /setoverprint + {pop}ndf + /currentoverprint + {false}ndf + /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def + /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def + /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def + /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def + /AGMCORE_plate_ndx + AGMCORE_cyan_plate{ + 0 + }{ + AGMCORE_magenta_plate{ + 1 + }{ + AGMCORE_yellow_plate{ + 2 + }{ + AGMCORE_black_plate{ + 3 + }{ + 4 + }ifelse + }ifelse + }ifelse + }ifelse + def + /AGMCORE_have_reported_unsupported_color_space false def + /AGMCORE_report_unsupported_color_space + { + AGMCORE_have_reported_unsupported_color_space false eq + { + (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)== + Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf + }if + }def + /AGMCORE_composite_job + AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def + /AGMCORE_in_rip_sep + /AGMCORE_in_rip_sep where{ + pop AGMCORE_in_rip_sep + }{ + AGMCORE_distilling + { + false + }{ + userdict/Adobe_AGM_OnHost_Seps known{ + false + }{ + level2{ + currentpagedevice/Separations 2 copy known{ + get + }{ + pop pop false + }ifelse + }{ + false + }ifelse + }ifelse + }ifelse + }ifelse + def + /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def + /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def + /AGM_preserve_spots + /AGM_preserve_spots where{ + pop AGM_preserve_spots + }{ + AGMCORE_distilling AGMCORE_producing_seps or + }ifelse + def + /AGM_is_distiller_preserving_spotimages + { + currentdistillerparams/PreserveOverprintSettings known + { + currentdistillerparams/PreserveOverprintSettings get + { + currentdistillerparams/ColorConversionStrategy known + { + currentdistillerparams/ColorConversionStrategy get + /sRGB ne + }{ + true + }ifelse + }{ + false + }ifelse + }{ + false + }ifelse + }def + /convert_spot_to_process where{pop}{ + /convert_spot_to_process + { + //Adobe_AGM_Core begin + dup map_alias{ + /Name get exch pop + }if + dup dup(None)eq exch(All)eq or + { + pop false + }{ + AGMCORE_host_sep + { + gsave + 1 0 0 0 setcmykcolor currentgray 1 exch sub + 0 1 0 0 setcmykcolor currentgray 1 exch sub + 0 0 1 0 setcmykcolor currentgray 1 exch sub + 0 0 0 1 setcmykcolor currentgray 1 exch sub + add add add 0 eq + { + pop false + }{ + false setoverprint + current_spot_alias false set_spot_alias + 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor + set_spot_alias + currentgray 1 ne + }ifelse + grestore + }{ + AGMCORE_distilling + { + pop AGM_is_distiller_preserving_spotimages not + }{ + //Adobe_AGM_Core/AGMCORE_name xddf + false + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq + AGMUTIL_cpd/OverrideSeparations known and + { + AGMUTIL_cpd/OverrideSeparations get + { + /HqnSpots/ProcSet resourcestatus + { + pop pop pop true + }if + }if + }if + { + AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not + }{ + gsave + [/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace + false + AGMUTIL_cpd/SeparationColorNames 2 copy known + { + get + {AGMCORE_name eq or}forall + not + }{ + pop pop pop true + }ifelse + grestore + }ifelse + }ifelse + }ifelse + }ifelse + end + }def + }ifelse + /convert_to_process where{pop}{ + /convert_to_process + { + dup length 0 eq + { + pop false + }{ + AGMCORE_host_sep + { + dup true exch + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + dup(Black)eq 3 -1 roll or + {pop} + {convert_spot_to_process and}ifelse + } + forall + { + true exch + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + (Black)eq or and + }forall + not + }{pop false}ifelse + }{ + false exch + { + /PhotoshopDuotoneList where{pop false}{true}ifelse + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + dup(Black)eq 3 -1 roll or + {pop} + {convert_spot_to_process or}ifelse + } + { + convert_spot_to_process or + } + ifelse + } + forall + }ifelse + }ifelse + }def + }ifelse + /AGMCORE_avoid_L2_sep_space + version cvr 2012 lt + level2 and + AGMCORE_producing_seps not and + def + /AGMCORE_is_cmyk_sep + AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or + def + /AGM_avoid_0_cmyk where{ + pop AGM_avoid_0_cmyk + }{ + AGM_preserve_spots + userdict/Adobe_AGM_OnHost_Seps known + userdict/Adobe_AGM_InRip_Seps known or + not and + }ifelse + { + /setcmykcolor[ + { + 4 copy add add add 0 eq currentoverprint and{ + pop 0.0005 + }if + }/exec cvx + /AGMCORE_&setcmykcolor load dup type/operatortype ne{ + /exec cvx + }if + ]cvx def + }if + /AGMCORE_IsSeparationAProcessColor + { + dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or + }def + AGMCORE_host_sep{ + /setcolortransfer + { + AGMCORE_cyan_plate{ + pop pop pop + }{ + AGMCORE_magenta_plate{ + 4 3 roll pop pop pop + }{ + AGMCORE_yellow_plate{ + 4 2 roll pop pop pop + }{ + 4 1 roll pop pop pop + }ifelse + }ifelse + }ifelse + settransfer + } + def + /AGMCORE_get_ink_data + AGMCORE_cyan_plate{ + {pop pop pop} + }{ + AGMCORE_magenta_plate{ + {4 3 roll pop pop pop} + }{ + AGMCORE_yellow_plate{ + {4 2 roll pop pop pop} + }{ + {4 1 roll pop pop pop} + }ifelse + }ifelse + }ifelse + def + /AGMCORE_RemoveProcessColorNames + { + 1 dict begin + /filtername + { + dup/Cyan eq 1 index(Cyan)eq or + {pop(_cyan_)}if + dup/Magenta eq 1 index(Magenta)eq or + {pop(_magenta_)}if + dup/Yellow eq 1 index(Yellow)eq or + {pop(_yellow_)}if + dup/Black eq 1 index(Black)eq or + {pop(_black_)}if + }def + dup type/arraytype eq + {[exch{filtername}forall]} + {filtername}ifelse + end + }def + level3{ + /AGMCORE_IsCurrentColor + { + dup AGMCORE_IsSeparationAProcessColor + { + AGMCORE_plate_ndx 0 eq + {dup(Cyan)eq exch/Cyan eq or}if + AGMCORE_plate_ndx 1 eq + {dup(Magenta)eq exch/Magenta eq or}if + AGMCORE_plate_ndx 2 eq + {dup(Yellow)eq exch/Yellow eq or}if + AGMCORE_plate_ndx 3 eq + {dup(Black)eq exch/Black eq or}if + AGMCORE_plate_ndx 4 eq + {pop false}if + }{ + gsave + false setoverprint + current_spot_alias false set_spot_alias + 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor + set_spot_alias + currentgray 1 ne + grestore + }ifelse + }def + /AGMCORE_filter_functiondatasource + { + 5 dict begin + /data_in xdf + data_in type/stringtype eq + { + /ncomp xdf + /comp xdf + /string_out data_in length ncomp idiv string def + 0 ncomp data_in length 1 sub + { + string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put + }for + string_out + }{ + string/string_in xdf + /string_out 1 string def + /component xdf + [ + data_in string_in/readstring cvx + [component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx + [/pop cvx()]cvx/ifelse cvx + ]cvx/ReusableStreamDecode filter + }ifelse + end + }def + /AGMCORE_separateShadingFunction + { + 2 dict begin + /paint? xdf + /channel xdf + dup type/dicttype eq + { + begin + FunctionType 0 eq + { + /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def + currentdict/Decode known + {/Decode Decode channel 2 mul 2 getinterval def}if + paint? not + {/Decode[1 1]def}if + }if + FunctionType 2 eq + { + paint? + { + /C0[C0 channel get 1 exch sub]def + /C1[C1 channel get 1 exch sub]def + }{ + /C0[1]def + /C1[1]def + }ifelse + }if + FunctionType 3 eq + { + /Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def + }if + currentdict/Range known + {/Range[0 1]def}if + currentdict + end}{ + channel get 0 paint? AGMCORE_separateShadingFunction + }ifelse + end + }def + /AGMCORE_separateShading + { + 3 -1 roll begin + currentdict/Function known + { + currentdict/Background known + {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if + Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf + /ColorSpace[/DeviceGray]def + }{ + ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def + }{ + ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put + }ifelse + ColorSpace 0 get/Separation eq + { + { + [1/exch cvx/sub cvx]cvx + }{ + [/pop cvx 1]cvx + }ifelse + ColorSpace 3 3 -1 roll put + pop + }{ + { + [exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx + }{ + pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx + }ifelse + ColorSpace 3 3 -1 roll bind put + }ifelse + ColorSpace 2/DeviceGray put + }ifelse + end + }def + /AGMCORE_separateShadingDict + { + dup/ColorSpace get + dup type/arraytype ne + {[exch]}if + dup 0 get/DeviceCMYK eq + { + exch begin + currentdict + AGMCORE_cyan_plate + {0 true}if + AGMCORE_magenta_plate + {1 true}if + AGMCORE_yellow_plate + {2 true}if + AGMCORE_black_plate + {3 true}if + AGMCORE_plate_ndx 4 eq + {0 false}if + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + currentdict + end exch + }if + dup 0 get/Separation eq + { + exch begin + ColorSpace 1 get dup/None ne exch/All ne and + { + ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and + { + ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace + [ + /Separation + ColorSpace 1 get + /DeviceGray + [ + ColorSpace 3 get/exec cvx + 4 AGMCORE_plate_ndx sub -1/roll cvx + 4 1/roll cvx + 3[/pop cvx]cvx/repeat cvx + 1/exch cvx/sub cvx + ]cvx + ]def + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + currentdict 0 false AGMCORE_separateShading + }if + }ifelse + }{ + currentdict ColorSpace 1 get AGMCORE_IsCurrentColor + 0 exch + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + }ifelse + }if + currentdict + end exch + }if + dup 0 get/DeviceN eq + { + exch begin + ColorSpace 1 get convert_to_process + { + ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace + [ + /DeviceN + ColorSpace 1 get + /DeviceGray + [ + ColorSpace 3 get/exec cvx + 4 AGMCORE_plate_ndx sub -1/roll cvx + 4 1/roll cvx + 3[/pop cvx]cvx/repeat cvx + 1/exch cvx/sub cvx + ]cvx + ]def + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + currentdict 0 false AGMCORE_separateShading + /ColorSpace[/DeviceGray]def + }if + }ifelse + }{ + currentdict + false -1 ColorSpace 1 get + { + AGMCORE_IsCurrentColor + { + 1 add + exch pop true exch exit + }if + 1 add + }forall + exch + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + }ifelse + currentdict + end exch + }if + dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not + { + exch begin + ColorSpace dup type/arraytype eq + {0 get}if + /DeviceGray ne + { + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + ColorSpace 0 get/CIEBasedA eq + { + /ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def + }if + ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or + { + /ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def + }if + ColorSpace 0 get/CIEBasedDEFG eq + { + /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def + }if + currentdict 0 false AGMCORE_separateShading + }if + }if + currentdict + end exch + }if + pop + dup/AGMCORE_ignoreshade known + { + begin + /ColorSpace[/Separation(None)/DeviceGray{}]def + currentdict end + }if + }def + /shfill + { + AGMCORE_separateShadingDict + dup/AGMCORE_ignoreshade known + {pop} + {AGMCORE_&sysshfill}ifelse + }def + /makepattern + { + exch + dup/PatternType get 2 eq + { + clonedict + begin + /Shading Shading AGMCORE_separateShadingDict def + Shading/AGMCORE_ignoreshade known + currentdict end exch + {pop<>}if + exch AGMCORE_&sysmakepattern + }{ + exch AGMCORE_&usrmakepattern + }ifelse + }def + }if + }if + AGMCORE_in_rip_sep{ + /setcustomcolor + { + exch aload pop + dup 7 1 roll inRip_spot_has_ink not { + 4{4 index mul 4 1 roll} + repeat + /DeviceCMYK setcolorspace + 6 -2 roll pop pop + }{ + //Adobe_AGM_Core begin + /AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf + end + [/Separation 4 -1 roll/DeviceCMYK + {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} + ] + setcolorspace + }ifelse + setcolor + }ndf + /setseparationgray + { + [/Separation(All)/DeviceGray{}]setcolorspace_opt + 1 exch sub setcolor + }ndf + }{ + /setseparationgray + { + AGMCORE_&setgray + }ndf + }ifelse + /findcmykcustomcolor + { + 5 makereadonlyarray + }ndf + /setcustomcolor + { + exch aload pop pop + 4{4 index mul 4 1 roll}repeat + setcmykcolor pop + }ndf + /has_color + /colorimage where{ + AGMCORE_producing_seps{ + pop true + }{ + systemdict eq + }ifelse + }{ + false + }ifelse + def + /map_index + { + 1 index mul exch getinterval{255 div}forall + }bdf + /map_indexed_devn + { + Lookup Names length 3 -1 roll cvi map_index + }bdf + /n_color_components + { + base_colorspace_type + dup/DeviceGray eq{ + pop 1 + }{ + /DeviceCMYK eq{ + 4 + }{ + 3 + }ifelse + }ifelse + }bdf + level2{ + /mo/moveto ldf + /li/lineto ldf + /cv/curveto ldf + /knockout_unitsq + { + 1 setgray + 0 0 1 1 rectfill + }def + level2/setcolorspace AGMCORE_key_known not and{ + /AGMCORE_&&&setcolorspace/setcolorspace ldf + /AGMCORE_ReplaceMappedColor + { + dup type dup/arraytype eq exch/packedarraytype eq or + { + /AGMCORE_SpotAliasAry2 where{ + begin + dup 0 get dup/Separation eq + { + pop + dup length array copy + dup dup 1 get + current_spot_alias + { + dup map_alias + { + false set_spot_alias + dup 1 exch setsepcolorspace + true set_spot_alias + begin + /sep_colorspace_dict currentdict AGMCORE_gput + pop pop pop + [ + /Separation Name + CSA map_csa + MappedCSA + /sep_colorspace_proc load + ] + dup Name + end + }if + }if + map_reserved_ink_name 1 xpt + }{ + /DeviceN eq + { + dup length array copy + dup dup 1 get[ + exch{ + current_spot_alias{ + dup map_alias{ + /Name get exch pop + }if + }if + map_reserved_ink_name + }forall + ]1 xpt + }if + }ifelse + end + }if + }if + }def + /setcolorspace + { + dup type dup/arraytype eq exch/packedarraytype eq or + { + dup 0 get/Indexed eq + { + AGMCORE_distilling + { + /PhotoshopDuotoneList where + { + pop false + }{ + true + }ifelse + }{ + true + }ifelse + { + aload pop 3 -1 roll + AGMCORE_ReplaceMappedColor + 3 1 roll 4 array astore + }if + }{ + AGMCORE_ReplaceMappedColor + }ifelse + }if + DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if + }def + }if + }{ + /adj + { + currentstrokeadjust{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform + }if + }def + /mo{ + adj moveto + }def + /li{ + adj lineto + }def + /cv{ + 6 2 roll adj + 6 2 roll adj + 6 2 roll adj curveto + }def + /knockout_unitsq + { + 1 setgray + 8 8 1[8 0 0 8 0 0]{}image + }def + /currentstrokeadjust{ + /currentstrokeadjust AGMCORE_gget + }def + /setstrokeadjust{ + /currentstrokeadjust exch AGMCORE_gput + }def + /setcolorspace + { + /currentcolorspace exch AGMCORE_gput + }def + /currentcolorspace + { + /currentcolorspace AGMCORE_gget + }def + /setcolor_devicecolor + { + base_colorspace_type + dup/DeviceGray eq{ + pop setgray + }{ + /DeviceCMYK eq{ + setcmykcolor + }{ + setrgbcolor + }ifelse + }ifelse + }def + /setcolor + { + currentcolorspace 0 get + dup/DeviceGray ne{ + dup/DeviceCMYK ne{ + dup/DeviceRGB ne{ + dup/Separation eq{ + pop + currentcolorspace 3 gx + currentcolorspace 2 get + }{ + dup/Indexed eq{ + pop + currentcolorspace 3 get dup type/stringtype eq{ + currentcolorspace 1 get n_color_components + 3 -1 roll map_index + }{ + exec + }ifelse + currentcolorspace 1 get + }{ + /AGMCORE_cur_err/AGMCORE_invalid_color_space def + AGMCORE_invalid_color_space + }ifelse + }ifelse + }if + }if + }if + setcolor_devicecolor + }def + }ifelse + /sop/setoverprint ldf + /lw/setlinewidth ldf + /lc/setlinecap ldf + /lj/setlinejoin ldf + /ml/setmiterlimit ldf + /dsh/setdash ldf + /sadj/setstrokeadjust ldf + /gry/setgray ldf + /rgb/setrgbcolor ldf + /cmyk[ + /currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx + /setcmykcolor load dup type/operatortype ne{/exec cvx}if + ]cvx bdf + level3 AGMCORE_host_sep not and{ + /nzopmsc{ + 6 dict begin + /kk exch def + /yy exch def + /mm exch def + /cc exch def + /sum 0 def + cc 0 ne{/sum sum 2#1000 or def cc}if + mm 0 ne{/sum sum 2#0100 or def mm}if + yy 0 ne{/sum sum 2#0010 or def yy}if + kk 0 ne{/sum sum 2#0001 or def kk}if + AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace + sum 0 eq{0}if + end + setcolor + }bdf + }{ + /nzopmsc/cmyk ldf + }ifelse + /sep/setsepcolor ldf + /devn/setdevicencolor ldf + /idx/setindexedcolor ldf + /colr/setcolor ldf + /csacrd/set_csa_crd ldf + /sepcs/setsepcolorspace ldf + /devncs/setdevicencolorspace ldf + /idxcs/setindexedcolorspace ldf + /cp/closepath ldf + /clp/clp_npth ldf + /eclp/eoclp_npth ldf + /f/fill ldf + /ef/eofill ldf + /@/stroke ldf + /nclp/npth_clp ldf + /gset/graphic_setup ldf + /gcln/graphic_cleanup ldf + /ct/concat ldf + /cf/currentfile ldf + /fl/filter ldf + /rs/readstring ldf + /AGMCORE_def_ht currenthalftone def + /clonedict Adobe_AGM_Utils begin/clonedict load end def + /clonearray Adobe_AGM_Utils begin/clonearray load end def + currentdict{ + dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ + bind + }if + def + }forall + /getrampcolor + { + /indx exch def + 0 1 NumComp 1 sub + { + dup + Samples exch get + dup type/stringtype eq{indx get}if + exch + Scaling exch get aload pop + 3 1 roll + mul add + }for + ColorSpaceFamily/Separation eq + {sep} + { + ColorSpaceFamily/DeviceN eq + {devn}{setcolor}ifelse + }ifelse + }bdf + /sssetbackground{ + aload pop + ColorSpaceFamily/Separation eq + {sep} + { + ColorSpaceFamily/DeviceN eq + {devn}{setcolor}ifelse + }ifelse + }bdf + /RadialShade + { + 40 dict begin + /ColorSpaceFamily xdf + /background xdf + /ext1 xdf + /ext0 xdf + /BBox xdf + /r2 xdf + /c2y xdf + /c2x xdf + /r1 xdf + /c1y xdf + /c1x xdf + /rampdict xdf + /setinkoverprint where{pop/setinkoverprint{pop}def}if + gsave + BBox length 0 gt + { + np + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + np + }if + c1x c2x eq + { + c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse + }{ + /slope c2y c1y sub c2x c1x sub div def + /theta slope 1 atan def + c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if + c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if + }ifelse + gsave + clippath + c1x c1y translate + theta rotate + -90 rotate + {pathbbox}stopped + {0 0 0 0}if + /yMax xdf + /xMax xdf + /yMin xdf + /xMin xdf + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + }{ + /max{2 copy gt{pop}{exch pop}ifelse}bdf + /min{2 copy lt{pop}{exch pop}ifelse}bdf + rampdict begin + 40 dict begin + background length 0 gt{background sssetbackground gsave clippath fill grestore}if + gsave + c1x c1y translate + theta rotate + -90 rotate + /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def + /c1y 0 def + /c1x 0 def + /c2x 0 def + ext0 + { + 0 getrampcolor + c2y r2 add r1 sub 0.0001 lt + { + c1x c1y r1 360 0 arcn + pathbbox + /aymax exch def + /axmax exch def + /aymin exch def + /axmin exch def + /bxMin xMin axmin min def + /byMin yMin aymin min def + /bxMax xMax axmax max def + /byMax yMax aymax max def + bxMin byMin moveto + bxMax byMin lineto + bxMax byMax lineto + bxMin byMax lineto + bxMin byMin lineto + eofill + }{ + c2y r1 add r2 le + { + c1x c1y r1 0 360 arc + fill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r1 neg def + /p1y c1y def + /p2x r1 def + /p2y c1y def + p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto + fill + }{ + /AA r2 r1 sub c2y div def + AA -1 eq + {/theta 89.99 def} + {/theta AA 1 AA dup mul sub sqrt div 1 atan def} + ifelse + /SS1 90 theta add dup sin exch cos div def + /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y p1x SS1 div neg def + /SS2 90 theta sub dup sin exch cos div def + /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y p2x SS2 div neg def + r1 r2 gt + { + /L1maxX p1x yMin p1y sub SS1 div add def + /L2maxX p2x yMin p2y sub SS2 div add def + }{ + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + }ifelse + }ifelse + }ifelse + }if + c1x c2x sub dup mul + c1y c2y sub dup mul + add 0.5 exp + 0 dtransform + dup mul exch dup mul add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt{exch}if pop + /hires xdf + hires mul + /numpix xdf + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + }if + }if + /xInc c2x c1x sub numsteps div def + /yInc c2y c1y sub numsteps div def + /rInc r2 r1 sub numsteps div def + /cx c1x def + /cy c1y def + /radius r1 def + np + xInc 0 eq yInc 0 eq rInc 0 eq and and + { + 0 getrampcolor + cx cy radius 0 360 arc + stroke + NumSamples 1 sub getrampcolor + cx cy radius 72 hires div add 0 360 arc + 0 setlinewidth + stroke + }{ + 0 + numsteps + { + dup + subsampling{round cvi}if + getrampcolor + cx cy radius 0 360 arc + /cx cx xInc add def + /cy cy yInc add def + /radius radius rInc add def + cx cy radius 360 0 arcn + eofill + rampIndxInc add + }repeat + pop + }ifelse + ext1 + { + c2y r2 add r1 lt + { + c2x c2y r2 0 360 arc + fill + }{ + c2y r1 add r2 sub 0.0001 le + { + c2x c2y r2 360 0 arcn + pathbbox + /aymax exch def + /axmax exch def + /aymin exch def + /axmin exch def + /bxMin xMin axmin min def + /byMin yMin aymin min def + /bxMax xMax axmax max def + /byMax yMax aymax max def + bxMin byMin moveto + bxMax byMin lineto + bxMax byMax lineto + bxMin byMax lineto + bxMin byMin lineto + eofill + }{ + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r2 neg def + /p1y c2y def + /p2x r2 def + /p2y c2y def + p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto + fill + }{ + /AA r2 r1 sub c2y div def + AA -1 eq + {/theta 89.99 def} + {/theta AA 1 AA dup mul sub sqrt div 1 atan def} + ifelse + /SS1 90 theta add dup sin exch cos div def + /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y c2y p1x SS1 div sub def + /SS2 90 theta sub dup sin exch cos div def + /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y c2y p2x SS2 div sub def + r1 r2 lt + { + /L1maxX p1x yMax p1y sub SS1 div add def + /L2maxX p2x yMax p2y sub SS2 div add def + }{ + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + }ifelse + }ifelse + }ifelse + }if + grestore + grestore + end + end + end + }ifelse + }bdf + /GenStrips + { + 40 dict begin + /ColorSpaceFamily xdf + /background xdf + /ext1 xdf + /ext0 xdf + /BBox xdf + /y2 xdf + /x2 xdf + /y1 xdf + /x1 xdf + /rampdict xdf + /setinkoverprint where{pop/setinkoverprint{pop}def}if + gsave + BBox length 0 gt + { + np + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + np + }if + x1 x2 eq + { + y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse + }{ + /slope y2 y1 sub x2 x1 sub div def + /theta slope 1 atan def + x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if + x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if + } + ifelse + gsave + clippath + x1 y1 translate + theta rotate + {pathbbox}stopped + {0 0 0 0}if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + }{ + rampdict begin + 20 dict begin + background length 0 gt{background sssetbackground gsave clippath fill grestore}if + gsave + x1 y1 translate + theta rotate + /xStart 0 def + /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def + /ySpan yMax yMin sub def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + xStart 0 transform + xEnd 0 transform + 3 -1 roll + sub dup mul + 3 1 roll + sub dup mul + add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt{exch}if pop + mul + /numpix xdf + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + }if + }if + ext0 + { + 0 getrampcolor + xMin xStart lt + { + xMin yMin xMin neg ySpan rectfill + }if + }if + /xInc xEnd xStart sub numsteps div def + /x xStart def + 0 + numsteps + { + dup + subsampling{round cvi}if + getrampcolor + x yMin xInc ySpan rectfill + /x x xInc add def + rampIndxInc add + }repeat + pop + ext1{ + xMax xEnd gt + { + xEnd yMin xMax xEnd sub ySpan rectfill + }if + }if + grestore + grestore + end + end + end + }ifelse + }bdf +}def +/pt +{ + end +}def +/dt{ +}def +/pgsv{ + //Adobe_AGM_Core/AGMCORE_save save put +}def +/pgrs{ + //Adobe_AGM_Core/AGMCORE_save get restore +}def +systemdict/findcolorrendering known{ + /findcolorrendering systemdict/findcolorrendering get def +}if +systemdict/setcolorrendering known{ + /setcolorrendering systemdict/setcolorrendering get def +}if +/test_cmyk_color_plate +{ + gsave + setcmykcolor currentgray 1 ne + grestore +}def +/inRip_spot_has_ink +{ + dup//Adobe_AGM_Core/AGMCORE_name xddf + convert_spot_to_process not +}def +/map255_to_range +{ + 1 index sub + 3 -1 roll 255 div mul add +}def +/set_csa_crd +{ + /sep_colorspace_dict null AGMCORE_gput + begin + CSA get_csa_by_name setcolorspace_opt + set_crd + end +} +def +/map_csa +{ + currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse + {pop}{get_csa_by_name/MappedCSA xdf}ifelse +}def +/setsepcolor +{ + /sep_colorspace_dict AGMCORE_gget begin + dup/sep_tint exch AGMCORE_gput + TintProc + end +}def +/setdevicencolor +{ + /devicen_colorspace_dict AGMCORE_gget begin + Names length copy + Names length 1 sub -1 0 + { + /devicen_tints AGMCORE_gget 3 1 roll xpt + }for + TintProc + end +}def +/sep_colorspace_proc +{ + /AGMCORE_tmp exch store + /sep_colorspace_dict AGMCORE_gget begin + currentdict/Components known{ + Components aload pop + TintMethod/Lab eq{ + 2{AGMCORE_tmp mul NComponents 1 roll}repeat + LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll + }{ + TintMethod/Subtractive eq{ + NComponents{ + AGMCORE_tmp mul NComponents 1 roll + }repeat + }{ + NComponents{ + 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll + }repeat + }ifelse + }ifelse + }{ + ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get + aload pop + }ifelse + end +}def +/sep_colorspace_gray_proc +{ + /AGMCORE_tmp exch store + /sep_colorspace_dict AGMCORE_gget begin + GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get + end +}def +/sep_proc_name +{ + dup 0 get + dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{ + pop[/DeviceGray] + /sep_colorspace_gray_proc + }{ + /sep_colorspace_proc + }ifelse +}def +/setsepcolorspace +{ + current_spot_alias{ + dup begin + Name map_alias{ + exch pop + }if + end + }if + dup/sep_colorspace_dict exch AGMCORE_gput + begin + CSA map_csa + /AGMCORE_sep_special Name dup()eq exch(All)eq or store + AGMCORE_avoid_L2_sep_space{ + [/Indexed MappedCSA sep_proc_name 255 exch + {255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx + ]setcolorspace_opt + /TintProc{ + 255 mul round cvi setcolor + }bdf + }{ + MappedCSA 0 get/DeviceCMYK eq + currentdict/Components known and + AGMCORE_sep_special not and{ + /TintProc[ + Components aload pop Name findcmykcustomcolor + /exch cvx/setcustomcolor cvx + ]cvx bdf + }{ + AGMCORE_host_sep Name(All)eq and{ + /TintProc{ + 1 exch sub setseparationgray + }bdf + }{ + AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and + AGMCORE_host_sep or + Name()eq and{ + /TintProc[ + MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{ + cvx/setcmykcolor cvx + }{ + cvx/setgray cvx + }ifelse + ]cvx bdf + }{ + AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{ + /TintProc[ + /dup cvx + MappedCSA sep_proc_name cvx exch + 0 get/DeviceGray eq{ + 1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx + }if + /Name cvx/findcmykcustomcolor cvx/exch cvx + AGMCORE_host_sep{ + AGMCORE_is_cmyk_sep + /Name cvx + /AGMCORE_IsSeparationAProcessColor load/exec cvx + /not cvx/and cvx + }{ + Name inRip_spot_has_ink not + }ifelse + [ + /pop cvx 1 + ]cvx/if cvx + /setcustomcolor cvx + ]cvx bdf + }{ + /TintProc{setcolor}bdf + [/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt + }ifelse + }ifelse + }ifelse + }ifelse + }ifelse + set_crd + setsepcolor + end +}def +/additive_blend +{ + 3 dict begin + /numarrays xdf + /numcolors xdf + 0 1 numcolors 1 sub + { + /c1 xdf + 1 + 0 1 numarrays 1 sub + { + 1 exch add/index cvx + c1/get cvx/mul cvx + }for + numarrays 1 add 1/roll cvx + }for + numarrays[/pop cvx]cvx/repeat cvx + end +}def +/subtractive_blend +{ + 3 dict begin + /numarrays xdf + /numcolors xdf + 0 1 numcolors 1 sub + { + /c1 xdf + 1 1 + 0 1 numarrays 1 sub + { + 1 3 3 -1 roll add/index cvx + c1/get cvx/sub cvx/mul cvx + }for + /sub cvx + numarrays 1 add 1/roll cvx + }for + numarrays[/pop cvx]cvx/repeat cvx + end +}def +/exec_tint_transform +{ + /TintProc[ + /TintTransform cvx/setcolor cvx + ]cvx bdf + MappedCSA setcolorspace_opt +}bdf +/devn_makecustomcolor +{ + 2 dict begin + /names_index xdf + /Names xdf + 1 1 1 1 Names names_index get findcmykcustomcolor + /devicen_tints AGMCORE_gget names_index get setcustomcolor + Names length{pop}repeat + end +}bdf +/setdevicencolorspace +{ + dup/AliasedColorants known{false}{true}ifelse + current_spot_alias and{ + 7 dict begin + /names_index 0 def + dup/names_len exch/Names get length def + /new_names names_len array def + /new_LookupTables names_len array def + /alias_cnt 0 def + dup/Names get + { + dup map_alias{ + exch pop + dup/ColorLookup known{ + dup begin + new_LookupTables names_index ColorLookup put + end + }{ + dup/Components known{ + dup begin + new_LookupTables names_index Components put + end + }{ + dup begin + new_LookupTables names_index[null null null null]put + end + }ifelse + }ifelse + new_names names_index 3 -1 roll/Name get put + /alias_cnt alias_cnt 1 add def + }{ + /name xdf + new_names names_index name put + dup/LookupTables known{ + dup begin + new_LookupTables names_index LookupTables names_index get put + end + }{ + dup begin + new_LookupTables names_index[null null null null]put + end + }ifelse + }ifelse + /names_index names_index 1 add def + }forall + alias_cnt 0 gt{ + /AliasedColorants true def + /lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def + 0 1 names_len 1 sub{ + /names_index xdf + new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{ + /AliasedColorants false def + exit + }{ + new_LookupTables names_index get 0 get null eq{ + dup/Names get names_index get/name xdf + name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq + or or or not{ + /AliasedColorants false def + exit + }if + }if + }ifelse + }for + lut_entry_len 1 eq{ + /AliasedColorants false def + }if + AliasedColorants{ + dup begin + /Names new_names def + /LookupTables new_LookupTables def + /AliasedColorants true def + /NComponents lut_entry_len def + /TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def + /MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def + currentdict/TTTablesIdx known not{ + /TTTablesIdx -1 def + }if + end + }if + }if + end + }if + dup/devicen_colorspace_dict exch AGMCORE_gput + begin + currentdict/AliasedColorants known{ + AliasedColorants + }{ + false + }ifelse + dup not{ + CSA map_csa + }if + /TintTransform load type/nulltype eq or{ + /TintTransform[ + 0 1 Names length 1 sub + { + /TTTablesIdx TTTablesIdx 1 add def + dup LookupTables exch get dup 0 get null eq + { + 1 index + Names exch get + dup(Cyan)eq + { + pop exch + LookupTables length exch sub + /index cvx + 0 0 0 + } + { + dup(Magenta)eq + { + pop exch + LookupTables length exch sub + /index cvx + 0/exch cvx 0 0 + }{ + (Yellow)eq + { + exch + LookupTables length exch sub + /index cvx + 0 0 3 -1/roll cvx 0 + }{ + exch + LookupTables length exch sub + /index cvx + 0 0 0 4 -1/roll cvx + }ifelse + }ifelse + }ifelse + 5 -1/roll cvx/astore cvx + }{ + dup length 1 sub + LookupTables length 4 -1 roll sub 1 add + /index cvx/mul cvx/round cvx/cvi cvx/get cvx + }ifelse + Names length TTTablesIdx add 1 add 1/roll cvx + }for + Names length[/pop cvx]cvx/repeat cvx + NComponents Names length + TintMethod/Subtractive eq + { + subtractive_blend + }{ + additive_blend + }ifelse + ]cvx bdf + }if + AGMCORE_host_sep{ + Names convert_to_process{ + exec_tint_transform + } + { + currentdict/AliasedColorants known{ + AliasedColorants not + }{ + false + }ifelse + 5 dict begin + /AvoidAliasedColorants xdf + /painted? false def + /names_index 0 def + /names_len Names length def + AvoidAliasedColorants{ + /currentspotalias current_spot_alias def + false set_spot_alias + }if + Names{ + AGMCORE_is_cmyk_sep{ + dup(Cyan)eq AGMCORE_cyan_plate and exch + dup(Magenta)eq AGMCORE_magenta_plate and exch + dup(Yellow)eq AGMCORE_yellow_plate and exch + (Black)eq AGMCORE_black_plate and or or or{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + Names names_index/devn_makecustomcolor cvx + ]cvx ddf + /painted? true def + }if + painted?{exit}if + }{ + 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + Names names_index/devn_makecustomcolor cvx + ]cvx ddf + /painted? true def + exit + }if + }ifelse + /names_index names_index 1 add def + }forall + AvoidAliasedColorants{ + currentspotalias set_spot_alias + }if + painted?{ + /devicen_colorspace_dict AGMCORE_gget/names_index names_index put + }{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx + 0 0 0 0/setcmykcolor cvx + ]cvx ddf + }ifelse + end + }ifelse + } + { + AGMCORE_in_rip_sep{ + Names convert_to_process not + }{ + level3 + }ifelse + { + [/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt + /TintProc level3 not AGMCORE_in_rip_sep and{ + [ + Names/length cvx[/pop cvx]cvx/repeat cvx + ]cvx bdf + }{ + {setcolor}bdf + }ifelse + }{ + exec_tint_transform + }ifelse + }ifelse + set_crd + /AliasedColorants false def + end +}def +/setindexedcolorspace +{ + dup/indexed_colorspace_dict exch AGMCORE_gput + begin + currentdict/CSDBase known{ + CSDBase/CSD get_res begin + currentdict/Names known{ + currentdict devncs + }{ + 1 currentdict sepcs + }ifelse + AGMCORE_host_sep{ + 4 dict begin + /compCnt/Names where{pop Names length}{1}ifelse def + /NewLookup HiVal 1 add string def + 0 1 HiVal{ + /tableIndex xdf + Lookup dup type/stringtype eq{ + compCnt tableIndex map_index + }{ + exec + }ifelse + /Names where{ + pop setdevicencolor + }{ + setsepcolor + }ifelse + currentgray + tableIndex exch + 255 mul cvi + NewLookup 3 1 roll put + }for + [/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt + end + }{ + level3 + { + currentdict/Names known{ + [/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt + }{ + [/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt + }ifelse + }{ + [/Indexed MappedCSA HiVal + [ + currentdict/Names known{ + Lookup dup type/stringtype eq + {/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx} + {/exec cvx}ifelse + /TintTransform load/exec cvx + }{ + Lookup dup type/stringtype eq + {/exch cvx/get cvx 255/div cvx} + {/exec cvx}ifelse + CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx + }ifelse + ]cvx + ]setcolorspace_opt + }ifelse + }ifelse + end + set_crd + } + { + CSA map_csa + AGMCORE_host_sep level2 not and{ + 0 0 0 0 setcmykcolor + }{ + [/Indexed MappedCSA + level2 not has_color not and{ + dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{ + pop[/DeviceGray] + }if + HiVal GrayLookup + }{ + HiVal + currentdict/RangeArray known{ + { + /indexed_colorspace_dict AGMCORE_gget begin + Lookup exch + dup HiVal gt{ + pop HiVal + }if + NComponents mul NComponents getinterval{}forall + NComponents 1 sub -1 0{ + RangeArray exch 2 mul 2 getinterval aload pop map255_to_range + NComponents 1 roll + }for + end + }bind + }{ + Lookup + }ifelse + }ifelse + ]setcolorspace_opt + set_crd + }ifelse + }ifelse + end +}def +/setindexedcolor +{ + AGMCORE_host_sep{ + /indexed_colorspace_dict AGMCORE_gget + begin + currentdict/CSDBase known{ + CSDBase/CSD get_res begin + currentdict/Names known{ + map_indexed_devn + devn + } + { + Lookup 1 3 -1 roll map_index + sep + }ifelse + end + }{ + Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll + map_index + MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse + }ifelse + end + }{ + level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{ + /indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin + map_indexed_devn + devn + end + } + { + setcolor + }ifelse + }ifelse +}def +/ignoreimagedata +{ + currentoverprint not{ + gsave + dup clonedict begin + 1 setgray + /Decode[0 1]def + /DataSourcedef + /MultipleDataSources false def + /BitsPerComponent 8 def + currentdict end + systemdict/image gx + grestore + }if + consumeimagedata +}def +/add_res +{ + dup/CSD eq{ + pop + //Adobe_AGM_Core begin + /AGMCORE_CSD_cache load 3 1 roll put + end + }{ + defineresource pop + }ifelse +}def +/del_res +{ + { + aload pop exch + dup/CSD eq{ + pop + {//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall + }{ + exch + {1 index undefineresource}forall + pop + }ifelse + }forall +}def +/get_res +{ + dup/CSD eq{ + pop + dup type dup/nametype eq exch/stringtype eq or{ + AGMCORE_CSD_cache exch get + }if + }{ + findresource + }ifelse +}def +/get_csa_by_name +{ + dup type dup/nametype eq exch/stringtype eq or{ + /CSA get_res + }if +}def +/paintproc_buf_init +{ + /count get 0 0 put +}def +/paintproc_buf_next +{ + dup/count get dup 0 get + dup 3 1 roll + 1 add 0 xpt + get +}def +/cachepaintproc_compress +{ + 5 dict begin + currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def + /ppdict 20 dict def + /string_size 16000 def + /readbuffer string_size string def + currentglobal true setglobal + ppdict 1 array dup 0 1 put/count xpt + setglobal + /LZWFilter + { + exch + dup length 0 eq{ + pop + }{ + ppdict dup length 1 sub 3 -1 roll put + }ifelse + {string_size}{0}ifelse string + }/LZWEncode filter def + { + ReadFilter readbuffer readstring + exch LZWFilter exch writestring + not{exit}if + }loop + LZWFilter closefile + ppdict + end +}def +/cachepaintproc +{ + 2 dict begin + currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def + /ppdict 20 dict def + currentglobal true setglobal + ppdict 1 array dup 0 1 put/count xpt + setglobal + { + ReadFilter 16000 string readstring exch + ppdict dup length 1 sub 3 -1 roll put + not{exit}if + }loop + ppdict dup dup length 1 sub()put + end +}def +/make_pattern +{ + exch clonedict exch + dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform + exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub + exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub + matrix translate exch matrix concatmatrix + 1 index begin + BBox 0 get XStep div cvi XStep mul/xshift exch neg def + BBox 1 get YStep div cvi YStep mul/yshift exch neg def + BBox 0 get xshift add + BBox 1 get yshift add + BBox 2 get xshift add + BBox 3 get yshift add + 4 array astore + /BBox exch def + [xshift yshift/translate load null/exec load]dup + 3/PaintProc load put cvx/PaintProc exch def + end + gsave 0 setgray + makepattern + grestore +}def +/set_pattern +{ + dup/PatternType get 1 eq{ + dup/PaintType get 1 eq{ + currentoverprint sop[/DeviceGray]setcolorspace 0 setgray + }if + }if + setpattern +}def +/setcolorspace_opt +{ + dup currentcolorspace eq{pop}{setcolorspace}ifelse +}def +/updatecolorrendering +{ + currentcolorrendering/RenderingIntent known{ + currentcolorrendering/RenderingIntent get + } + { + Intent/AbsoluteColorimetric eq + { + /absolute_colorimetric_crd AGMCORE_gget dup null eq + } + { + Intent/RelativeColorimetric eq + { + /relative_colorimetric_crd AGMCORE_gget dup null eq + } + { + Intent/Saturation eq + { + /saturation_crd AGMCORE_gget dup null eq + } + { + /perceptual_crd AGMCORE_gget dup null eq + }ifelse + }ifelse + }ifelse + { + pop null + } + { + /RenderingIntent known{null}{Intent}ifelse + }ifelse + }ifelse + Intent ne{ + Intent/ColorRendering{findresource}stopped + { + pop pop systemdict/findcolorrendering known + { + Intent findcolorrendering + { + /ColorRendering findresource true exch + } + { + /ColorRendering findresource + product(Xerox Phaser 5400)ne + exch + }ifelse + dup Intent/AbsoluteColorimetric eq + { + /absolute_colorimetric_crd exch AGMCORE_gput + } + { + Intent/RelativeColorimetric eq + { + /relative_colorimetric_crd exch AGMCORE_gput + } + { + Intent/Saturation eq + { + /saturation_crd exch AGMCORE_gput + } + { + Intent/Perceptual eq + { + /perceptual_crd exch AGMCORE_gput + } + { + pop + }ifelse + }ifelse + }ifelse + }ifelse + 1 index{exch}{pop}ifelse + } + {false}ifelse + } + {true}ifelse + { + dup begin + currentdict/TransformPQR known{ + currentdict/TransformPQR get aload pop + 3{{}eq 3 1 roll}repeat or or + } + {true}ifelse + currentdict/MatrixPQR known{ + currentdict/MatrixPQR get aload pop + 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll + 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll + 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq + and and and and and and and and + } + {true}ifelse + end + or + { + clonedict begin + /TransformPQR[ + {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div + 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind + {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div + 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind + {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div + 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind + ]def + /MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def + /RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def + currentdict end + }if + setcolorrendering_opt + }if + }if +}def +/set_crd +{ + AGMCORE_host_sep not level2 and{ + currentdict/ColorRendering known{ + ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if + }{ + currentdict/Intent known{ + updatecolorrendering + }if + }ifelse + currentcolorspace dup type/arraytype eq + {0 get}if + /DeviceRGB eq + { + currentdict/UCR known + {/UCR}{/AGMCORE_currentucr}ifelse + load setundercolorremoval + currentdict/BG known + {/BG}{/AGMCORE_currentbg}ifelse + load setblackgeneration + }if + }if +}def +/set_ucrbg +{ + dup null eq {pop /AGMCORE_currentbg load}{/Procedure get_res}ifelse + dup currentblackgeneration eq {pop}{setblackgeneration}ifelse + dup null eq {pop /AGMCORE_currentucr load}{/Procedure get_res}ifelse + dup currentundercolorremoval eq {pop}{setundercolorremoval}ifelse +}def +/setcolorrendering_opt +{ + dup currentcolorrendering eq{ + pop + }{ + product(HP Color LaserJet 2605)anchorsearch{ + pop pop pop + }{ + pop + clonedict + begin + /Intent Intent def + currentdict + end + setcolorrendering + }ifelse + }ifelse +}def +/cpaint_gcomp +{ + convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf + //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not + { + (%end_cpaint_gcomp)flushinput + }if +}def +/cpaint_gsep +{ + //Adobe_AGM_Core/AGMCORE_ConvertToProcess get + { + (%end_cpaint_gsep)flushinput + }if +}def +/cpaint_gend +{np}def +/T1_path +{ + currentfile token pop currentfile token pop mo + { + currentfile token pop dup type/stringtype eq + {pop exit}if + 0 exch rlineto + currentfile token pop dup type/stringtype eq + {pop exit}if + 0 rlineto + }loop +}def +/T1_gsave + level3 + {/clipsave} + {/gsave}ifelse + load def +/T1_grestore + level3 + {/cliprestore} + {/grestore}ifelse + load def +/set_spot_alias_ary +{ + dup inherit_aliases + //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf +}def +/set_spot_normalization_ary +{ + dup inherit_aliases + dup length + /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if + array + //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf + /AGMCORE_SpotAliasAry where{ + pop + AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval + AGMCORE_SpotAliasAry length + }{0}ifelse + AGMCORE_SpotAliasAry2 3 1 roll exch putinterval + true set_spot_alias +}def +/inherit_aliases +{ + {dup/Name get map_alias{/CSD put}{pop}ifelse}forall +}def +/set_spot_alias +{ + /AGMCORE_SpotAliasAry2 where{ + /AGMCORE_current_spot_alias 3 -1 roll put + }{ + pop + }ifelse +}def +/current_spot_alias +{ + /AGMCORE_SpotAliasAry2 where{ + /AGMCORE_current_spot_alias get + }{ + false + }ifelse +}def +/map_alias +{ + /AGMCORE_SpotAliasAry2 where{ + begin + /AGMCORE_name xdf + false + AGMCORE_SpotAliasAry2{ + dup/Name get AGMCORE_name eq{ + /CSD get/CSD get_res + exch pop true + exit + }{ + pop + }ifelse + }forall + end + }{ + pop false + }ifelse +}bdf +/spot_alias +{ + true set_spot_alias + /AGMCORE_&setcustomcolor AGMCORE_key_known not{ + //Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put + }if + /customcolor_tint 1 AGMCORE_gput + //Adobe_AGM_Core begin + /setcustomcolor + { + //Adobe_AGM_Core begin + dup/customcolor_tint exch AGMCORE_gput + 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not + current_spot_alias and{1 index 4 get map_alias}{false}ifelse + { + false set_spot_alias + /sep_colorspace_dict AGMCORE_gget null ne + {/sep_colorspace_dict AGMCORE_gget/ForeignContent known not}{false}ifelse + 3 1 roll 2 index{ + exch pop/sep_tint AGMCORE_gget exch + }if + mark 3 1 roll + setsepcolorspace + counttomark 0 ne{ + setsepcolor + }if + pop + not{/sep_tint 1.0 AGMCORE_gput/sep_colorspace_dict AGMCORE_gget/ForeignContent true put}if + pop + true set_spot_alias + }{ + AGMCORE_&setcustomcolor + }ifelse + end + }bdf + end +}def +/begin_feature +{ + Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put + count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put + {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if +}def +/end_feature +{ + 2 dict begin + /spd/setpagedevice load def + /setpagedevice{get_gstate spd set_gstate}def + stopped{$error/newerror false put}if + end + count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse + countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse + {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if +}def +/set_negative +{ + //Adobe_AGM_Core begin + /AGMCORE_inverting exch def + level2{ + currentpagedevice/NegativePrint known AGMCORE_distilling not and{ + currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{ + true begin_feature true{ + <>setpagedevice + }end_feature + }if + /AGMCORE_inverting false def + }if + }if + AGMCORE_inverting{ + [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer + AGMCORE_distilling{ + erasepage + }{ + gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse + /AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore + }ifelse + }if + end +}def +/lw_save_restore_override{ + /md where{ + pop + md begin + initializepage + /initializepage{}def + /pmSVsetup{}def + /endp{}def + /pse{}def + /psb{}def + /orig_showpage where + {pop} + {/orig_showpage/showpage load def} + ifelse + /showpage{orig_showpage gR}def + end + }if +}def +/pscript_showpage_override{ + /NTPSOct95 where + { + begin + showpage + save + /showpage/restore load def + /restore{exch pop}def + end + }if +}def +/driver_media_override +{ + /md where{ + pop + md/initializepage known{ + md/initializepage{}put + }if + md/rC known{ + md/rC{4{pop}repeat}put + }if + }if + /mysetup where{ + /mysetup[1 0 0 1 0 0]put + }if + Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put + level2 + {Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if +}def +/capture_mysetup +{ + /Pscript_Win_Data where{ + pop + Pscript_Win_Data/mysetup known{ + Adobe_AGM_Core/save_mysetup Pscript_Win_Data/mysetup get put + }if + }if +}def +/restore_mysetup +{ + /Pscript_Win_Data where{ + pop + Pscript_Win_Data/mysetup known{ + Adobe_AGM_Core/save_mysetup known{ + Pscript_Win_Data/mysetup Adobe_AGM_Core/save_mysetup get put + Adobe_AGM_Core/save_mysetup undef + }if + }if + }if +}def +/driver_check_media_override +{ + /PrepsDict where + {pop} + { + Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne + Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq + { + Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and + Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and + }if + { + Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix + }if + }ifelse +}def +AGMCORE_err_strings begin + /AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def + /AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def + /AGMCORE_invalid_color_space(This job contains an invalid color space. )def +end +/set_def_ht +{AGMCORE_def_ht sethalftone}def +/set_def_flat +{AGMCORE_Default_flatness setflat}def +end +systemdict/setpacking known +{setpacking}if +%%EndResource +%%BeginResource: procset Adobe_CoolType_Core 2.31 0 +%%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved. +%%Version: 2.31 0 +10 dict begin +/Adobe_CoolType_Passthru currentdict def +/Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def +Adobe_CoolType_Core_Defined + {/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def} +if +userdict/Adobe_CoolType_Core 70 dict dup begin put +/Adobe_CoolType_Version 2.31 def +/Level2? + systemdict/languagelevel known dup + {pop systemdict/languagelevel get 2 ge} + if def +Level2? not + { + /currentglobal false def + /setglobal/pop load def + /gcheck{pop false}bind def + /currentpacking false def + /setpacking/pop load def + /SharedFontDirectory 0 dict def + } +if +currentpacking +true setpacking +currentglobal false setglobal +userdict/Adobe_CoolType_Data 2 copy known not + {2 copy 10 dict put} +if +get + begin + /@opStackCountByLevel 32 dict def + /@opStackLevel 0 def + /@dictStackCountByLevel 32 dict def + /@dictStackLevel 0 def + end +setglobal +currentglobal true setglobal +userdict/Adobe_CoolType_GVMFonts known not + {userdict/Adobe_CoolType_GVMFonts 10 dict put} +if +setglobal +currentglobal false setglobal +userdict/Adobe_CoolType_LVMFonts known not + {userdict/Adobe_CoolType_LVMFonts 10 dict put} +if +setglobal +/ct_VMDictPut + { + dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse + 3 1 roll put + }bind def +/ct_VMDictUndef + { + dup Adobe_CoolType_GVMFonts exch known + {Adobe_CoolType_GVMFonts exch undef} + { + dup Adobe_CoolType_LVMFonts exch known + {Adobe_CoolType_LVMFonts exch undef} + {pop} + ifelse + }ifelse + }bind def +/ct_str1 1 string def +/ct_xshow +{ + /_ct_na exch def + /_ct_i 0 def + currentpoint + /_ct_y exch def + /_ct_x exch def + { + pop pop + ct_str1 exch 0 exch put + ct_str1 show + {_ct_na _ct_i get}stopped + {pop pop} + { + _ct_x _ct_y moveto + 0 + rmoveto + } + ifelse + /_ct_i _ct_i 1 add def + currentpoint + /_ct_y exch def + /_ct_x exch def + } + exch + @cshow +}bind def +/ct_yshow +{ + /_ct_na exch def + /_ct_i 0 def + currentpoint + /_ct_y exch def + /_ct_x exch def + { + pop pop + ct_str1 exch 0 exch put + ct_str1 show + {_ct_na _ct_i get}stopped + {pop pop} + { + _ct_x _ct_y moveto + 0 exch + rmoveto + } + ifelse + /_ct_i _ct_i 1 add def + currentpoint + /_ct_y exch def + /_ct_x exch def + } + exch + @cshow +}bind def +/ct_xyshow +{ + /_ct_na exch def + /_ct_i 0 def + currentpoint + /_ct_y exch def + /_ct_x exch def + { + pop pop + ct_str1 exch 0 exch put + ct_str1 show + {_ct_na _ct_i get}stopped + {pop pop} + { + {_ct_na _ct_i 1 add get}stopped + {pop pop pop} + { + _ct_x _ct_y moveto + rmoveto + } + ifelse + } + ifelse + /_ct_i _ct_i 2 add def + currentpoint + /_ct_y exch def + /_ct_x exch def + } + exch + @cshow +}bind def +/xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def +/ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def +/xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def +currentglobal true setglobal +/ct_T3Defs +{ +/BuildChar +{ + 1 index/Encoding get exch get + 1 index/BuildGlyph get exec +}bind def +/BuildGlyph +{ + exch begin + GlyphProcs exch get exec + end +}bind def +}bind def +setglobal +/@_SaveStackLevels + { + Adobe_CoolType_Data + begin + /@vmState currentglobal def false setglobal + @opStackCountByLevel + @opStackLevel + 2 copy known not + { + 2 copy + 3 dict dup/args + 7 index + 5 add array put + put get + } + { + get dup/args get dup length 3 index lt + { + dup length 5 add array exch + 1 index exch 0 exch putinterval + 1 index exch/args exch put + } + {pop} + ifelse + } + ifelse + begin + count 1 sub + 1 index lt + {pop count} + if + dup/argCount exch def + dup 0 gt + { + args exch 0 exch getinterval + astore pop + } + {pop} + ifelse + count + /restCount exch def + end + /@opStackLevel @opStackLevel 1 add def + countdictstack 1 sub + @dictStackCountByLevel exch @dictStackLevel exch put + /@dictStackLevel @dictStackLevel 1 add def + @vmState setglobal + end + }bind def +/@_RestoreStackLevels + { + Adobe_CoolType_Data + begin + /@opStackLevel @opStackLevel 1 sub def + @opStackCountByLevel @opStackLevel get + begin + count restCount sub dup 0 gt + {{pop}repeat} + {pop} + ifelse + args 0 argCount getinterval{}forall + end + /@dictStackLevel @dictStackLevel 1 sub def + @dictStackCountByLevel @dictStackLevel get + end + countdictstack exch sub dup 0 gt + {{end}repeat} + {pop} + ifelse + }bind def +/@_PopStackLevels + { + Adobe_CoolType_Data + begin + /@opStackLevel @opStackLevel 1 sub def + /@dictStackLevel @dictStackLevel 1 sub def + end + }bind def +/@Raise + { + exch cvx exch errordict exch get exec + stop + }bind def +/@ReRaise + { + cvx $error/errorname get errordict exch get exec + stop + }bind def +/@Stopped + { + 0 @#Stopped + }bind def +/@#Stopped + { + @_SaveStackLevels + stopped + {@_RestoreStackLevels true} + {@_PopStackLevels false} + ifelse + }bind def +/@Arg + { + Adobe_CoolType_Data + begin + @opStackCountByLevel @opStackLevel 1 sub get + begin + args exch + argCount 1 sub exch sub get + end + end + }bind def +currentglobal true setglobal +/CTHasResourceForAllBug + Level2? + { + 1 dict dup + /@shouldNotDisappearDictValue true def + Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put + begin + count @_SaveStackLevels + {(*){pop stop}128 string/Category resourceforall} + stopped pop + @_RestoreStackLevels + currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll + { + /@shouldNotDisappearDictValue known + { + { + end + currentdict 1 index eq + {pop exit} + if + } + loop + } + if + } + { + pop + end + } + ifelse + } + {false} + ifelse + def +true setglobal +/CTHasResourceStatusBug + Level2? + { + mark + {/steveamerige/Category resourcestatus} + stopped + {cleartomark true} + {cleartomark currentglobal not} + ifelse + } + {false} + ifelse + def +setglobal +/CTResourceStatus + { + mark 3 1 roll + /Category findresource + begin + ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec + {cleartomark false} + {{3 2 roll pop true}{cleartomark false}ifelse} + ifelse + end + }bind def +/CTWorkAroundBugs + { + Level2? + { + /cid_PreLoad/ProcSet resourcestatus + { + pop pop + currentglobal + mark + { + (*) + { + dup/CMap CTHasResourceStatusBug + {CTResourceStatus} + {resourcestatus} + ifelse + { + pop dup 0 eq exch 1 eq or + { + dup/CMap findresource gcheck setglobal + /CMap undefineresource + } + { + pop CTHasResourceForAllBug + {exit} + {stop} + ifelse + } + ifelse + } + {pop} + ifelse + } + 128 string/CMap resourceforall + } + stopped + {cleartomark} + stopped pop + setglobal + } + if + } + if + }bind def +/ds + { + Adobe_CoolType_Core + begin + CTWorkAroundBugs + /mo/moveto load def + /nf/newencodedfont load def + /msf{makefont setfont}bind def + /uf{dup undefinefont ct_VMDictUndef}bind def + /ur/undefineresource load def + /chp/charpath load def + /awsh/awidthshow load def + /wsh/widthshow load def + /ash/ashow load def + /@xshow/xshow load def + /@yshow/yshow load def + /@xyshow/xyshow load def + /@cshow/cshow load def + /sh/show load def + /rp/repeat load def + /.n/.notdef def + end + currentglobal false setglobal + userdict/Adobe_CoolType_Data 2 copy known not + {2 copy 10 dict put} + if + get + begin + /AddWidths? false def + /CC 0 def + /charcode 2 string def + /@opStackCountByLevel 32 dict def + /@opStackLevel 0 def + /@dictStackCountByLevel 32 dict def + /@dictStackLevel 0 def + /InVMFontsByCMap 10 dict def + /InVMDeepCopiedFonts 10 dict def + end + setglobal + }bind def +/dt + { + currentdict Adobe_CoolType_Core eq + {end} + if + }bind def +/ps + { + Adobe_CoolType_Core begin + Adobe_CoolType_GVMFonts begin + Adobe_CoolType_LVMFonts begin + SharedFontDirectory begin + }bind def +/pt + { + end + end + end + end + }bind def +/unload + { + systemdict/languagelevel known + { + systemdict/languagelevel get 2 ge + { + userdict/Adobe_CoolType_Core 2 copy known + {undef} + {pop pop} + ifelse + } + if + } + if + }bind def +/ndf + { + 1 index where + {pop pop pop} + {dup xcheck{bind}if def} + ifelse + }def +/findfont systemdict + begin + userdict + begin + /globaldict where{/globaldict get begin}if + dup where pop exch get + /globaldict where{pop end}if + end + end +Adobe_CoolType_Core_Defined + {/systemfindfont exch def} + { + /findfont 1 index def + /systemfindfont exch def + } +ifelse +/undefinefont + {pop}ndf +/copyfont + { + currentglobal 3 1 roll + 1 index gcheck setglobal + dup null eq{0}{dup length}ifelse + 2 index length add 1 add dict + begin + exch + { + 1 index/FID eq + {pop pop} + {def} + ifelse + } + forall + dup null eq + {pop} + {{def}forall} + ifelse + currentdict + end + exch setglobal + }bind def +/copyarray + { + currentglobal exch + dup gcheck setglobal + dup length array copy + exch setglobal + }bind def +/newencodedfont + { + currentglobal + { + SharedFontDirectory 3 index known + {SharedFontDirectory 3 index get/FontReferenced known} + {false} + ifelse + } + { + FontDirectory 3 index known + {FontDirectory 3 index get/FontReferenced known} + { + SharedFontDirectory 3 index known + {SharedFontDirectory 3 index get/FontReferenced known} + {false} + ifelse + } + ifelse + } + ifelse + dup + { + 3 index findfont/FontReferenced get + 2 index dup type/nametype eq + {findfont} + if ne + {pop false} + if + } + if + dup + { + 1 index dup type/nametype eq + {findfont} + if + dup/CharStrings known + { + /CharStrings get length + 4 index findfont/CharStrings get length + ne + { + pop false + } + if + } + {pop} + ifelse + } + if + { + pop + 1 index findfont + /Encoding get exch + 0 1 255 + {2 copy get 3 index 3 1 roll put} + for + pop pop pop + } + { + currentglobal + 4 1 roll + dup type/nametype eq + {findfont} + if + dup gcheck setglobal + dup dup maxlength 2 add dict + begin + exch + { + 1 index/FID ne + 2 index/Encoding ne and + {def} + {pop pop} + ifelse + } + forall + /FontReferenced exch def + /Encoding exch dup length array copy def + /FontName 1 index dup type/stringtype eq{cvn}if def dup + currentdict + end + definefont ct_VMDictPut + setglobal + } + ifelse + }bind def +/SetSubstituteStrategy + { + $SubstituteFont + begin + dup type/dicttype ne + {0 dict} + if + currentdict/$Strategies known + { + exch $Strategies exch + 2 copy known + { + get + 2 copy maxlength exch maxlength add dict + begin + {def}forall + {def}forall + currentdict + dup/$Init known + {dup/$Init get exec} + if + end + /$Strategy exch def + } + {pop pop pop} + ifelse + } + {pop pop} + ifelse + end + }bind def +/scff + { + $SubstituteFont + begin + dup type/stringtype eq + {dup length exch} + {null} + ifelse + /$sname exch def + /$slen exch def + /$inVMIndex + $sname null eq + { + 1 index $str cvs + dup length $slen sub $slen getinterval cvn + } + {$sname} + ifelse def + end + {findfont} + @Stopped + { + dup length 8 add string exch + 1 index 0(BadFont:)putinterval + 1 index exch 8 exch dup length string cvs putinterval cvn + {findfont} + @Stopped + {pop/Courier findfont} + if + } + if + $SubstituteFont + begin + /$sname null def + /$slen 0 def + /$inVMIndex null def + end + }bind def +/isWidthsOnlyFont + { + dup/WidthsOnly known + {pop pop true} + { + dup/FDepVector known + {/FDepVector get{isWidthsOnlyFont dup{exit}if}forall} + { + dup/FDArray known + {/FDArray get{isWidthsOnlyFont dup{exit}if}forall} + {pop} + ifelse + } + ifelse + } + ifelse + }bind def +/ct_StyleDicts 4 dict dup begin + /Adobe-Japan1 4 dict dup begin + Level2? + { + /Serif + /HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus + {pop pop/HeiseiMin-W3} + { + /CIDFont/Category resourcestatus + { + pop pop + /HeiseiMin-W3/CIDFont resourcestatus + {pop pop/HeiseiMin-W3} + {/Ryumin-Light} + ifelse + } + {/Ryumin-Light} + ifelse + } + ifelse + def + /SansSerif + /HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus + {pop pop/HeiseiKakuGo-W5} + { + /CIDFont/Category resourcestatus + { + pop pop + /HeiseiKakuGo-W5/CIDFont resourcestatus + {pop pop/HeiseiKakuGo-W5} + {/GothicBBB-Medium} + ifelse + } + {/GothicBBB-Medium} + ifelse + } + ifelse + def + /HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus + {pop pop/HeiseiMaruGo-W4} + { + /CIDFont/Category resourcestatus + { + pop pop + /HeiseiMaruGo-W4/CIDFont resourcestatus + {pop pop/HeiseiMaruGo-W4} + { + /Jun101-Light-RKSJ-H/Font resourcestatus + {pop pop/Jun101-Light} + {SansSerif} + ifelse + } + ifelse + } + { + /Jun101-Light-RKSJ-H/Font resourcestatus + {pop pop/Jun101-Light} + {SansSerif} + ifelse + } + ifelse + } + ifelse + /RoundSansSerif exch def + /Default Serif def + } + { + /Serif/Ryumin-Light def + /SansSerif/GothicBBB-Medium def + { + (fonts/Jun101-Light-83pv-RKSJ-H)status + }stopped + {pop}{ + {pop pop pop pop/Jun101-Light} + {SansSerif} + ifelse + /RoundSansSerif exch def + }ifelse + /Default Serif def + } + ifelse + end + def + /Adobe-Korea1 4 dict dup begin + /Serif/HYSMyeongJo-Medium def + /SansSerif/HYGoThic-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-GB1 4 dict dup begin + /Serif/STSong-Light def + /SansSerif/STHeiti-Regular def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-CNS1 4 dict dup begin + /Serif/MKai-Medium def + /SansSerif/MHei-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def +end +def +Level2?{currentglobal true setglobal}if +/ct_BoldRomanWidthProc + { + stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth + 0 0 + }bind def +/ct_Type0WidthProc + { + dup stringwidth 0 0 moveto + 2 index true charpath pathbbox + 0 -1 + 7 index 2 div .88 + setcachedevice2 + pop + 0 0 + }bind def +/ct_Type0WMode1WidthProc + { + dup stringwidth + pop 2 div neg -0.88 + 2 copy + moveto + 0 -1 + 5 -1 roll true charpath pathbbox + setcachedevice + }bind def +/cHexEncoding +[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 +/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 +/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 +/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B +/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E +/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 +/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 +/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 +/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA +/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD +/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 +/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 +/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 +/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def +/ct_BoldBaseFont + 11 dict begin + /FontType 3 def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /Encoding cHexEncoding def + /_setwidthProc/ct_BoldRomanWidthProc load def + /_bcstr1 1 string def + /BuildChar + { + exch begin + _basefont setfont + _bcstr1 dup 0 4 -1 roll put + dup + _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bind def + currentdict + end +def +systemdict/composefont known +{ +/ct_DefineIdentity-H +{ + /Identity-H/CMap resourcestatus + { + pop pop + } + { + /CIDInit/ProcSet findresource begin + 12 dict begin + begincmap + /CIDSystemInfo 3 dict dup begin + /Registry(Adobe)def + /Ordering(Identity)def + /Supplement 0 def + end def + /CMapName/Identity-H def + /CMapVersion 1.000 def + /CMapType 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000>0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } + ifelse +} +def +/ct_BoldBaseCIDFont + 11 dict begin + /CIDFontType 1 def + /CIDFontName/ct_BoldBaseCIDFont def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /_setwidthProc/ct_Type0WidthProc load def + /_bcstr2 2 string def + /BuildGlyph + { + exch begin + _basefont setfont + _bcstr2 1 2 index 256 mod put + _bcstr2 0 3 -1 roll 256 idiv put + _bcstr2 dup _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bind def + currentdict + end +def +}if +Level2?{setglobal}if +/ct_CopyFont{ + { + 1 index/FID ne 2 index/UniqueID ne and + {def}{pop pop}ifelse + }forall +}bind def +/ct_Type0CopyFont +{ + exch + dup length dict + begin + ct_CopyFont + [ + exch + FDepVector + { + dup/FontType get 0 eq + { + 1 index ct_Type0CopyFont + /_ctType0 exch definefont + } + { + /_ctBaseFont exch + 2 index exec + } + ifelse + exch + } + forall + pop + ] + /FDepVector exch def + currentdict + end +}bind def +/ct_MakeBoldFont +{ + dup/ct_SyntheticBold known + { + dup length 3 add dict begin + ct_CopyFont + /ct_StrokeWidth .03 0 FontMatrix idtransform pop def + /ct_SyntheticBold true def + currentdict + end + definefont + } + { + dup dup length 3 add dict + begin + ct_CopyFont + /PaintType 2 def + /StrokeWidth .03 0 FontMatrix idtransform pop def + /dummybold currentdict + end + definefont + dup/FontType get dup 9 ge exch 11 le and + { + ct_BoldBaseCIDFont + dup length 3 add dict copy begin + dup/CIDSystemInfo get/CIDSystemInfo exch def + ct_DefineIdentity-H + /_Type0Identity/Identity-H 3 -1 roll[exch]composefont + /_basefont exch def + /_Type0Identity/Identity-H 3 -1 roll[exch]composefont + /_basefonto exch def + currentdict + end + /CIDFont defineresource + } + { + ct_BoldBaseFont + dup length 3 add dict copy begin + /_basefont exch def + /_basefonto exch def + currentdict + end + definefont + } + ifelse + } + ifelse +}bind def +/ct_MakeBold{ + 1 index + 1 index + findfont + currentglobal 5 1 roll + dup gcheck setglobal + dup + /FontType get 0 eq + { + dup/WMode known{dup/WMode get 1 eq}{false}ifelse + version length 4 ge + and + {version 0 4 getinterval cvi 2015 ge} + {true} + ifelse + {/ct_Type0WidthProc} + {/ct_Type0WMode1WidthProc} + ifelse + ct_BoldBaseFont/_setwidthProc 3 -1 roll load put + {ct_MakeBoldFont}ct_Type0CopyFont definefont + } + { + dup/_fauxfont known not 1 index/SubstMaster known not and + { + ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put + ct_MakeBoldFont + } + { + 2 index 2 index eq + {exch pop } + { + dup length dict begin + ct_CopyFont + currentdict + end + definefont + } + ifelse + } + ifelse + } + ifelse + pop pop pop + setglobal +}bind def +/?str1 256 string def +/?set + { + $SubstituteFont + begin + /$substituteFound false def + /$fontname 1 index def + /$doSmartSub false def + end + dup + findfont + $SubstituteFont + begin + $substituteFound + {false} + { + dup/FontName known + { + dup/FontName get $fontname eq + 1 index/DistillerFauxFont known not and + /currentdistillerparams where + {pop false 2 index isWidthsOnlyFont not and} + if + } + {false} + ifelse + } + ifelse + exch pop + /$doSmartSub true def + end + { + 5 1 roll pop pop pop pop + findfont + } + { + 1 index + findfont + dup/FontType get 3 eq + { + 6 1 roll pop pop pop pop pop false + } + {pop true} + ifelse + { + $SubstituteFont + begin + pop pop + /$styleArray 1 index def + /$regOrdering 2 index def + pop pop + 0 1 $styleArray length 1 sub + { + $styleArray exch get + ct_StyleDicts $regOrdering + 2 copy known + { + get + exch 2 copy known not + {pop/Default} + if + get + dup type/nametype eq + { + ?str1 cvs length dup 1 add exch + ?str1 exch(-)putinterval + exch dup length exch ?str1 exch 3 index exch putinterval + add ?str1 exch 0 exch getinterval cvn + } + { + pop pop/Unknown + } + ifelse + } + { + pop pop pop pop/Unknown + } + ifelse + } + for + end + findfont + }if + } + ifelse + currentglobal false setglobal 3 1 roll + null copyfont definefont pop + setglobal + }bind def +setpacking +userdict/$SubstituteFont 25 dict put +1 dict + begin + /SubstituteFont + dup $error exch 2 copy known + {get} + {pop pop{pop/Courier}bind} + ifelse def + /currentdistillerparams where dup + { + pop pop + currentdistillerparams/CannotEmbedFontPolicy 2 copy known + {get/Error eq} + {pop pop false} + ifelse + } + if not + { + countdictstack array dictstack 0 get + begin + userdict + begin + $SubstituteFont + begin + /$str 128 string def + /$fontpat 128 string def + /$slen 0 def + /$sname null def + /$match false def + /$fontname null def + /$substituteFound false def + /$inVMIndex null def + /$doSmartSub true def + /$depth 0 def + /$fontname null def + /$italicangle 26.5 def + /$dstack null def + /$Strategies 10 dict dup + begin + /$Type3Underprint + { + currentglobal exch false setglobal + 11 dict + begin + /UseFont exch + $WMode 0 ne + { + dup length dict copy + dup/WMode $WMode put + /UseFont exch definefont + } + if def + /FontName $fontname dup type/stringtype eq{cvn}if def + /FontType 3 def + /FontMatrix[.001 0 0 .001 0 0]def + /Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def + /FontBBox[0 0 0 0]def + /CCInfo 7 dict dup + begin + /cc null def + /x 0 def + /y 0 def + end def + /BuildChar + { + exch + begin + CCInfo + begin + 1 string dup 0 3 index put exch pop + /cc exch def + UseFont 1000 scalefont setfont + cc stringwidth/y exch def/x exch def + x y setcharwidth + $SubstituteFont/$Strategy get/$Underprint get exec + 0 0 moveto cc show + x y moveto + end + end + }bind def + currentdict + end + exch setglobal + }bind def + /$GetaTint + 2 dict dup + begin + /$BuildFont + { + dup/WMode known + {dup/WMode get} + {0} + ifelse + /$WMode exch def + $fontname exch + dup/FontName known + { + dup/FontName get + dup type/stringtype eq{cvn}if + } + {/unnamedfont} + ifelse + exch + Adobe_CoolType_Data/InVMDeepCopiedFonts get + 1 index/FontName get known + { + pop + Adobe_CoolType_Data/InVMDeepCopiedFonts get + 1 index get + null copyfont + } + {$deepcopyfont} + ifelse + exch 1 index exch/FontBasedOn exch put + dup/FontName $fontname dup type/stringtype eq{cvn}if put + definefont + Adobe_CoolType_Data/InVMDeepCopiedFonts get + begin + dup/FontBasedOn get 1 index def + end + }bind def + /$Underprint + { + gsave + x abs y abs gt + {/y 1000 def} + {/x -1000 def 500 120 translate} + ifelse + Level2? + { + [/Separation(All)/DeviceCMYK{0 0 0 1 pop}] + setcolorspace + } + {0 setgray} + ifelse + 10 setlinewidth + x .8 mul + [7 3] + { + y mul 8 div 120 sub x 10 div exch moveto + 0 y 4 div neg rlineto + dup 0 rlineto + 0 y 4 div rlineto + closepath + gsave + Level2? + {.2 setcolor} + {.8 setgray} + ifelse + fill grestore + stroke + } + forall + pop + grestore + }bind def + end def + /$Oblique + 1 dict dup + begin + /$BuildFont + { + currentglobal exch dup gcheck setglobal + null copyfont + begin + /FontBasedOn + currentdict/FontName known + { + FontName + dup type/stringtype eq{cvn}if + } + {/unnamedfont} + ifelse + def + /FontName $fontname dup type/stringtype eq{cvn}if def + /currentdistillerparams where + {pop} + { + /FontInfo currentdict/FontInfo known + {FontInfo null copyfont} + {2 dict} + ifelse + dup + begin + /ItalicAngle $italicangle def + /FontMatrix FontMatrix + [1 0 ItalicAngle dup sin exch cos div 1 0 0] + matrix concatmatrix readonly + end + 4 2 roll def + def + } + ifelse + FontName currentdict + end + definefont + exch setglobal + }bind def + end def + /$None + 1 dict dup + begin + /$BuildFont{}bind def + end def + end def + /$Oblique SetSubstituteStrategy + /$findfontByEnum + { + dup type/stringtype eq{cvn}if + dup/$fontname exch def + $sname null eq + {$str cvs dup length $slen sub $slen getinterval} + {pop $sname} + ifelse + $fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval + /$match false def + $SubstituteFont/$dstack countdictstack array dictstack put + mark + { + $fontpat 0 $slen 7 add getinterval + {/$match exch def exit} + $str filenameforall + } + stopped + { + cleardictstack + currentdict + true + $SubstituteFont/$dstack get + { + exch + { + 1 index eq + {pop false} + {true} + ifelse + } + {begin false} + ifelse + } + forall + pop + } + if + cleartomark + /$slen 0 def + $match false ne + {$match(fonts/)anchorsearch pop pop cvn} + {/Courier} + ifelse + }bind def + /$ROS 1 dict dup + begin + /Adobe 4 dict dup + begin + /Japan1 [/Ryumin-Light/HeiseiMin-W3 + /GothicBBB-Medium/HeiseiKakuGo-W5 + /HeiseiMaruGo-W4/Jun101-Light]def + /Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def + /GB1 [/STSong-Light/STHeiti-Regular]def + /CNS1 [/MKai-Medium/MHei-Medium]def + end def + end def + /$cmapname null def + /$deepcopyfont + { + dup/FontType get 0 eq + { + 1 dict dup/FontName/copied put copyfont + begin + /FDepVector FDepVector copyarray + 0 1 2 index length 1 sub + { + 2 copy get $deepcopyfont + dup/FontName/copied put + /copied exch definefont + 3 copy put pop pop + } + for + def + currentdict + end + } + {$Strategies/$Type3Underprint get exec} + ifelse + }bind def + /$buildfontname + { + dup/CIDFont findresource/CIDSystemInfo get + begin + Registry length Ordering length Supplement 8 string cvs + 3 copy length 2 add add add string + dup 5 1 roll dup 0 Registry putinterval + dup 4 index(-)putinterval + dup 4 index 1 add Ordering putinterval + 4 2 roll add 1 add 2 copy(-)putinterval + end + 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch + anchorsearch + {pop pop 3 2 roll putinterval cvn/$cmapname exch def} + {pop pop pop pop pop} + ifelse + length + $str 1 index(-)putinterval 1 add + $str 1 index $cmapname $fontpat cvs putinterval + $cmapname length add + $str exch 0 exch getinterval cvn + }bind def + /$findfontByROS + { + /$fontname exch def + $ROS Registry 2 copy known + { + get Ordering 2 copy known + {get} + {pop pop[]} + ifelse + } + {pop pop[]} + ifelse + false exch + { + dup/CIDFont resourcestatus + { + pop pop + save + 1 index/CIDFont findresource + dup/WidthsOnly known + {dup/WidthsOnly get} + {false} + ifelse + exch pop + exch restore + {pop} + {exch pop true exit} + ifelse + } + {pop} + ifelse + } + forall + {$str cvs $buildfontname} + { + false(*) + { + save exch + dup/CIDFont findresource + dup/WidthsOnly known + {dup/WidthsOnly get not} + {true} + ifelse + exch/CIDSystemInfo get + dup/Registry get Registry eq + exch/Ordering get Ordering eq and and + {exch restore exch pop true exit} + {pop restore} + ifelse + } + $str/CIDFont resourceforall + {$buildfontname} + {$fontname $findfontByEnum} + ifelse + } + ifelse + }bind def + end + end + currentdict/$error known currentdict/languagelevel known and dup + {pop $error/SubstituteFont known} + if + dup + {$error} + {Adobe_CoolType_Core} + ifelse + begin + { + /SubstituteFont + /CMap/Category resourcestatus + { + pop pop + { + $SubstituteFont + begin + /$substituteFound true def + dup length $slen gt + $sname null ne or + $slen 0 gt and + { + $sname null eq + {dup $str cvs dup length $slen sub $slen getinterval cvn} + {$sname} + ifelse + Adobe_CoolType_Data/InVMFontsByCMap get + 1 index 2 copy known + { + get + false exch + { + pop + currentglobal + { + GlobalFontDirectory 1 index known + {exch pop true exit} + {pop} + ifelse + } + { + FontDirectory 1 index known + {exch pop true exit} + { + GlobalFontDirectory 1 index known + {exch pop true exit} + {pop} + ifelse + } + ifelse + } + ifelse + } + forall + } + {pop pop false} + ifelse + { + exch pop exch pop + } + { + dup/CMap resourcestatus + { + pop pop + dup/$cmapname exch def + /CMap findresource/CIDSystemInfo get{def}forall + $findfontByROS + } + { + 128 string cvs + dup(-)search + { + 3 1 roll search + { + 3 1 roll pop + {dup cvi} + stopped + {pop pop pop pop pop $findfontByEnum} + { + 4 2 roll pop pop + exch length + exch + 2 index length + 2 index + sub + exch 1 sub -1 0 + { + $str cvs dup length + 4 index + 0 + 4 index + 4 3 roll add + getinterval + exch 1 index exch 3 index exch + putinterval + dup/CMap resourcestatus + { + pop pop + 4 1 roll pop pop pop + dup/$cmapname exch def + /CMap findresource/CIDSystemInfo get{def}forall + $findfontByROS + true exit + } + {pop} + ifelse + } + for + dup type/booleantype eq + {pop} + {pop pop pop $findfontByEnum} + ifelse + } + ifelse + } + {pop pop pop $findfontByEnum} + ifelse + } + {pop pop $findfontByEnum} + ifelse + } + ifelse + } + ifelse + } + {//SubstituteFont exec} + ifelse + /$slen 0 def + end + } + } + { + { + $SubstituteFont + begin + /$substituteFound true def + dup length $slen gt + $sname null ne or + $slen 0 gt and + {$findfontByEnum} + {//SubstituteFont exec} + ifelse + end + } + } + ifelse + bind readonly def + Adobe_CoolType_Core/scfindfont/systemfindfont load put + } + { + /scfindfont + { + $SubstituteFont + begin + dup systemfindfont + dup/FontName known + {dup/FontName get dup 3 index ne} + {/noname true} + ifelse + dup + { + /$origfontnamefound 2 index def + /$origfontname 4 index def/$substituteFound true def + } + if + exch pop + { + $slen 0 gt + $sname null ne + 3 index length $slen gt or and + { + pop dup $findfontByEnum findfont + dup maxlength 1 add dict + begin + {1 index/FID eq{pop pop}{def}ifelse} + forall + currentdict + end + definefont + dup/FontName known{dup/FontName get}{null}ifelse + $origfontnamefound ne + { + $origfontname $str cvs print + ( substitution revised, using )print + dup/FontName known + {dup/FontName get}{(unspecified font)} + ifelse + $str cvs print(.\n)print + } + if + } + {exch pop} + ifelse + } + {exch pop} + ifelse + end + }bind def + } + ifelse + end + end + Adobe_CoolType_Core_Defined not + { + Adobe_CoolType_Core/findfont + { + $SubstituteFont + begin + $depth 0 eq + { + /$fontname 1 index dup type/stringtype ne{$str cvs}if def + /$substituteFound false def + } + if + /$depth $depth 1 add def + end + scfindfont + $SubstituteFont + begin + /$depth $depth 1 sub def + $substituteFound $depth 0 eq and + { + $inVMIndex null ne + {dup $inVMIndex $AddInVMFont} + if + $doSmartSub + { + currentdict/$Strategy known + {$Strategy/$BuildFont get exec} + if + } + if + } + if + end + }bind put + } + if + } + if + end +/$AddInVMFont + { + exch/FontName 2 copy known + { + get + 1 dict dup begin exch 1 index gcheck def end exch + Adobe_CoolType_Data/InVMFontsByCMap get exch + $DictAdd + } + {pop pop pop} + ifelse + }bind def +/$DictAdd + { + 2 copy known not + {2 copy 4 index length dict put} + if + Level2? not + { + 2 copy get dup maxlength exch length 4 index length add lt + 2 copy get dup length 4 index length add exch maxlength 1 index lt + { + 2 mul dict + begin + 2 copy get{forall}def + 2 copy currentdict put + end + } + {pop} + ifelse + } + if + get + begin + {def} + forall + end + }bind def +end +end +%%EndResource +currentglobal true setglobal +%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 +%%Copyright: Copyright 1987-2006 Adobe Systems Incorporated. +%%Version: 1.23 0 +systemdict/languagelevel known dup + {currentglobal false setglobal} + {false} +ifelse +exch +userdict/Adobe_CoolType_Utility 2 copy known + {2 copy get dup maxlength 27 add dict copy} + {27 dict} +ifelse put +Adobe_CoolType_Utility + begin + /@eexecStartData + def + /@recognizeCIDFont null def + /ct_Level2? exch def + /ct_Clone? 1183615869 internaldict dup + /CCRun known not + exch/eCCRun known not + ct_Level2? and or def +ct_Level2? + {globaldict begin currentglobal true setglobal} +if + /ct_AddStdCIDMap + ct_Level2? + {{ + mark + Adobe_CoolType_Utility/@recognizeCIDFont currentdict put + { + ((Hex)57 StartData + 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 + 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 + d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 + cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec + } + stopped + { + cleartomark + Adobe_CoolType_Utility/@recognizeCIDFont get + countdictstack dup array dictstack + exch 1 sub -1 0 + { + 2 copy get 3 index eq + {1 index length exch sub 1 sub{end}repeat exit} + {pop} + ifelse + } + for + pop pop + Adobe_CoolType_Utility/@eexecStartData get eexec + } + {cleartomark} + ifelse + }} + {{ + Adobe_CoolType_Utility/@eexecStartData get eexec + }} + ifelse bind def +userdict/cid_extensions known +dup{cid_extensions/cid_UpdateDB known and}if + { + cid_extensions + begin + /cid_GetCIDSystemInfo + { + 1 index type/stringtype eq + {exch cvn exch} + if + cid_extensions + begin + dup load 2 index known + { + 2 copy + cid_GetStatusInfo + dup null ne + { + 1 index load + 3 index get + dup null eq + {pop pop cid_UpdateDB} + { + exch + 1 index/Created get eq + {exch pop exch pop} + {pop cid_UpdateDB} + ifelse + } + ifelse + } + {pop cid_UpdateDB} + ifelse + } + {cid_UpdateDB} + ifelse + end + }bind def + end + } +if +ct_Level2? + {end setglobal} +if + /ct_UseNativeCapability? systemdict/composefont known def + /ct_MakeOCF 35 dict def + /ct_Vars 25 dict def + /ct_GlyphDirProcs 6 dict def + /ct_BuildCharDict 15 dict dup + begin + /charcode 2 string def + /dst_string 1500 string def + /nullstring()def + /usewidths? true def + end def + ct_Level2?{setglobal}{pop}ifelse + ct_GlyphDirProcs + begin + /GetGlyphDirectory + { + systemdict/languagelevel known + {pop/CIDFont findresource/GlyphDirectory get} + { + 1 index/CIDFont findresource/GlyphDirectory + get dup type/dicttype eq + { + dup dup maxlength exch length sub 2 index lt + { + dup length 2 index add dict copy 2 index + /CIDFont findresource/GlyphDirectory 2 index put + } + if + } + if + exch pop exch pop + } + ifelse + + + }def + /+ + { + systemdict/languagelevel known + { + currentglobal false setglobal + 3 dict begin + /vm exch def + } + {1 dict begin} + ifelse + /$ exch def + systemdict/languagelevel known + { + vm setglobal + /gvm currentglobal def + $ gcheck setglobal + } + if + ?{$ begin}if + }def + /?{$ type/dicttype eq}def + /|{ + userdict/Adobe_CoolType_Data known + { + Adobe_CoolType_Data/AddWidths? known + { + currentdict Adobe_CoolType_Data + begin + begin + AddWidths? + { + Adobe_CoolType_Data/CC 3 index put + ?{def}{$ 3 1 roll put}ifelse + CC charcode exch 1 index 0 2 index 256 idiv put + 1 index exch 1 exch 256 mod put + stringwidth 2 array astore + currentfont/Widths get exch CC exch put + } + {?{def}{$ 3 1 roll put}ifelse} + ifelse + end + end + } + {?{def}{$ 3 1 roll put}ifelse} ifelse + } + {?{def}{$ 3 1 roll put}ifelse} + ifelse + }def + /! + { + ?{end}if + systemdict/languagelevel known + {gvm setglobal} + if + end + }def + /:{string currentfile exch readstring pop}executeonly def + end + ct_MakeOCF + begin + /ct_cHexEncoding + [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 + /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 + /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 + /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B + /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E + /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 + /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 + /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 + /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA + /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD + /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 + /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 + /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 + /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def + /ct_CID_STR_SIZE 8000 def + /ct_mkocfStr100 100 string def + /ct_defaultFontMtx[.001 0 0 .001 0 0]def + /ct_1000Mtx[1000 0 0 1000 0 0]def + /ct_raise{exch cvx exch errordict exch get exec stop}bind def + /ct_reraise + {cvx $error/errorname get(Error: )print dup( )cvs print + errordict exch get exec stop + }bind def + /ct_cvnsi + { + 1 index add 1 sub 1 exch 0 4 1 roll + { + 2 index exch get + exch 8 bitshift + add + } + for + exch pop + }bind def + /ct_GetInterval + { + Adobe_CoolType_Utility/ct_BuildCharDict get + begin + /dst_index 0 def + dup dst_string length gt + {dup string/dst_string exch def} + if + 1 index ct_CID_STR_SIZE idiv + /arrayIndex exch def + 2 index arrayIndex get + 2 index + arrayIndex ct_CID_STR_SIZE mul + sub + { + dup 3 index add 2 index length le + { + 2 index getinterval + dst_string dst_index 2 index putinterval + length dst_index add/dst_index exch def + exit + } + { + 1 index length 1 index sub + dup 4 1 roll + getinterval + dst_string dst_index 2 index putinterval + pop dup dst_index add/dst_index exch def + sub + /arrayIndex arrayIndex 1 add def + 2 index dup length arrayIndex gt + {arrayIndex get} + { + pop + exit + } + ifelse + 0 + } + ifelse + } + loop + pop pop pop + dst_string 0 dst_index getinterval + end + }bind def + ct_Level2? + { + /ct_resourcestatus + currentglobal mark true setglobal + {/unknowninstancename/Category resourcestatus} + stopped + {cleartomark setglobal true} + {cleartomark currentglobal not exch setglobal} + ifelse + { + { + mark 3 1 roll/Category findresource + begin + ct_Vars/vm currentglobal put + ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec + {cleartomark false} + {{3 2 roll pop true}{cleartomark false}ifelse} + ifelse + ct_Vars/vm get setglobal + end + } + } + {{resourcestatus}} + ifelse bind def + /CIDFont/Category ct_resourcestatus + {pop pop} + { + currentglobal true setglobal + /Generic/Category findresource + dup length dict copy + dup/InstanceType/dicttype put + /CIDFont exch/Category defineresource pop + setglobal + } + ifelse + ct_UseNativeCapability? + { + /CIDInit/ProcSet findresource begin + 12 dict begin + begincmap + /CIDSystemInfo 3 dict dup begin + /Registry(Adobe)def + /Ordering(Identity)def + /Supplement 0 def + end def + /CMapName/Identity-H def + /CMapVersion 1.000 def + /CMapType 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000>0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } + if + } + { + /ct_Category 2 dict begin + /CIDFont 10 dict def + /ProcSet 2 dict def + currentdict + end + def + /defineresource + { + ct_Category 1 index 2 copy known + { + get + dup dup maxlength exch length eq + { + dup length 10 add dict copy + ct_Category 2 index 2 index put + } + if + 3 index 3 index put + pop exch pop + } + {pop pop/defineresource/undefined ct_raise} + ifelse + }bind def + /findresource + { + ct_Category 1 index 2 copy known + { + get + 2 index 2 copy known + {get 3 1 roll pop pop} + {pop pop/findresource/undefinedresource ct_raise} + ifelse + } + {pop pop/findresource/undefined ct_raise} + ifelse + }bind def + /resourcestatus + { + ct_Category 1 index 2 copy known + { + get + 2 index known + exch pop exch pop + { + 0 -1 true + } + { + false + } + ifelse + } + {pop pop/findresource/undefined ct_raise} + ifelse + }bind def + /ct_resourcestatus/resourcestatus load def + } + ifelse + /ct_CIDInit 2 dict + begin + /ct_cidfont_stream_init + { + { + dup(Binary)eq + { + pop + null + currentfile + ct_Level2? + { + {cid_BYTE_COUNT()/SubFileDecode filter} + stopped + {pop pop pop} + if + } + if + /readstring load + exit + } + if + dup(Hex)eq + { + pop + currentfile + ct_Level2? + { + {null exch/ASCIIHexDecode filter/readstring} + stopped + {pop exch pop(>)exch/readhexstring} + if + } + {(>)exch/readhexstring} + ifelse + load + exit + } + if + /StartData/typecheck ct_raise + } + loop + cid_BYTE_COUNT ct_CID_STR_SIZE le + { + 2 copy cid_BYTE_COUNT string exch exec + pop + 1 array dup + 3 -1 roll + 0 exch put + } + { + cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi + dup array exch 2 sub 0 exch 1 exch + { + 2 copy + 5 index + ct_CID_STR_SIZE + string + 6 index exec + pop + put + pop + } + for + 2 index + cid_BYTE_COUNT ct_CID_STR_SIZE mod string + 3 index exec + pop + 1 index exch + 1 index length 1 sub + exch put + } + ifelse + cid_CIDFONT exch/GlyphData exch put + 2 index null eq + { + pop pop pop + } + { + pop/readstring load + 1 string exch + { + 3 copy exec + pop + dup length 0 eq + { + pop pop pop pop pop + true exit + } + if + 4 index + eq + { + pop pop pop pop + false exit + } + if + } + loop + pop + } + ifelse + }bind def + /StartData + { + mark + { + currentdict + dup/FDArray get 0 get/FontMatrix get + 0 get 0.001 eq + { + dup/CDevProc known not + { + /CDevProc 1183615869 internaldict/stdCDevProc 2 copy known + {get} + { + pop pop + {pop pop pop pop pop 0 -1000 7 index 2 div 880} + } + ifelse + def + } + if + } + { + /CDevProc + { + pop pop pop pop pop + 0 + 1 cid_temp/cid_CIDFONT get + /FDArray get 0 get + /FontMatrix get 0 get div + 7 index 2 div + 1 index 0.88 mul + }def + } + ifelse + /cid_temp 15 dict def + cid_temp + begin + /cid_CIDFONT exch def + 3 copy pop + dup/cid_BYTE_COUNT exch def 0 gt + { + ct_cidfont_stream_init + FDArray + { + /Private get + dup/SubrMapOffset known + { + begin + /Subrs SubrCount array def + Subrs + SubrMapOffset + SubrCount + SDBytes + ct_Level2? + { + currentdict dup/SubrMapOffset undef + dup/SubrCount undef + /SDBytes undef + } + if + end + /cid_SD_BYTES exch def + /cid_SUBR_COUNT exch def + /cid_SUBR_MAP_OFFSET exch def + /cid_SUBRS exch def + cid_SUBR_COUNT 0 gt + { + GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval + 0 cid_SD_BYTES ct_cvnsi + 0 1 cid_SUBR_COUNT 1 sub + { + exch 1 index + 1 add + cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add + GlyphData exch cid_SD_BYTES ct_GetInterval + 0 cid_SD_BYTES ct_cvnsi + cid_SUBRS 4 2 roll + GlyphData exch + 4 index + 1 index + sub + ct_GetInterval + dup length string copy put + } + for + pop + } + if + } + {pop} + ifelse + } + forall + } + if + cleartomark pop pop + end + CIDFontName currentdict/CIDFont defineresource pop + end end + } + stopped + {cleartomark/StartData ct_reraise} + if + }bind def + currentdict + end def + /ct_saveCIDInit + { + /CIDInit/ProcSet ct_resourcestatus + {true} + {/CIDInitC/ProcSet ct_resourcestatus} + ifelse + { + pop pop + /CIDInit/ProcSet findresource + ct_UseNativeCapability? + {pop null} + {/CIDInit ct_CIDInit/ProcSet defineresource pop} + ifelse + } + {/CIDInit ct_CIDInit/ProcSet defineresource pop null} + ifelse + ct_Vars exch/ct_oldCIDInit exch put + }bind def + /ct_restoreCIDInit + { + ct_Vars/ct_oldCIDInit get dup null ne + {/CIDInit exch/ProcSet defineresource pop} + {pop} + ifelse + }bind def + /ct_BuildCharSetUp + { + 1 index + begin + CIDFont + begin + Adobe_CoolType_Utility/ct_BuildCharDict get + begin + /ct_dfCharCode exch def + /ct_dfDict exch def + CIDFirstByte ct_dfCharCode add + dup CIDCount ge + {pop 0} + if + /cid exch def + { + GlyphDirectory cid 2 copy known + {get} + {pop pop nullstring} + ifelse + dup length FDBytes sub 0 gt + { + dup + FDBytes 0 ne + {0 FDBytes ct_cvnsi} + {pop 0} + ifelse + /fdIndex exch def + dup length FDBytes sub FDBytes exch getinterval + /charstring exch def + exit + } + { + pop + cid 0 eq + {/charstring nullstring def exit} + if + /cid 0 def + } + ifelse + } + loop + }def + /ct_SetCacheDevice + { + 0 0 moveto + dup stringwidth + 3 -1 roll + true charpath + pathbbox + 0 -1000 + 7 index 2 div 880 + setcachedevice2 + 0 0 moveto + }def + /ct_CloneSetCacheProc + { + 1 eq + { + stringwidth + pop -2 div -880 + 0 -1000 setcharwidth + moveto + } + { + usewidths? + { + currentfont/Widths get cid + 2 copy known + {get exch pop aload pop} + {pop pop stringwidth} + ifelse + } + {stringwidth} + ifelse + setcharwidth + 0 0 moveto + } + ifelse + }def + /ct_Type3ShowCharString + { + ct_FDDict fdIndex 2 copy known + {get} + { + currentglobal 3 1 roll + 1 index gcheck setglobal + ct_Type1FontTemplate dup maxlength dict copy + begin + FDArray fdIndex get + dup/FontMatrix 2 copy known + {get} + {pop pop ct_defaultFontMtx} + ifelse + /FontMatrix exch dup length array copy def + /Private get + /Private exch def + /Widths rootfont/Widths get def + /CharStrings 1 dict dup/.notdef + dup length string copy put def + currentdict + end + /ct_Type1Font exch definefont + dup 5 1 roll put + setglobal + } + ifelse + dup/CharStrings get 1 index/Encoding get + ct_dfCharCode get charstring put + rootfont/WMode 2 copy known + {get} + {pop pop 0} + ifelse + exch + 1000 scalefont setfont + ct_str1 0 ct_dfCharCode put + ct_str1 exch ct_dfSetCacheProc + ct_SyntheticBold + { + currentpoint + ct_str1 show + newpath + moveto + ct_str1 true charpath + ct_StrokeWidth setlinewidth + stroke + } + {ct_str1 show} + ifelse + }def + /ct_Type4ShowCharString + { + ct_dfDict ct_dfCharCode charstring + FDArray fdIndex get + dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not + {ct_1000Mtx matrix concatmatrix concat} + {pop} + ifelse + /Private get + Adobe_CoolType_Utility/ct_Level2? get not + { + ct_dfDict/Private + 3 -1 roll + {put} + 1183615869 internaldict/superexec get exec + } + if + 1183615869 internaldict + Adobe_CoolType_Utility/ct_Level2? get + {1 index} + {3 index/Private get mark 6 1 roll} + ifelse + dup/RunInt known + {/RunInt get} + {pop/CCRun} + ifelse + get exec + Adobe_CoolType_Utility/ct_Level2? get not + {cleartomark} + if + }bind def + /ct_BuildCharIncremental + { + { + Adobe_CoolType_Utility/ct_MakeOCF get begin + ct_BuildCharSetUp + ct_ShowCharString + } + stopped + {stop} + if + end + end + end + end + }bind def + /BaseFontNameStr(BF00)def + /ct_Type1FontTemplate 14 dict + begin + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0]def + /FontBBox [-250 -250 1250 1250]def + /Encoding ct_cHexEncoding def + /PaintType 0 def + currentdict + end def + /BaseFontTemplate 11 dict + begin + /FontMatrix [0.001 0 0 0.001 0 0]def + /FontBBox [-250 -250 1250 1250]def + /Encoding ct_cHexEncoding def + /BuildChar/ct_BuildCharIncremental load def + ct_Clone? + { + /FontType 3 def + /ct_ShowCharString/ct_Type3ShowCharString load def + /ct_dfSetCacheProc/ct_CloneSetCacheProc load def + /ct_SyntheticBold false def + /ct_StrokeWidth 1 def + } + { + /FontType 4 def + /Private 1 dict dup/lenIV 4 put def + /CharStrings 1 dict dup/.notdefput def + /PaintType 0 def + /ct_ShowCharString/ct_Type4ShowCharString load def + } + ifelse + /ct_str1 1 string def + currentdict + end def + /BaseFontDictSize BaseFontTemplate length 5 add def + /ct_matrixeq + { + true 0 1 5 + { + dup 4 index exch get exch 3 index exch get eq and + dup not + {exit} + if + } + for + exch pop exch pop + }bind def + /ct_makeocf + { + 15 dict + begin + exch/WMode exch def + exch/FontName exch def + /FontType 0 def + /FMapType 2 def + dup/FontMatrix known + {dup/FontMatrix get/FontMatrix exch def} + {/FontMatrix matrix def} + ifelse + /bfCount 1 index/CIDCount get 256 idiv 1 add + dup 256 gt{pop 256}if def + /Encoding + 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for + bfCount 1 255{2 copy bfCount put pop}for + def + /FDepVector bfCount dup 256 lt{1 add}if array def + BaseFontTemplate BaseFontDictSize dict copy + begin + /CIDFont exch def + CIDFont/FontBBox known + {CIDFont/FontBBox get/FontBBox exch def} + if + CIDFont/CDevProc known + {CIDFont/CDevProc get/CDevProc exch def} + if + currentdict + end + BaseFontNameStr 3(0)putinterval + 0 1 bfCount dup 256 eq{1 sub}if + { + FDepVector exch + 2 index BaseFontDictSize dict copy + begin + dup/CIDFirstByte exch 256 mul def + FontType 3 eq + {/ct_FDDict 2 dict def} + if + currentdict + end + 1 index 16 + BaseFontNameStr 2 2 getinterval cvrs pop + BaseFontNameStr exch definefont + put + } + for + ct_Clone? + {/Widths 1 index/CIDFont get/GlyphDirectory get length dict def} + if + FontName + currentdict + end + definefont + ct_Clone? + { + gsave + dup 1000 scalefont setfont + ct_BuildCharDict + begin + /usewidths? false def + currentfont/Widths get + begin + exch/CIDFont get/GlyphDirectory get + { + pop + dup charcode exch 1 index 0 2 index 256 idiv put + 1 index exch 1 exch 256 mod put + stringwidth 2 array astore def + } + forall + end + /usewidths? true def + end + grestore + } + {exch pop} + ifelse + }bind def + currentglobal true setglobal + /ct_ComposeFont + { + ct_UseNativeCapability? + { + 2 index/CMap ct_resourcestatus + {pop pop exch pop} + { + /CIDInit/ProcSet findresource + begin + 12 dict + begin + begincmap + /CMapName 3 index def + /CMapVersion 1.000 def + /CMapType 1 def + exch/WMode exch def + /CIDSystemInfo 3 dict dup + begin + /Registry(Adobe)def + /Ordering + CMapName ct_mkocfStr100 cvs + (Adobe-)search + { + pop pop + (-)search + { + dup length string copy + exch pop exch pop + } + {pop(Identity)} + ifelse + } + {pop (Identity)} + ifelse + def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000>0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } + ifelse + composefont + } + { + 3 2 roll pop + 0 get/CIDFont findresource + ct_makeocf + } + ifelse + }bind def + setglobal + /ct_MakeIdentity + { + ct_UseNativeCapability? + { + 1 index/CMap ct_resourcestatus + {pop pop} + { + /CIDInit/ProcSet findresource begin + 12 dict begin + begincmap + /CMapName 2 index def + /CMapVersion 1.000 def + /CMapType 1 def + /CIDSystemInfo 3 dict dup + begin + /Registry(Adobe)def + /Ordering + CMapName ct_mkocfStr100 cvs + (Adobe-)search + { + pop pop + (-)search + {dup length string copy exch pop exch pop} + {pop(Identity)} + ifelse + } + {pop(Identity)} + ifelse + def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000>0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } + ifelse + composefont + } + { + exch pop + 0 get/CIDFont findresource + ct_makeocf + } + ifelse + }bind def + currentdict readonly pop + end + end +%%EndResource +setglobal +%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 +%%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. +%%Version: 1.0 0 +userdict/ct_T42Dict 15 dict put +ct_T42Dict begin +/Is2015? +{ + version + cvi + 2015 + ge +}bind def +/AllocGlyphStorage +{ + Is2015? + { + pop + } + { + {string}forall + }ifelse +}bind def +/Type42DictBegin +{ +25 dict begin + /FontName exch def + /CharStrings 256 dict +begin + /.notdef 0 def + currentdict +end def + /Encoding exch def + /PaintType 0 def + /FontType 42 def + /FontMatrix[1 0 0 1 0 0]def + 4 array astore cvx/FontBBox exch def + /sfnts +}bind def +/Type42DictEnd +{ + currentdict dup/FontName get exch definefont end +ct_T42Dict exch +dup/FontName get exch put +}bind def +/RD{string currentfile exch readstring pop}executeonly def +/PrepFor2015 +{ +Is2015? +{ + /GlyphDirectory + 16 + dict def + sfnts 0 get + dup + 2 index + (glyx) + putinterval + 2 index + (locx) + putinterval + pop + pop +} +{ + pop + pop +}ifelse +}bind def +/AddT42Char +{ +Is2015? +{ + /GlyphDirectory get + begin + def + end + pop + pop +} +{ + /sfnts get + 4 index + get + 3 index + 2 index + putinterval + pop + pop + pop + pop +}ifelse +}bind def +/T0AddT42Mtx2 +{ +/CIDFont findresource/Metrics2 get begin def end +}bind def +end +%%EndResource +currentglobal true setglobal +%%BeginFile: MMFauxFont.prc +%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. +%%All Rights Reserved. +userdict /ct_EuroDict 10 dict put +ct_EuroDict begin +/ct_CopyFont +{ + { 1 index /FID ne {def} {pop pop} ifelse} forall +} def +/ct_GetGlyphOutline +{ + gsave + initmatrix newpath + exch findfont dup + length 1 add dict + begin + ct_CopyFont + /Encoding Encoding dup length array copy + dup + 4 -1 roll + 0 exch put + def + currentdict + end + /ct_EuroFont exch definefont + 1000 scalefont setfont + 0 0 moveto + [ + <00> stringwidth + <00> false charpath + pathbbox + [ + {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall + grestore + counttomark 8 add +} +def +/ct_MakeGlyphProc +{ + ] cvx + /ct_PSBuildGlyph cvx + ] cvx +} def +/ct_PSBuildGlyph +{ + gsave + 8 -1 roll pop + 7 1 roll + 6 -2 roll ct_FontMatrix transform 6 2 roll + 4 -2 roll ct_FontMatrix transform 4 2 roll + ct_FontMatrix transform + currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse + dup 9 1 roll + { + currentdict /StrokeWidth 2 copy known + { + get 2 div + 0 ct_FontMatrix dtransform pop + 5 1 roll + 4 -1 roll 4 index sub + 4 1 roll + 3 -1 roll 4 index sub + 3 1 roll + exch 4 index add exch + 4 index add + 5 -1 roll pop + } + { + pop pop + } + ifelse + } + if + setcachedevice + ct_FontMatrix concat + ct_PSPathOps begin + exec + end + { + currentdict /StrokeWidth 2 copy known + { get } + { pop pop 0 } + ifelse + setlinewidth stroke + } + { + fill + } + ifelse + grestore +} def +/ct_PSPathOps 4 dict dup begin + /m {moveto} def + /l {lineto} def + /c {curveto} def + /cp {closepath} def +end +def +/ct_matrix1000 [1000 0 0 1000 0 0] def +/ct_AddGlyphProc +{ + 2 index findfont dup length 4 add dict + begin + ct_CopyFont + /CharStrings CharStrings dup length 1 add dict copy + begin + 3 1 roll def + currentdict + end + def + /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def + /ct_PSBuildGlyph /ct_PSBuildGlyph load def + /ct_PSPathOps /ct_PSPathOps load def + currentdict + end + definefont pop +} +def +systemdict /languagelevel known +{ + /ct_AddGlyphToPrinterFont { + 2 copy + ct_GetGlyphOutline 3 add -1 roll restore + ct_MakeGlyphProc + ct_AddGlyphProc + } def +} +{ + /ct_AddGlyphToPrinterFont { + pop pop restore + Adobe_CTFauxDict /$$$FONTNAME get + /Euro + Adobe_CTFauxDict /$$$SUBSTITUTEBASE get + ct_EuroDict exch get + ct_AddGlyphProc + } def +} ifelse +/AdobeSansMM +{ +556 0 24 -19 541 703 + { + 541 628 m + 510 669 442 703 354 703 c + 201 703 117 607 101 444 c + 50 444 l + 25 372 l + 97 372 l + 97 301 l + 49 301 l + 24 229 l + 103 229 l + 124 67 209 -19 350 -19 c + 435 -19 501 25 509 32 c + 509 131 l + 492 105 417 60 343 60 c + 267 60 204 127 197 229 c + 406 229 l + 430 301 l + 191 301 l + 191 372 l + 455 372 l + 479 444 l + 194 444 l + 201 531 245 624 348 624 c + 433 624 484 583 509 534 c + cp + 556 0 m + } +ct_PSBuildGlyph +} def +/AdobeSerifMM +{ +500 0 10 -12 484 692 + { + 347 298 m + 171 298 l + 170 310 170 322 170 335 c + 170 362 l + 362 362 l + 374 403 l + 172 403 l + 184 580 244 642 308 642 c + 380 642 434 574 457 457 c + 481 462 l + 474 691 l + 449 691 l + 433 670 429 657 410 657 c + 394 657 360 692 299 692 c + 204 692 94 604 73 403 c + 22 403 l + 10 362 l + 70 362 l + 69 352 69 341 69 330 c + 69 319 69 308 70 298 c + 22 298 l + 10 257 l + 73 257 l + 97 57 216 -12 295 -12 c + 364 -12 427 25 484 123 c + 458 142 l + 425 101 384 37 316 37 c + 256 37 189 84 173 257 c + 335 257 l + cp + 500 0 m + } +ct_PSBuildGlyph +} def +end +%%EndFile +setglobal +Adobe_CoolType_Core begin /$None SetSubstituteStrategy end +%%BeginResource: procset Adobe_AGM_Image 1.0 0 +%%Version: 1.0 0 +%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{ + currentpacking + true setpacking +}if +userdict/Adobe_AGM_Image 71 dict dup begin put +/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def +/nd{ + null def +}bind def +/AGMIMG_&image nd +/AGMIMG_&colorimage nd +/AGMIMG_&imagemask nd +/AGMIMG_mbuf()def +/AGMIMG_ybuf()def +/AGMIMG_kbuf()def +/AGMIMG_c 0 def +/AGMIMG_m 0 def +/AGMIMG_y 0 def +/AGMIMG_k 0 def +/AGMIMG_tmp nd +/AGMIMG_imagestring0 nd +/AGMIMG_imagestring1 nd +/AGMIMG_imagestring2 nd +/AGMIMG_imagestring3 nd +/AGMIMG_imagestring4 nd +/AGMIMG_imagestring5 nd +/AGMIMG_cnt nd +/AGMIMG_fsave nd +/AGMIMG_colorAry nd +/AGMIMG_override nd +/AGMIMG_name nd +/AGMIMG_maskSource nd +/AGMIMG_flushfilters nd +/invert_image_samples nd +/knockout_image_samples nd +/img nd +/sepimg nd +/devnimg nd +/idximg nd +/ds +{ + Adobe_AGM_Core begin + Adobe_AGM_Image begin + /AGMIMG_&image systemdict/image get def + /AGMIMG_&imagemask systemdict/imagemask get def + /colorimage where{ + pop + /AGMIMG_&colorimage/colorimage ldf + }if + end + end +}def +/ps +{ + Adobe_AGM_Image begin + /AGMIMG_ccimage_exists{/customcolorimage where + { + pop + /Adobe_AGM_OnHost_Seps where + { + pop false + }{ + /Adobe_AGM_InRip_Seps where + { + pop false + }{ + true + }ifelse + }ifelse + }{ + false + }ifelse + }bdf + level2{ + /invert_image_samples + { + Adobe_AGM_Image/AGMIMG_tmp Decode length ddf + /Decode[Decode 1 get Decode 0 get]def + }def + /knockout_image_samples + { + Operator/imagemask ne{ + /Decode[1 1]def + }if + }def + }{ + /invert_image_samples + { + {1 exch sub}currenttransfer addprocs settransfer + }def + /knockout_image_samples + { + {pop 1}currenttransfer addprocs settransfer + }def + }ifelse + /img/imageormask ldf + /sepimg/sep_imageormask ldf + /devnimg/devn_imageormask ldf + /idximg/indexed_imageormask ldf + /_ctype 7 def + currentdict{ + dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ + bind + }if + def + }forall +}def +/pt +{ + end +}def +/dt +{ +}def +/AGMIMG_flushfilters +{ + dup type/arraytype ne + {1 array astore}if + dup 0 get currentfile ne + {dup 0 get flushfile}if + { + dup type/filetype eq + { + dup status 1 index currentfile ne and + {closefile} + {pop} + ifelse + }{pop}ifelse + }forall +}def +/AGMIMG_init_common +{ + currentdict/T known{/ImageType/T ldf currentdict/T undef}if + currentdict/W known{/Width/W ldf currentdict/W undef}if + currentdict/H known{/Height/H ldf currentdict/H undef}if + currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if + currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if + currentdict/D known{/Decode/D ldf currentdict/D undef}if + currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if + currentdict/O known{ + /Operator/O load 1 eq{ + /imagemask + }{ + /O load 2 eq{ + /image + }{ + /colorimage + }ifelse + }ifelse + def + currentdict/O undef + }if + currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if + currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if + currentdict/I known{/Interpolate/I ldf currentdict/I undef}if + currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if + /DataSource load xcheck not{ + DataSource type/arraytype eq{ + DataSource 0 get type/filetype eq{ + /_Filters DataSource def + currentdict/MultipleDataSources known not{ + /DataSource DataSource dup length 1 sub get def + }if + }if + }if + currentdict/MultipleDataSources known not{ + /MultipleDataSources DataSource type/arraytype eq{ + DataSource length 1 gt + } + {false}ifelse def + }if + }if + /NComponents Decode length 2 div def + currentdict/SkipImageProc known not{/SkipImageProc{false}def}if +}bdf +/imageormask_sys +{ + begin + AGMIMG_init_common + save mark + level2{ + currentdict + Operator/imagemask eq{ + AGMIMG_&imagemask + }{ + use_mask{ + process_mask AGMIMG_&image + }{ + AGMIMG_&image + }ifelse + }ifelse + }{ + Width Height + Operator/imagemask eq{ + Decode 0 get 1 eq Decode 1 get 0 eq and + ImageMatrix/DataSource load + AGMIMG_&imagemask + }{ + BitsPerComponent ImageMatrix/DataSource load + AGMIMG_&image + }ifelse + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + cleartomark restore + end +}def +/overprint_plate +{ + currentoverprint{ + 0 get dup type/nametype eq{ + dup/DeviceGray eq{ + pop AGMCORE_black_plate not + }{ + /DeviceCMYK eq{ + AGMCORE_is_cmyk_sep not + }if + }ifelse + }{ + false exch + { + AGMOHS_sepink eq or + }forall + not + }ifelse + }{ + pop false + }ifelse +}def +/process_mask +{ + level3{ + dup begin + /ImageType 1 def + end + 4 dict begin + /DataDict exch def + /ImageType 3 def + /InterleaveType 3 def + /MaskDict 9 dict begin + /ImageType 1 def + /Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def + /Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def + /ImageMatrix[Width 0 0 Height neg 0 Height]def + /NComponents 1 def + /BitsPerComponent 1 def + /Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def + /DataSource Adobe_AGM_Core/AGMIMG_maskSource get def + currentdict end def + currentdict end + }if +}def +/use_mask +{ + dup/Mask known {dup/Mask get}{false}ifelse +}def +/imageormask +{ + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + } + { + save mark + level2 AGMCORE_host_sep not and{ + currentdict + Operator/imagemask eq DeviceN_PS2 not and{ + imagemask + }{ + AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{ + [/Separation/Black/DeviceGray{}]setcolorspace + /Decode[Decode 1 get Decode 0 get]def + }if + use_mask{ + process_mask image + }{ + DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and + { + Names convert_to_process not{ + 2 dict begin + /imageDict xdf + /names_index 0 def + gsave + imageDict write_image_file{ + Names{ + dup(None)ne{ + [/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace + Operator imageDict read_image_file + names_index 0 eq{true setoverprint}if + /names_index names_index 1 add def + }{ + pop + }ifelse + }forall + close_image_file + }if + grestore + end + }{ + Operator/imagemask eq{ + imagemask + }{ + image + }ifelse + }ifelse + }{ + Operator/imagemask eq{ + imagemask + }{ + image + }ifelse + }ifelse + }ifelse + }ifelse + }{ + Width Height + Operator/imagemask eq{ + Decode 0 get 1 eq Decode 1 get 0 eq and + ImageMatrix/DataSource load + /Adobe_AGM_OnHost_Seps where{ + pop imagemask + }{ + currentgray 1 ne{ + currentdict imageormask_sys + }{ + currentoverprint not{ + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentdict ignoreimagedata + }ifelse + }ifelse + }ifelse + }{ + BitsPerComponent ImageMatrix + MultipleDataSources{ + 0 1 NComponents 1 sub{ + DataSource exch get + }for + }{ + /DataSource load + }ifelse + Operator/colorimage eq{ + AGMCORE_host_sep{ + MultipleDataSources level2 or NComponents 4 eq and{ + AGMCORE_is_cmyk_sep{ + MultipleDataSources{ + /DataSource DataSource 0 get xcheck + { + [ + DataSource 0 get/exec cvx + DataSource 1 get/exec cvx + DataSource 2 get/exec cvx + DataSource 3 get/exec cvx + /AGMCORE_get_ink_data cvx + ]cvx + }{ + DataSource aload pop AGMCORE_get_ink_data + }ifelse def + }{ + /DataSource + Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul + /DataSource load + filter_cmyk 0()/SubFileDecode filter def + }ifelse + /Decode[Decode 0 get Decode 1 get]def + /MultipleDataSources false def + /NComponents 1 def + /Operator/image def + invert_image_samples + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentoverprint not Operator/imagemask eq and{ + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentdict ignoreimagedata + }ifelse + }ifelse + }{ + MultipleDataSources NComponents AGMIMG_&colorimage + }ifelse + }{ + true NComponents colorimage + }ifelse + }{ + Operator/image eq{ + AGMCORE_host_sep{ + /DoImage true def + currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse + { + AGMCORE_black_plate not Operator/imagemask ne and{ + /DoImage false def + currentdict ignoreimagedata + }if + }if + 1 AGMCORE_&setgray + DoImage + {currentdict imageormask_sys}if + }{ + use_mask{ + process_mask image + }{ + image + }ifelse + }ifelse + }{ + Operator/knockout eq{ + pop pop pop pop pop + currentcolorspace overprint_plate not{ + knockout_unitsq + }if + }if + }ifelse + }ifelse + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end +}def +/sep_imageormask +{ + /sep_colorspace_dict AGMCORE_gget begin + CSA map_csa + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + }{ + save mark + AGMCORE_avoid_L2_sep_space{ + /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def + }if + AGMIMG_ccimage_exists + MappedCSA 0 get/DeviceCMYK eq and + currentdict/Components known and + Name()ne and + Name(All)ne and + Operator/image eq and + AGMCORE_producing_seps not and + level2 not and + { + Width Height BitsPerComponent ImageMatrix + [ + /DataSource load/exec cvx + { + 0 1 2 index length 1 sub{ + 1 index exch + 2 copy get 255 xor put + }for + }/exec cvx + ]cvx bind + MappedCSA 0 get/DeviceCMYK eq{ + Components aload pop + }{ + 0 0 0 Components aload pop 1 exch sub + }ifelse + Name findcmykcustomcolor + customcolorimage + }{ + AGMCORE_producing_seps not{ + level2{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{ + [/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt + /sep_tint AGMCORE_gget setcolor + }if + currentdict imageormask + }{ + currentdict + Operator/imagemask eq{ + imageormask + }{ + sep_imageormask_lev1 + }ifelse + }ifelse + }{ + AGMCORE_host_sep{ + Operator/knockout eq{ + currentdict/ImageMatrix get concat + knockout_unitsq + }{ + currentgray 1 ne{ + AGMCORE_is_cmyk_sep Name(All)ne and{ + level2{ + Name AGMCORE_IsSeparationAProcessColor + { + Operator/imagemask eq{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor + }if + }{ + invert_image_samples + }ifelse + }{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + [/Separation Name[/DeviceGray] + { + sep_colorspace_proc AGMCORE_get_ink_data + 1 exch sub + }bind + ]AGMCORE_&setcolorspace + /sep_tint AGMCORE_gget AGMCORE_&setcolor + }if + }ifelse + currentdict imageormask_sys + }{ + currentdict + Operator/imagemask eq{ + imageormask_sys + }{ + sep_image_lev1_sep + }ifelse + }ifelse + }{ + Operator/imagemask ne{ + invert_image_samples + }if + currentdict imageormask_sys + }ifelse + }{ + currentoverprint not Name(All)eq or Operator/imagemask eq and{ + currentdict imageormask_sys + }{ + currentoverprint not + { + gsave + knockout_unitsq + grestore + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + currentcolorspace 0 get/Separation ne{ + [/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt + /sep_tint AGMCORE_gget setcolor + }if + }if + currentoverprint + MappedCSA 0 get/DeviceCMYK eq and + Name AGMCORE_IsSeparationAProcessColor not and + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse + Name(All)ne and{ + imageormask_l2_overprint + }{ + currentdict imageormask + }ifelse + }ifelse + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end + end +}def +/colorSpaceElemCnt +{ + mark currentcolor counttomark dup 2 add 1 roll cleartomark +}bdf +/devn_sep_datasource +{ + 1 dict begin + /dataSource xdf + [ + 0 1 dataSource length 1 sub{ + dup currentdict/dataSource get/exch cvx/get cvx/exec cvx + /exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx + }for + ]cvx bind + end +}bdf +/devn_alt_datasource +{ + 11 dict begin + /convProc xdf + /origcolorSpaceElemCnt xdf + /origMultipleDataSources xdf + /origBitsPerComponent xdf + /origDecode xdf + /origDataSource xdf + /dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def + /DataSource origMultipleDataSources + { + [ + BitsPerComponent 8 idiv origDecode length 2 idiv mul string + 0 1 origDecode length 2 idiv 1 sub + { + dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch + origDataSource exch get 0()/SubFileDecode filter + BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx + }for + ]bind cvx + }{origDataSource}ifelse 0()/SubFileDecode filter def + [ + origcolorSpaceElemCnt string + 0 2 origDecode length 2 sub + { + dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div + 1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx + }for + /convProc load/exec cvx + origcolorSpaceElemCnt 1 sub -1 0 + { + /dup cvx 2/add cvx/index cvx + 3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx + }for + ]bind cvx 0()/SubFileDecode filter + end +}bdf +/devn_imageormask +{ + /devicen_colorspace_dict AGMCORE_gget begin + CSA map_csa + 2 dict begin + dup + /srcDataStrs[3 -1 roll begin + AGMIMG_init_common + currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse + { + Width Decode length 2 div mul cvi + { + dup 65535 gt{1 add 2 div cvi}{exit}ifelse + }loop + string + }repeat + end]def + /dstDataStr srcDataStrs 0 get length string def + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + }{ + save mark + AGMCORE_producing_seps not{ + level3 not{ + Operator/imagemask ne{ + /DataSource[[ + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def + /MultipleDataSources true def + /Decode colorSpaceElemCnt[exch{0 1}repeat]def + }if + }if + currentdict imageormask + }{ + AGMCORE_host_sep{ + Names convert_to_process{ + CSA get_csa_by_name 0 get/DeviceCMYK eq{ + /DataSource + Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + 4/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource + filter_cmyk 0()/SubFileDecode filter def + /MultipleDataSources false def + /Decode[1 0]def + /DeviceGray setcolorspace + currentdict imageormask_sys + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate{ + /DataSource + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource + /MultipleDataSources false def + /Decode colorSpaceElemCnt[exch{0 1}repeat]def + currentdict imageormask_sys + }{ + gsave + knockout_unitsq + grestore + currentdict consumeimagedata + }ifelse + }ifelse + } + { + /devicen_colorspace_dict AGMCORE_gget/names_index known{ + Operator/imagemask ne{ + MultipleDataSources{ + /DataSource[DataSource devn_sep_datasource/exec cvx]cvx def + /MultipleDataSources false def + }{ + /DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def + }ifelse + invert_image_samples + }if + currentdict imageormask_sys + }{ + currentoverprint not Operator/imagemask eq and{ + currentdict imageormask_sys + }{ + currentoverprint not + { + gsave + knockout_unitsq + grestore + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + currentdict imageormask + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end + end + end +}def +/imageormask_l2_overprint +{ + currentdict + currentcmykcolor add add add 0 eq{ + currentdict consumeimagedata + }{ + level3{ + currentcmykcolor + /AGMIMG_k xdf + /AGMIMG_y xdf + /AGMIMG_m xdf + /AGMIMG_c xdf + Operator/imagemask eq{ + [/DeviceN[ + AGMIMG_c 0 ne{/Cyan}if + AGMIMG_m 0 ne{/Magenta}if + AGMIMG_y 0 ne{/Yellow}if + AGMIMG_k 0 ne{/Black}if + ]/DeviceCMYK{}]setcolorspace + AGMIMG_c 0 ne{AGMIMG_c}if + AGMIMG_m 0 ne{AGMIMG_m}if + AGMIMG_y 0 ne{AGMIMG_y}if + AGMIMG_k 0 ne{AGMIMG_k}if + setcolor + }{ + /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def + [/Indexed + [ + /DeviceN[ + AGMIMG_c 0 ne{/Cyan}if + AGMIMG_m 0 ne{/Magenta}if + AGMIMG_y 0 ne{/Yellow}if + AGMIMG_k 0 ne{/Black}if + ] + /DeviceCMYK{ + AGMIMG_k 0 eq{0}if + AGMIMG_y 0 eq{0 exch}if + AGMIMG_m 0 eq{0 3 1 roll}if + AGMIMG_c 0 eq{0 4 1 roll}if + } + ] + 255 + { + 255 div + mark exch + dup dup dup + AGMIMG_k 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_y 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_m 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_c 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + counttomark 1 add -1 roll pop + } + ]setcolorspace + }ifelse + imageormask_sys + }{ + write_image_file{ + currentcmykcolor + 0 ne{ + [/Separation/Black/DeviceGray{}]setcolorspace + gsave + /Black + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Yellow/DeviceGray{}]setcolorspace + gsave + /Yellow + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Magenta/DeviceGray{}]setcolorspace + gsave + /Magenta + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Cyan/DeviceGray{}]setcolorspace + gsave + /Cyan + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + close_image_file + }{ + imageormask + }ifelse + }ifelse + }ifelse +}def +/indexed_imageormask +{ + begin + AGMIMG_init_common + save mark + currentdict + AGMCORE_host_sep{ + Operator/knockout eq{ + /indexed_colorspace_dict AGMCORE_gget dup/CSA known{ + /CSA get get_csa_by_name + }{ + /Names get + }ifelse + overprint_plate not{ + knockout_unitsq + }if + }{ + Indexed_DeviceN{ + /devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{ + indexed_image_lev2_sep + }{ + currentoverprint not{ + knockout_unitsq + }if + currentdict consumeimagedata + }ifelse + }{ + AGMCORE_is_cmyk_sep{ + Operator/imagemask eq{ + imageormask_sys + }{ + level2{ + indexed_image_lev2_sep + }{ + indexed_image_lev1_sep + }ifelse + }ifelse + }{ + currentoverprint not{ + knockout_unitsq + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + level2{ + Indexed_DeviceN{ + /indexed_colorspace_dict AGMCORE_gget begin + }{ + /indexed_colorspace_dict AGMCORE_gget dup null ne + { + begin + currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse + get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and + AGMCORE_in_rip_sep and{ + [/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup] + setcolorspace + }if + end + } + {pop}ifelse + }ifelse + imageormask + Indexed_DeviceN{ + end + }if + }{ + Operator/imagemask eq{ + imageormask + }{ + indexed_imageormask_lev1 + }ifelse + }ifelse + }ifelse + cleartomark restore + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end +}def +/indexed_image_lev2_sep +{ + /indexed_colorspace_dict AGMCORE_gget begin + begin + Indexed_DeviceN not{ + currentcolorspace + dup 1/DeviceGray put + dup 3 + currentcolorspace 2 get 1 add string + 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub + { + dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put + }for + put setcolorspace + }if + currentdict + Operator/imagemask eq{ + AGMIMG_&imagemask + }{ + use_mask{ + process_mask AGMIMG_&image + }{ + AGMIMG_&image + }ifelse + }ifelse + end end +}def + /OPIimage + { + dup type/dicttype ne{ + 10 dict begin + /DataSource xdf + /ImageMatrix xdf + /BitsPerComponent xdf + /Height xdf + /Width xdf + /ImageType 1 def + /Decode[0 1 def] + currentdict + end + }if + dup begin + /NComponents 1 cdndf + /MultipleDataSources false cdndf + /SkipImageProc{false}cdndf + /Decode[ + 0 + currentcolorspace 0 get/Indexed eq{ + 2 BitsPerComponent exp 1 sub + }{ + 1 + }ifelse + ]cdndf + /Operator/image cdndf + end + /sep_colorspace_dict AGMCORE_gget null eq{ + imageormask + }{ + gsave + dup begin invert_image_samples end + sep_imageormask + grestore + }ifelse + }def +/cachemask_level2 +{ + 3 dict begin + /LZWEncode filter/WriteFilter xdf + /readBuffer 256 string def + /ReadFilter + currentfile + 0(%EndMask)/SubFileDecode filter + /ASCII85Decode filter + /RunLengthDecode filter + def + { + ReadFilter readBuffer readstring exch + WriteFilter exch writestring + not{exit}if + }loop + WriteFilter closefile + end +}def +/spot_alias +{ + /mapto_sep_imageormask + { + dup type/dicttype ne{ + 12 dict begin + /ImageType 1 def + /DataSource xdf + /ImageMatrix xdf + /BitsPerComponent xdf + /Height xdf + /Width xdf + /MultipleDataSources false def + }{ + begin + }ifelse + /Decode[/customcolor_tint AGMCORE_gget 0]def + /Operator/image def + /SkipImageProc{false}def + currentdict + end + sep_imageormask + }bdf + /customcolorimage + { + Adobe_AGM_Image/AGMIMG_colorAry xddf + /customcolor_tint AGMCORE_gget + << + /Name AGMIMG_colorAry 4 get + /CSA[/DeviceCMYK] + /TintMethod/Subtractive + /TintProc null + /MappedCSA null + /NComponents 4 + /Components[AGMIMG_colorAry aload pop pop] + >> + setsepcolorspace + mapto_sep_imageormask + }ndf + Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put + /customcolorimage + { + Adobe_AGM_Image/AGMIMG_override false put + current_spot_alias{dup 4 get map_alias}{false}ifelse + { + false set_spot_alias + /customcolor_tint AGMCORE_gget exch setsepcolorspace + pop + mapto_sep_imageormask + true set_spot_alias + }{ + //Adobe_AGM_Image/AGMIMG_&customcolorimage get exec + }ifelse + }bdf +}def +/snap_to_device +{ + 6 dict begin + matrix currentmatrix + dup 0 get 0 eq 1 index 3 get 0 eq and + 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop + { + 1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def + 0 0 transform + AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch + AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch + itransform/AGMIMG_llY exch def/AGMIMG_llX exch def + 1 1 transform + AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch + AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch + itransform/AGMIMG_urY exch def/AGMIMG_urX exch def + [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat + }{ + }ifelse + end +}def +level2 not{ + /colorbuf + { + 0 1 2 index length 1 sub{ + dup 2 index exch get + 255 exch sub + 2 index + 3 1 roll + put + }for + }def + /tint_image_to_color + { + begin + Width Height BitsPerComponent ImageMatrix + /DataSource load + end + Adobe_AGM_Image begin + /AGMIMG_mbuf 0 string def + /AGMIMG_ybuf 0 string def + /AGMIMG_kbuf 0 string def + { + colorbuf dup length AGMIMG_mbuf length ne + { + dup length dup dup + /AGMIMG_mbuf exch string def + /AGMIMG_ybuf exch string def + /AGMIMG_kbuf exch string def + }if + dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop + } + addprocs + {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage + end + }def + /sep_imageormask_lev1 + { + begin + MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ + { + 255 mul round cvi GrayLookup exch get + }currenttransfer addprocs settransfer + currentdict imageormask + }{ + /sep_colorspace_dict AGMCORE_gget/Components known{ + MappedCSA 0 get/DeviceCMYK eq{ + Components aload pop + }{ + 0 0 0 Components aload pop 1 exch sub + }ifelse + Adobe_AGM_Image/AGMIMG_k xddf + Adobe_AGM_Image/AGMIMG_y xddf + Adobe_AGM_Image/AGMIMG_m xddf + Adobe_AGM_Image/AGMIMG_c xddf + AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ + {AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer + currentdict imageormask + }{ + currentcolortransfer + {AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }ifelse + }{ + MappedCSA 0 get/DeviceGray eq{ + {255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer + currentdict imageormask + }{ + MappedCSA 0 get/DeviceCMYK eq{ + currentcolortransfer + {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }{ + currentcolortransfer + {pop 1}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }ifelse + }ifelse + }ifelse + }ifelse + end + }def + /sep_image_lev1_sep + { + begin + /sep_colorspace_dict AGMCORE_gget/Components known{ + Components aload pop + Adobe_AGM_Image/AGMIMG_k xddf + Adobe_AGM_Image/AGMIMG_y xddf + Adobe_AGM_Image/AGMIMG_m xddf + Adobe_AGM_Image/AGMIMG_c xddf + {AGMIMG_c mul 1 exch sub} + {AGMIMG_m mul 1 exch sub} + {AGMIMG_y mul 1 exch sub} + {AGMIMG_k mul 1 exch sub} + }{ + {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} + }ifelse + AGMCORE_get_ink_data currenttransfer addprocs settransfer + currentdict imageormask_sys + end + }def + /indexed_imageormask_lev1 + { + /indexed_colorspace_dict AGMCORE_gget begin + begin + currentdict + MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ + {HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer + imageormask + }{ + MappedCSA 0 get/DeviceGray eq{ + {HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer + imageormask + }{ + MappedCSA 0 get/DeviceCMYK eq{ + currentcolortransfer + {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + tint_image_to_color + }{ + currentcolortransfer + {pop 1}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi Lookup exch get HiVal div}exch addprocs 4 1 roll + setcolortransfer + tint_image_to_color + }ifelse + }ifelse + }ifelse + end end + }def + /indexed_image_lev1_sep + { + /indexed_colorspace_dict AGMCORE_gget begin + begin + {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} + AGMCORE_get_ink_data currenttransfer addprocs settransfer + currentdict imageormask_sys + end end + }def +}if +end +systemdict/setpacking known +{setpacking}if +%%EndResource +currentdict Adobe_AGM_Utils eq {end} if +%%EndProlog +%%BeginSetup +Adobe_AGM_Utils begin +2 2010 Adobe_AGM_Core/ds gx +Adobe_CoolType_Core/ds get exec +Adobe_AGM_Image/ds gx +[/NamespacePush pdfmark_5 +[/_objdef {Doc_Metadata} /type /stream /OBJ pdfmark_5 +[{Doc_Metadata} 1281 (% &end XMP packet& %) ReadBypdfmark_5_string + + + + + + + test03 + + + + + TeX output 2011.04.08:1517 + + + + + Donald Story (Complimentary Copy) 4662 2009-10-23 13:17:17 + + + + + + + + + + + + + + + + + + + + + + + + +% &end XMP packet& % + +[{Doc_Metadata} 2 dict begin /Type /Metadata def /Subtype /XML def currentdict end /PUT pdfmark_5 +[/Document 1 dict begin /Metadata {Doc_Metadata} def currentdict end /BDC pdfmark_5 +[/NamespacePop pdfmark_5 +currentdict Adobe_AGM_Utils eq {end} if +%%EndSetup +%%Page: 1 1 +%%EndPageComments +%%BeginPageSetup +Adobe_AGM_Utils begin +Adobe_AGM_Core/ps gx +Adobe_AGM_Core/capture_mysetup gx +Adobe_AGM_Utils/capture_cpd gx +Adobe_CoolType_Core/ps get exec +Adobe_AGM_Image/ps gx +%%EndPageSetup +1 -1 scale 0 -190.249 translate +pgsv +[1 0 0 1 0 0 ]ct +gsave +np +gsave +-7.62939e-6 0 mo +-7.62939e-6 190.249 li +272.766 190.249 li +272.766 0 li +cp +clp +false sop +/0 +<< +/Name (Black) +/0 +[/DeviceCMYK] /CSA add_res +/CSA /0 get_csa_by_name +/MappedCSA /0 /CSA get_res +/TintMethod /Subtractive +/TintProc null +/NComponents 4 +/Components [ 0 0 0 1 ] +>> +/CSD add_res +1 /0 /CSD get_res sepcs +1 sep +%ADOBeginSubsetFont: PBAAAA+CMR10 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /PBAAAA+CMR10 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1994 Blue Sky Research and Y&Y, Inc. http://www.YandY.com) def +/Weight (Medium) def +/ItalicAngle 0 def +/BaseFontName (CMR10) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 53 /five put +dup 58 /colon put +dup 65 /A put +dup 67 /C put +dup 77 /M put +dup 78 /N put +dup 80 /P put +dup 84 /T put +dup 97 /a put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 109 /m put +dup 111 /o put +dup 123 /endash put +def +/UniqueID 5000793 def +/FontBBox {-40 -250 1009 969} def +end +systemdict begin +dup /Private +13 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-22 -0 683 705 431 448 666 677] def +/OtherBlues [-206 -194] def +/BlueScale 0.04379 def +/StdHW [31] def +/StdVW [69] def +/StemSnapH [22 31] def +/StemSnapV [69 89] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +21 dict dup begin +/slash <1C60D8A8C9B7A73DB56225352A24C6E389DE2B55CA06CAB1D904D74F +E21B6520E910DE6837DBFFB95567192F781E541A03B8446689265DEAE7140ED2 +3D1C3943714CDFC12315> |- +/zero <1C60D8A8C9B7A73D3B2D32309B1F5D5A32FC3614834F8BC61B6EB92C1 +2484BD76628737DA40CF9DA1C97CCDAFB1D1B732C642F74A7C41B7D3AC6DAF8D +1E760692B6EBD2417EF1893A4AA0B1CF049D4C54D830CEC073A9153D451FAD42 +892B0930AEE4FE18588336BFDAD60D8A4F4CFFED76F103FB9BBD8A33EFBA3F18 +232B88D88FE54E17260FA3E2CC29DEC0CB72B88DC816FF5> |- +/one <1C60D8A8C9B7A73DC579B9CE13A4EA8C203AFC890ABD6F58341B006CF1 +BDD8FED3A7238E01F751FEAC75885229C293891E5636AD630D9C884528B6FEF0 +0728A740ED77D054B4743ECA5E3947520FEF6B23D548765D11> |- +/two <1C60D8A8C9B7A73DC50B0411757B441481CCF7EF812EEB9B3F6A07BD51 +606BCA866C4BD24CA34E86B9CA5A529B664F3EEDB6B4AF8A2B994DB57B49473E +162231CB943675FE63E9B92B8AEBB62FB22456EC4173C66EF6C2F34FFEC22ACA +E77FFFAAD70F3754CADC0D2CF63CB6D286D930AEA5A613E5AB9CB004BEAEBADD +D070EDAF4FF25FDB6421F540D58D2C7A3FC40290CBCF831BE1B89B7F> |- +/three <1C60D8A8C9B7A73D3B2B97DEB4C7BDB68E0D63865C8BF294429AD1BA +AE59A25299F9306A9E28AA5C0C0AF9F97F56096DB0FD0EC440ACCE834B0BA539 +2FD94D026768A961AA5D1A88FAE30F2B2033E77AFAB55B0B9C8092CD226DD9EF +EEAAF5CD5AE79D6DDEC4C37DC43DE3B85DD2A2EC4DC0C9F349D5E8F9F615782E +DC8C53805553FD3C0007C1818BF3D99AB659A079ED36132BBDC613CA63D7A0FE +429706DBC6BA998CE56A89C002758EF37F90A390F83B3DFE49D312FA66FDF2F1 +6212D1503559B35FC2DB8BD5A49535> |- +/five <1C60D8A8C9B7A73D3B2B97F19D54A2E00E7DDA8E72064220CB7581D13 +CEDF071F346430E40993A6297E3A2A6D6093205222D977AC7F7B65CC82B221D9 +B18ADEA5D4AF0261ABF060D3E283C7B3B5EB39FF499721FD51203AE59E3BEA25 +7DFD3E472FEF67221488EC8D1F355E2FAD057CA44A8B4BAD6C6C719C164907CB +F9A6CC770DB0C7E58A37D2385E23F576BCFF94FFBFD8ADD4C5E6C32CD83ACEB7 +7472D00FE1A4DC66393A99AC6BBD252B04C98B710149EA42B66ACE89D4FC4393 +F3A09165DF477ABCB0E8A8DB21E4278CA219EBCC9B067F92619913BDBD1EF3C9 +A> |- +/colon <1C60D8A8C9B08A95708109816759149241680C741B6923EBD56E6248 +E5269499A7D548A5AC3ECB516C4A5048666940A11AD8CB54F4BA847274447EEB +614F54B956BBCFCAD8E88A403FBD4464DA283ACB> |- +/A <1C60D8A8C9B08A9501CDAE1251A61DF6E2312CA41635F6CE1D00B63E171C +70F84D42F62A21A6DD37D84C279E3FAE908D39B730ACD671ED9E277ACFE833A1 +1F48F076C9803DC08258033731BCBCE19DF3B81C1C298B382A15FAC94387A992 +AD9631716A7ED4F711137D6C851AE1C8DCBBFBCF7274E882226E58958CE6283A +197E7FAE3A2D0F6C24FA411BECFB36A10FF2A923EA89ABEFAD5AB23D600F> |- +/C <1C60D8A8C9B08A9454CA4C75C5C983901A105955FD02AB95A1C2D2A205D6 +C9A19566388580DAF81E45849DB37660797B67B5A88B6906602915C5F5C9B0EC +D18BF9F52BC4BC58CA3DC88745B8BAABAD3D92E461BFB415E7240305CDDA1D0D +B5D35FEBC75FFD4C053E78B6CA772ACEB0C2FF98C08B672F492F305E0C5F3841 +918729B4AEB78A65C2A83364408240D8D653DA56F4DCB028D3D78F3C2D6BC7> |- +/M <1C60D8A8C9B08A94284A0D047609A407E661A852E250B140B4157477FB2A +AE2E22210B2D780B692B0718211E5BD86C3DCF8087849BEE2B9F6D1D8621E40C +8FBE892AC1B23002BF18819E26C6741335DF8DA8AC82506D7051C0505D48DDFA +17EE84A06E07C05EBAC6174D600BACE071866247BE6C83F4CF28F6D6EE6A6CF8 +A788C4FFFDBDCA978C2B0B201753D21CB7AF0542C690ECE8E7EDBE1B1FB29939 +734E35E0ECCA8BA7FAEB58AC205A8A82A94C960A65> |- +/N <1C60D8A8C9B08A9501CDAE1251A61DF6E23FBE9059A2A88492E84D61402E +80BD80B5057FF8914FA4679EB3900C60B246DA77BF837041B1C053FCD543E3D1 +D259FCE953A74E40366D604A99F9233772AC97F872D505329B1446640ABD99E4 +AC723C39DD6EA376A043CE3633F04D9BC6DEFE2E1A831DBB9C16F90A966DFA0F +3802BB1EB0AA3DAEB0E864B9D3CC3E14AE1E9219B48660289CF348B4E280> |- +/P <1C60D8A8C9B08A94478101EE5603CAF9EA65868978F157B7D9DB71203FAD +46B85DF1A1E477012038D20B3756C0124AD7E2F6ACCB98150AB793091E3E7A8F +3C0AE6FC8D7A5031BB678671889D46F3A15BD495F1AB5B7C8F63325E15B44523 +174D09593A38714FEB5177883F725186FE6BF7095A24CD9EDEFA3551580A0E2B +0B49AC2002> |- +/T <1C60D8A8C9B08A9454CA4C75C5C97DCE7AB32777FAAECD12647866E7CB3F +CCDC541E37F2225E520DEDE695980D4012AD5B972BDABC7E7E5410E71AC63692 +4E778B3131B6C4D1E76F8C4592AC311A2107F53DC1850538C9E487E6D5DBDFE8 +027D7126BA9ED8B24E7379B57E474ACD298BF6B3700CC970D80111DD98EFC872 +C24D0DA3C75DDDFD177C6D15> |- +/a <1C60D8A8C9B7A73DCB03313BCF7AD8C8EE234E5372D46A65E92A78F4B7E0 +2ECC58F71EE6C027AD4D56C5E4DE1AF1031295DC17C0E7AC8D8358634F9A19B0 +2A110E5539C10136C68E0D2CBEA6658A501D9D73323861F8C29EB92F9080ACC3 +E236C5F14389534682EC2925F59CD4A215569A7BD7B9F7827A30BA75EB840535 +B2A2C8F92AD166CE93D277314A4C690C47DB847F73BFE1049631CDDB9124FD76 +2753AA8DB187C216AFB74F76299B3C51610D74CF31321BBFEB5CFCA7D213C896 +D1B8E57EFC05695F2F73> |- +/e <1C60D8A8C9B08A95B1F07368C45D8D2AF4BC97E4CB216B20786BB8409E5C +B0892E60E7F0AD9AC8433678C58AAD59736BF9700A3AEB0B5352F4A898A5EEFB +C72A64BFB45B917D9879BD0577DAB96A0E86BECAB5E8A8A051E5E40886D5A00C +EC53E0A3265FC74195574846689BF9F38086985C2DD3223390D51155F707CE86 +59EC1C65A75BE9A0BA862DB1A00FF6A01FCED7E6> |- +/f <1C60D8A8C9B08A956BA65798425CE9B0A78F07A04AF2F8524751F181F94C +EF756ACD6AB92BD09462A05FB08A9160A0AB5267B62445F916DEFC1DAF3F1FB4 +B3761F71CBE3290960500C788D04CB45BB0A2825753AA6E46495F35A08389AAA +C80F35ADADFB7ACE340FEC03C9E5F9A50A8AD731E7A553A32F387574697F9CAB +2E100B6DD6E3525398F6> |- +/g <1C60D8A8C9B7A73DB58EA28807584EB19BC6EA1448A12312E623B90358A1 +63CFC67672A34CC74B0AEAADF24229DF1CCAA1488AE3E348FE2ACD572EA487EC +9D77FBB0710AB421B03DD5B8AE5519B5C269E9648E819E7ECE806EEF16A6618D +07D9AAB350E57F26F5259E8FCF9E5C2D96BBEAD16502F9E7819E854042DDB2BC +674C39681CC2E5224219582BC7B59BBAEF869C9DF91CA7770A97BAD53C3C3A99 +175BA8F0A5744B5969D3BC15831A95918F7C707E41F5D87B8DB2D57378BC9C29 +7DAE69E4BF438246E63F565B22D86CBE28DEF748262FB9FF82A88935451D6280 +A28F1AD964E6E476D5779321E42D3A86BE41122F1BED36C3DC47E1E01C225345 +98D0431873197ABE1C8EC03B4011E4B26D249635BDBABB8E5B69BE07AFA65F88 +EAF6> |- +/m <1C60D8A8C9B08A940B724A74A01E176AC76C178E539FDA15CBEFB3251A61 +C8116B9FE351FF1BC83539595D23AE382CF3B7BD76D62DC94F39B27B55D161C2 +888F1D0802E5CF73898C0ACDCA15FB7A28AA1DFAA4097D26E5F1ED6CA3CF5043 +5DDF248924E60D22E0F7E352F621676508849260B5671A3BC8A3B68A0E5A236B +21A2D545F7F03555DF313A266CEFB0FAC4D988447E218579B005BC3818325D6B +E4238BE79A219C693AEEC947AC4494C76A2FABFB89C7C87C3BF2D966FC535B3B +3741AD984B1F14E65DD80CEDA6556E93E5BCA78596D9E4AFF7E9C4C85DEC092B +62781D6D09AD7F124D9201> |- +/o <1C60D8A8C9B7A73DCEB07E09D16841D605E4F67059E6B258F546B80703E4 +CDAF20027B900118209D5372F965F2045D50C02A29110A048C891DEBA3210CDF +C5CDE2309C0CDE0E4855E9F6D8954C4C68826A14AD2E4C6227A036D85D304D6A +96FEAA92DEC3CD1B9F4AD57B5F1EBAB070FE911461A7D5B958F5> |- +/endash <1C60D8A8C9B7A73DB9B60A0DBA4B5FB3A045D6B65F12EE5E3DC48D3 +43D8E> |- +/.notdef <1C60D8A8C9B08A959E2F69652E8B8F> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLO+CMR10 /PBAAAA+CMR10 findfont ct_VMDictPut +/YNDRLO+CMR10*1 +[47{/.notdef}rp /slash /zero /one /two /three /.notdef /five +4{/.notdef}rp /colon 6{/.notdef}rp /A /.notdef /C 9{/.notdef}rp /M +/N /.notdef /P 3{/.notdef}rp /T 12{/.notdef}rp /a 3{/.notdef}rp +/e /f /g 5{/.notdef}rp /m /.notdef /o 11{/.notdef}rp +/endash 132{/.notdef}rp] +YNDRLO+CMR10 nf +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-11.6635 -385.261 mo +(MAC1105/T3{Page2of10{Name:) +[9.13578 7.19498 7.193 4.9813 4.9813 4.9813 4.98129 4.98131 7.19299 92.4629 8.30183 6.50757 +4.98131 4.98129 7.74393 8.30185 4.98129 6.36908 4.98129 8.30182 92.4629 7.47192 4.98132 8.29874 +4.4234 0 ]xsh +.398 lw +0 lc +0 lj +10 ml +[] 0 dsh +false sadj +294.337 -383.866 mo +456.337 -383.866 li +@ +%ADOBeginSubsetFont: PBAAAA+CMR10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLO+CMR10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/parenleft <1C60D8A8C9B08A958B2129D6E9761120E2D623F206A8BB61D8ED +90A20EE239C62172B553BFF416342D6CD99C95C515CA225C40039DBAF08CE4F0 +55B08F39C15D29C99EF3EDD066CCCEF8932365A3BB1620FA5F0BCE8AF21A5BDE +C0FFD55FA45F247FC811007CB408F0DCDD3AE01E3246> |- +/parenright <1C60D8A8C9B08A958B2129D6E9761120E2D623F206A8A207F03 +DEA8F466C0D4F860EDF515D421F89285FC2D8EC76F5E903EDE1B5CFFAEC5DEA9 +22C7FC4A51953A99A5FB1F96793348D816F60492670058F4DEA6D328AB20FBAD +B3C1B57A79D8CCD13A3C6D068BAD5F09F347ED0C895> |- +/period <1C60D8A8C9B08A9570810981675968F2C907C696DFE9BE69433F613 +9DF6C45B8165ACC43B6E0B309859F778ABCF0> |- +/four <1C60D8A8C9B7A73DC579B9C1587087D4749982A674065FCDD01CF53F5 +4AF89DAF22339F0A467CE8D8CC25949B03A9DEFE86592098644AED5891ABD8D0 +71237FB9B66EF7648D767508B0BB1075A0AC676C770BFE6D0E818B53FD7884E4 +D8E6A983234A6E833EF72FF7FE587> |- +/equal <1C60D8A8C9B08A946182837629008D945C50B3BD77B79680F3B07BDA +6301D2521ADF665EADEA779B8650AC6CDB556621631497A3BE00C67036F6EB06 +05A36A2C0EE306396247E4A79F8EFAE500D78B59605F041F11> |- +/F <1C60D8A8C9B08A95E211B68BD74B7CA2EA30EA4FC2444F1F126966AA7729 +7BA7EB9B6F06068DCAA13C02B3588F5A46379A5072E7E2DBF343C097B55CA4D5 +88C6753F362DD28478A1BC56804A66D1A6D1CB247FEE04B2647D343D14D14B66 +B993C73F534C4128A2626BB2404D5D4FD30D29B727A906D4DCB574AC37C31D5E +5DAFB5704A4D0DA0711E1E> |- +/H <1C60D8A8C9B08A9501CDAE1251A61DF6E231BC81B88E41105B4578E26F75 +33C91E98D9D9F0DC8C827F9E5FB445026E71B317BF6D603A04AAC81296A14D60 +4B877F27C9DD27B4DC2545831BD665E24D0613C48BC1EA147AE4885D7E3A573C +86CB3AF0A8F296DC75447A42C47A8893EE38CD8E8C5A652E130762E1FBF4BEBD +8D51BBDA5B97EC2473674DF8CAEF85D376E5C08D4D01F4F9C1FAD429BC789992 +9508B400F3B77D9DBC47B5D1AD91F72F12D2C72AEEEF7A9A888271CBABE24E> |- +/S <1C60D8A8C9B08A95C5897169EED99899F86A6DCF3CD291B001131D3BCB45 +BF71748507542417352D5B30F63C60EB90DCF55005F88E95175B21D3219CD9E9 +2E89E417B177D285600845553F66626D2225552D23A7697637BDCEEECAEA18AB +42A896E96FF5B3536CC368A5F7504B6C75D962A4B5F9534F79AC78DC99848461 +42257A40DE257430C92806EBA73FF7D93DF0A6C207299E2D17F4071F9096D016 +163F4D3EC1889ADA266D3682F2D99904573A5022A10E61069737F2D55F919F95 +A33DB6DD2667321E4727855B58DBF4B1E5A294928E6CEABFBD34F296C1B758> |- +/c <1C60D8A8C9B08A95B1F07368C45D8D2AF4BC563DEDE799FE18B66F38FD9D +86FB331DD3DB6A5ADDE092231D11965313897214CFA9548A44D6E8F1A5823DDB +10C1E43AD77B684F0880415DCDCBB7468071C506E9CCDDF7025FEBCA45C23CBE +0A175026D7E2CD65B070B0D65E2A89308219FAF9747E02015EE5DEFBD16624AC +037BD0C160D02AA648C898853C8C0F> |- +/d <1C60D8A8C9B08A95C5897169EED96D33CB6A9013DDE3D04C2845E595598F +3E2E6D79295DF7CC9B6C00D2CF2AC2502697856E5474C945441376692CB09ED9 +25CE9D4F710C7DE089B5E658450CEECC611DD1F25787624443E710373775DB0D +7A6478B3FD4F82DF4FC109429D4EADCED1BD77A35BF25A1C1E584B0EB23CE621 +6847A21EE88B35D72221C7F9F0705E61C9F9C0A224456A04D3E81DE0BD98422F +FA8C7335713899937F5FFEC7771BB8FDAEE53DE3E6> |- +/h <1C60D8A8C9B08A95C5897169EED9664BED359D179BDDBB0B44F78A354068 +F188259C421AB0565D2C93368C7FE6E0A9F40BB196D1F23D06A9B4099431512B +C136412B8071F881A48FA8A97D03ACD06EBB8221F2FCB171D9A905549A8F7881 +2735FA48F2EC00ACCEB309920B412B3F60D0173EF224E4CB3F5C1DAD9CC6147F +9ADED8EC6C9533B7B1AABCF5D1E9B7F36A2D4B8D2B26EAE8EA> |- +/i <1C60D8A8C9B08A9570810981675968AD25F24D2B3EAE33A4AEDADBE9B65D +A53E9F2E54B16133284CA9914BED3880C793207FBDC7926300AD07E6E54407B5 +1EA082FB5EE3816A6A23A8296A947037E4E873086619D7E86B5A60AFA576E554 +D14C9B74D403098ADE85F71880A3E75D7FC1> |- +/n <1C60D8A8C9B08A95C5897169EED9664BED359D179BD38846B55E34D4CAA6 +E85E9CF3F20D5FF6B35F1C9AAE2A542B7B24E087B6004A4C7219997095CC0DD0 +7A15DB83B5FEAD13F209441FFD364AD3DBF6E16129F3599BACA005A523490ABC +41E4DF320ACE384037EE1D352E3FAD8A9E2CECBD75A999F7B655F4FFBFAC6FFF +84029A8DF710DBB0D7CD4C1D20367E79BC4E3121199FA9593C876B29EA793F10 +2A1E36BE8056D0377A> |- +/p <1C60D8A8C9B08A95C5897169EED91609D9E4D5F91353B4B61FEC4EAC5FAD +7B5032144CF9ADF0F974C4F1789F7935ECC14F06F084A964A5CA17285CA0C9EC +1B8F57A0E66AEAF75BA11AE734E6416585ED4DB12A3372EA2BA1BABC0DE7BE87 +584CD6EA8819CE99CB18F04E8ECD619D7E02CDE60A0AA18597DE62AF13ABCC5A +5F1D59EBFBBEF560144EF0DCE1B387B4BC40F158468D6A4DE477659B50190482 +6F081FC4942E5187D9F03F6D1BD471F55D6300> |- +/q <1C60D8A8C9B08A95D222871B45C8677AD60861C3F92152D679EC046FD508 +04EE7440261F7F760EFE5BDA37735333B634AEF0E39D128EC81BD50CEED93A00 +645B5D6515E247CEC7B0C61191F67893C528A900762C59FAEA845D61ACA5F7E7 +B106031460E4734AA4EE85618EEC80B1ED1E754561578DABED479BE37358B263 +04EF9BF65844BFE482C31643A7466E43F6E32A0E02E6EBB6652EB71BB9780CA6 +2F7BC7305363> |- +/r <1C60D8A8C9B08A9584DCB847BA986212E50A0E258C2648145E7BCFAC2BA8 +6C36E84B654FABD35F6BE558D4B54676EA44C57F6EF668BC4866822048422FD6 +D8B608EB2C1C67EC3EE3CEBDD94E9A9214F99F9DA8EE2F6900EB47053AC763EE +DABCA0360701D8CB383B9ECCD7B848D18CFB88761A167471DE407F7BED4BC50B +779C4D57BF133C3E4777AA4605171C6D> |- +/s <1C60D8A8C9B08A9586D4F7B21AA9B0967A13D9D7A42FE5E3505E2F3EE7CA +FF99F258F00E5A08E889C3CC5D8ACF7164CD2AC0013AEF91C534D4ACEB36DB05 +CE0E820904C7EB6E6797C2D5FB5E96476FD3694427C3F770022BFE939EC57571 +FAC1F965E0A7F32B36C86522DA3AFB3A309E4B5D72F0E56F1BEB5C7254CECC22 +9B1219F95DA80187F2FFAF15E03AF5B396BE650B53989F1A64B4AA9655D1019B +496166D38FC8961ACDA2D0B1533422796A114C02DCAA98A8558155EE2C970442 +944A032E8A6A4004C15A48F9176AE45E44068C23BC> |- +/t <1C60D8A8C9B08A958B2129D6E9766AD6B3247B9CBDFB0724765D43ED23A7 +B2BC7B24077C209594776C48799589E3DF7269407A6893D4C106057122D99E3F +649ACAFBE1812EEAA6C4DCDDD716BEB7694626BFFCAE715C15EF0FD8CE9F6FE4 +E96B03> |- +/u <1C60D8A8C9B08A95C5897169EED96D33CB6A8CCD6F539BADC574F30FA019 +2FAAA0351E8C93175F4B6BE4D2DCA8A13E4F01BEC5788441B5C71C1247369B6B +73137454B1C207EA4F43D533FE87512BAD8DD4F3DBBECD9A7A1CE3F33A4D3F31 +6952FDB339B4B6A937009D6EC9821D8553981B7D8AABC3E750369071> |- +/v <1C60D8A8C9B08A95D222871B45C81C126204E8A3F3EFC2EBF937B1E5F2B8 +737EDCCFF78DB8693FA0E7B559CFAC0A233112105FC1A8807ADD3013D4AE86C4 +38318F1223CADD606642DF7E9A8EE9BE743E975DA759D856D52F7E927FE33606 +3979ED38AB2E1EA4CB4F371A1EB04E6C5B864C9DB5271435AB2DE7D9DE15A6B1 +D9E3FD555F015DADE467> |- +/x <1C60D8A8C9B08A95D222871B45C8170346D4B3692E8D5307651DE3271DD6 +AF0FFCDE284DD9CDD3B987BD9A4951E635C7A5CDCF53A699D8D2BA39BF571FED +C61B4760FA01C102B3CF6C44B24A57107DFFEFB711E00B7E6B8A7F332F9AC2C5 +3243312E3CD55C94054BCA0B5D37362E138F5DD97019783B5271FD96258D5354 +389532FB5D3FC50CB007DF880768FCF0AAEC6D6F5D8AB1559D6270DF0761EAD0 +57A9F39E9A718AA16D8D8ECA90D61565C41A9B86CA057EC652FEE1927FFE969C +A046D06A10E75C83320EEEAB290370B870EF0E26D64C8EE9F9FD2B5549> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLO+CMR10 /Encoding get +dup 40 /parenleft put +dup 41 /parenright put +dup 46 /period put +dup 52 /four put +dup 61 /equal put +dup 70 /F put +dup 72 /H put +dup 83 /S put +dup 99 /c put +dup 100 /d put +dup 104 /h put +dup 105 /i put +dup 110 /n put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 120 /x put +pop +%ADOEndSubsetFont +/YNDRLO+CMR10*1 +[40{/.notdef}rp /parenleft /parenright 4{/.notdef}rp /period /slash /zero /one +/two /three /four /five 4{/.notdef}rp /colon 2{/.notdef}rp /equal +3{/.notdef}rp /A /.notdef /C 2{/.notdef}rp /F /.notdef /H +4{/.notdef}rp /M /N /.notdef /P 2{/.notdef}rp /S /T +12{/.notdef}rp /a /.notdef /c /d /e /f /g +/h /i 3{/.notdef}rp /m /n /o /p /q +/r /s /t /u /v /.notdef /x 2{/.notdef}rp +/endash 132{/.notdef}rp] +YNDRLO+CMR10 nf +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-45.0216 -355.373 mo +(\()sh +%ADOBeginSubsetFont: HIBBAA+CMR9 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /HIBBAA+CMR9 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988-1992 Blue Sky Research and Y&Y, Inc. http://www.YandY.com) def +/Weight (Medium) def +/ItalicAngle 0 def +/BaseFontName (CMR9) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 41 /parenright put +dup 53 /five put +def +/UniqueID 5000792 def +/FontBBox {-259 -250 1036 969} def +end +systemdict begin +dup /Private +13 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-22 -0 683 705 431 448 666 677] def +/OtherBlues [-206 -194] def +/BlueScale 0.04379 def +/StdHW [31] def +/StdVW [74] def +/StemSnapH [25 31] def +/StemSnapV [74 90] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +3 dict dup begin +/parenright <1C60D8A8C9B08A9580C822583BC370487009D181CBA691147F6 +F8E8C42F265A062451575BEC72F3C54B75B3042D03FE51288E9DEA2DB7D89B60 +C5AB212AD0328C2FED2452C8D71307D8BEB902AB741F57EB271E260A8DDAB60A +642C0AB4B9BA1A462E698D6BDE5146B5F8358CAA639> |- +/five <1C60D8A8C9B08A95D419B460E02949711E720A4077D26DD7A080E00D4 +DBD09050278296788C7EDD2BB214F6B140ABE36647DFD9317DC0E68F3DCAC8F3 +C4A02FDA88653A7AA275130DBF9CCDCED17C6CD1BAC4223BC20B6E6A4BC55A02 +19CE2C9017E92992CD114F37B3979CA159210092C7217E21A4267991C1FC8766 +AB20FE76E82CA3859AFBF2FC009F9854E3EA6E91732A71D79AB96F35873CA1AF +7197AC348F4E13D54680F47DDBF4022C7EF240A091505B941511698D8640F179 +ED11A895385> |- +/.notdef <1C60D8A8C9B08A9599C1D3CEECCC8D> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLP+CMR9 /HIBBAA+CMR9 findfont ct_VMDictPut +/YNDRLP+CMR9*1 +[41{/.notdef}rp /parenright 11{/.notdef}rp /five 202{/.notdef}rp] +YNDRLP+CMR9 nf +YNDRLP+CMR9*1 [8.9664 0 0 -8.9664 0 0 ]msf +-41.1472 -355.373 mo +(5)sh +%ADOBeginSubsetFont: QJJAAA+CMR6 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /QJJAAA+CMR6 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1992 Blue Sky Research and Y&Y, Inc. http://www.YandY.com) def +/Weight (Medium) def +/ItalicAngle 0 def +/BaseFontName (CMR6) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 112 /p put +dup 115 /s put +dup 116 /t put +def +/UniqueID 5000789 def +/FontBBox {-307 -250 1193 968} def +end +systemdict begin +dup /Private +13 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-21 -0 683 704 431 446 665 675] def +/OtherBlues [-205 -194] def +/BlueScale 0.04379 def +/StdHW [39] def +/StdVW [83] def +/StemSnapH [32 39] def +/StemSnapV [83 100] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +4 dict dup begin +/p <1C60D8A8C9B08A944682CDB2CEB55A74B6ED00777DC807209D0FFA0F869D +6A57A217266FA8EF2564481C3E7CB2C48224354A458E1061E0810A25D89C2DD3 +B76575D29E7AA275B71A4644F8366F4F5E4496A5FDD162F3813309F64034DB41 +AFC075EC8248C374B358F6ED31862CE7C114B35C65AB41B74A5C305863EFAFE2 +D34DF13F11FFA00905934B7F8EFF90BFD605> |- +/s <1C60D8A8C9B08A95A2C8A0F249798E017217C11BB482AB75DBF2547F4990 +46EB1BEE341D075C819108E9509FC0B6F599339E670179644E1C3729C9A6F301 +1FE7AF9216C826E32D7FA5858F08935B66A883749096602F0F862769D84D8127 +339D8A1F215B761BCCE0272FD6C048C8CF4B4C83BE04767F22F78F55D199717A +523DF83BF6568D513EB93AB72DDEEEBEE3968FF97DD590A320ACDD6B2FDAA566 +BEA97E466532BBE8712C4DFBED44802754D5B8FE96A435EB> |- +/t <1C60D8A8C9B08A95A0A3AB1E3D9B4D40DCAD754562EF6C6D3DEF6F43FBCB +F6712F42A082EF4530994D14B40572A79BA447985100CE00F056010BB6BC6CE7 +615E601E4E14F9020F0831574FCAA6E6991EDEA062A92D934D70C1216BF921> |- +/.notdef <1C60D8A8C9B08A95BE2B761DD6BD68> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLQ+CMR6 /QJJAAA+CMR6 findfont ct_VMDictPut +/YNDRLQ+CMR6*1 +[112{/.notdef}rp /p 2{/.notdef}rp /s /t 139{/.notdef}rp] +YNDRLQ+CMR6 nf +YNDRLQ+CMR6*1 [5.9776 0 0 -5.9776 0 0 ]msf +-36.5394 -359.68 mo +(pts) +[4.04142 2.87584 0 ]xsh +YNDRLP+CMR9*1 [8.9664 0 0 -8.9664 0 0 ]msf +-26.206 -355.373 mo +(\))sh +%ADOBeginSubsetFont: GFNBAA+CMBX10 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /GFNBAA+CMBX10 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1994 Blue Sky Research and Y&Y, Inc. http://www.YandY.com) def +/Weight (Bold) def +/ItalicAngle 0 def +/BaseFontName (CMBX10) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 46 /period put +dup 52 /four put +def +/UniqueID 5000768 def +/FontBBox {-301 -250 1164 946} def +end +systemdict begin +dup /Private +14 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-11 -0 686 697 444 453 655 676] def +/OtherBlues [-201 -194] def +/BlueScale 0.04379 def +/StdHW [47] def +/StdVW [114] def +/StemSnapH [40 47] def +/StemSnapV [114 142] def +/ForceBold true def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +3 dict dup begin +/period <1C60D8A8C9B08A9560D4C2F3A74D92838E83B7DC14B89478B799496 +0CFDC6D2144A34A20CA36052335682902BE7739DD> |- +/four <1C60D8A8C9B7FCB6AF8364F0605C451CEEA3B4E1B916196AB7B08943E +0CF71744315D573147B01821B98A6E1D4D4D879C9FFD38F4E4551A3DC3091068 +6735A4AD4544FACE2F5F9D09C6BD2006C051140924F82F9CA156066831D37EFC +60047D0193DA594CCE1> |- +/.notdef <1C60D8A8C9B08A95899606B6B060A7> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLR+CMBX10 /GFNBAA+CMBX10 findfont ct_VMDictPut +/YNDRLR+CMBX10*1 +[46{/.notdef}rp /period 5{/.notdef}rp /four 203{/.notdef}rp] +YNDRLR+CMBX10 nf +YNDRLR+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-5.93501 -355.373 mo +(4.) +[5.72846 0 ]xsh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +6.7952 -355.373 mo +(Findtheequationofthequadraticfunction) +[6.50558 2.7696 5.5392 9.44853 3.87553 5.53921 8.33272 4.4234 5.26024 5.53922 4.98129 3.87552 +2.76962 4.98129 9.44852 4.98131 6.95787 3.87553 5.5392 8.33272 5.26025 5.53919 4.98131 5.5392 +3.90532 4.98131 3.87552 2.76961 8.33272 3.04855 5.53922 5.53922 4.42337 3.87552 2.76962 4.98129 +0 ]xsh +%ADOBeginSubsetFont: HJCBAA+CMMI10 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /HJCBAA+CMMI10 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1996 Blue Sky Research and Y&Y, Inc. (978) 371-3286) def +/Weight (Medium) def +/ItalicAngle -14.04 def +/BaseFontName (CMMI10) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 59 /comma put +dup 80 /P put +dup 86 /V put +dup 102 /f put +dup 120 /x put +dup 121 /y put +def +/UniqueID 5087385 def +/FontBBox {-32 -250 1048 750} def +end +systemdict begin +dup /Private +12 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-22 -0 683 705 431 442 453 466] def +/OtherBlues [-205 -194] def +/BlueScale 0.04379 def +/StdHW [31] def +/StdVW [72] def +/StemSnapH [25 31] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +7 dict dup begin +/comma <1C60D8A8C9B08A9570810981675918D0BCF1CD202F5F15202B7A6E1C +EF0947ED02AAA4C366CA78E08C39B6DD0700901548AC0500952501F57D43D699 +1493A7332E9D6FB3B92D3B17F7AFEDFB43B1F0997B51EC481BBA2E83EB27> |- +/P <1C60D8A8C9B677ECB1F5884EF202194D27AFDA20C9C5AF9717AEDDA8FACC +FA5CE5F06E7E735F3308B4CA613864C8BB9E998C2D16EBC620C6B43596E1DD40 +839888CA51D52E708072E18AA08B28E3CB1E6EF21FAD99F857CC70EE52D6669F +D4FEF6D378C3644D9B3C83FB9CAAC301898C0568C7EDDC149173AA0D66326455 +24A8E317AEDEA6E137E747B687221C612ED78EEB9D5BC26FBD4832935A8A744A +79B07DF310B6BFAA137B534BCCDB0286BC5B1A9F8DB00E7C57> |- +/V <1C60D8A8C9B08A95FF8CEA8AF5E081C6F02740DACAFFE5A2787935AF2B67 +DE2E7EB4064F400583DCFFCB975A0A5B856DE1372CA242F7CED7D047752AAC26 +BA220E55F1F7E54D0A19D02128B276B5C86A93B57D1C6EA6F9A3F8A0CE56B7E7 +A455AEC2F7481AED5044B03BCB5E7742AE418C4A710ADD0B17D2FD077229F311 +2BD0466A5DE205AFD8EC3FD4485F469F794B22118D2D39A7CCBCAA5AC4DA3AD7 +CDB1E59327867A> |- +/f <1C60D8A8C9B08A95A31CD7D9F217DCBA6071B8E0D5846125EF4CB4EF23CC +4DD09E878CE196EC9B9F1F54A677ADB5C5E9ACDFCDD60FBB7D164F70307F6FF3 +E6CF0DB7E2074C1F7921AAD73B6B148990BE29E190748D2E55F76C8DD519464C +4DCA4CE0036FE5445919C3CF6FF6DCAE21D932617F2FE28250D9FD929A5C31EC +01CDB055499E20A4E6ACC9CEE6E4FD03E9282ED811C39CA628CE996E2370CF0C +ADC74D2C4D895E1A9293BFD21891AEF1BAE4A5D07F6F5FCCAD81E4752A24937F +1ABC3CF8652B> |- +/x <1C60D8A8C9B08A95C3B1459DC8650F9F96183FC46268F5BDA744B05C84F8 +C7E5FE6BFCA9D4C8BD3488080E8FC96F34EA177DCAE190D27F37102D2F45514A +ECF6E4A3B2E6F401810D0AF13E4BDFDB8118476E04C9DD93F8884F46C9ABEE13 +C8E7992449902F6BC3D518B2A70293976C8BCE67ED913D975C52E884BF7F46CE +8DF8170D79262260A6CB5A6A088C0A964E0271DA63944ABA9C96D1AA58CB590F +97DC9C8372606676C2CA18B1A9303EBF11B510FAB8A33E9B530D274E48DD09EE +8829EC16181BBC16C4E81343ACB5386F22A9C0CA2C23959102E833> |- +/y <1C60D8A8C9B08A95A3A690DEE11C2ACFF7516D4A7CDA884FB3B130648C63 +2F41B68B5E071E6BAD692658125A4CE9A4427A55054BF5DABFF855AF9D186215 +1F50AD5D2EE36E064C9718B8694EF83525324184D7DD07A10B9FD203C707D849 +3E926469CD1C36E94D5785557A2D95B556774E51CEFBAE2CC8AB735FFF293AFE +FA32B8D1FD5C52EC860AA6EC20816B24BD1EB69FE8581708322D6F09A08B3182 +91EF57EAE554A00C60D585B786E53371A6D3FB2D8729C3F2C51DB65ABF8CA421 +EEB103AED2CB924D829D66429CF6664CDEAFEEC4AD07C95E7FE8BCAB5D2A1AD6 +731779D5> |- +/.notdef <1C60D8A8C9B08A959E2F69652E8B8F> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLS+CMMI10 /HJCBAA+CMMI10 findfont ct_VMDictPut +/YNDRLS+CMMI10*1 +[59{/.notdef}rp /comma 20{/.notdef}rp /P 5{/.notdef}rp /V 15{/.notdef}rp /f +17{/.notdef}rp /x /y 134{/.notdef}rp] +YNDRLS+CMMI10 nf +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +204.525 -355.373 mo +(y)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +213.515 -355.373 mo +(=)sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +225.012 -355.373 mo +(f)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +230.962 -355.373 mo +(\()sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +234.836 -355.373 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +240.53 -355.373 mo +(\)thathasvertexat) +[7.78485 3.87552 5.53922 4.98129 7.78485 5.53922 4.98129 7.83456 4.98328 4.4234 3.90533 3.87552 +4.4234 9.16959 4.98129 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +332.39 -355.373 mo +(V)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +340.416 -355.373 mo +(\(2) +[3.87552 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +349.272 -355.373 mo +(;)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +353.699 -355.373 mo +(0\)andpassingthrough) +[4.98129 7.78485 4.98132 5.53918 9.44852 5.53922 4.98129 3.92523 3.92526 2.76959 5.53918 8.89063 +3.87555 5.53918 3.90533 4.98132 5.53918 4.98132 0 ]xsh +6.79319 -343.418 mo +(thepoint) +[3.87553 5.53921 7.74393 5.81616 4.9813 2.7696 5.26225 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +49.9651 -343.418 mo +(P)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +57.7449 -343.418 mo +(\(4) +[3.87553 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +66.6007 -343.418 mo +(;)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +71.0281 -343.418 mo +(3\).\(Hint:Startthestandardformforaquadraticfunction.\)) +[4.98129 3.87553 7.19698 3.87553 7.47194 2.76961 5.26224 3.87553 7.19698 5.5392 3.87553 4.98129 +3.90532 7.19608 3.87552 5.53922 7.74393 3.92523 3.87552 4.98129 5.53922 5.53922 4.98129 3.9053 +8.85974 3.04855 4.98129 3.90533 11.6193 3.04855 4.98132 7.22583 8.30182 5.26025 5.53922 4.98129 +5.53922 3.9053 4.98132 3.87552 2.76962 7.7439 3.04858 5.53918 5.53918 4.4234 3.87555 2.76959 +4.98129 5.53922 2.76959 0 ]xsh +31.6997 -311.239 mo +(Ans:) +[7.47195 5.53921 3.92523 0 ]xsh +61.3685 -329.769 mo +212.143 -329.769 li +@ +61.5675 -301.475 mo +61.5675 -329.769 li +@ +211.943 -301.475 mo +211.943 -329.769 li +@ +61.3685 -301.475 mo +212.143 -301.475 li +@ +%ADOBeginSubsetFont: PBAAAA+CMR10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLO+CMR10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/plus <1C60D8A8C9B08A9461828376290042B3B0012119E49A5F8A40FFB07EC +16079327C8839C8F2280897EA08CCF42D3B4E2B36A495896A102B0E0B676D7CD +E615B4B502BC24C313F43E124C5C3EF4728FA76AB60F029D0136D86C00EF66A5 +8511B752E> |- +/comma <1C60D8A8C9B08A9570810981675918D0EB69F4849D276580C082D099 +7802A927AAA2375534E06DEEACA66ED813A5B192A7FE5DA703C37E60926BB724 +44209BF2BEF896DBE7EE9ABE82F3CFBC974BB345C7D152C7> |- +/hyphen <1C60D8A8C9B08A959E2F69652E8B76AC2AC5B4F1FA8662A86AEED57 +846929C2FBC07360B> |- +/eight <1C60D8A8C9B7A73D3B2B97F1414E4E14F801A059892814FA42E4E2C8 +0EFDA659D9BB77F349463F4A00D8ED33975855544E68ADA715C46B48E5214EC1 +478071E2CA54580909701967B928DD6D384659775DC9744471AF4209ABE86CCF +54E84B03EB8981900A33E230A5E176029A4F3431D5460DA2A76659C526F48B26 +52E37466C39C5889089BE6A19F3137FC6D1B485B848C7736C3557EF97475E9CA +989D1C5C068CA476E0F43FE30877AB721411F0A7DBA400> |- +/U <1C60D8A8C9B08A9501CDAE1251A6E3AF1199B24D30F25809B39A0DD6474A +CF1BFDB89F5985BBB0F2E5FE7296314FDA462BECDBDEA31B3750001975D37A8B +F31F224CAB5093B8997B856DAE5F9007E1497BEED45CA8AC033A65F773653762 +77BFCDF39A2D8F1BC8E5626BEEEF5D670E87E32F25C0530E88A4E2B9AD6D8333 +3A6C173F8B22714E74A224AD610C2B1EAB> |- +/fi <1C60D8A8C9B08A95C5897169EED9664BED3581948373A452C15E4C3B51F +55A9DC6A0C100710D56E7C6F019B9B4E72A04A6011AD7DCB16FE5DCCC03F7498 +0027ED133122486B164CF04FA5471382DF043096D0A8C2D8205379F1D24FA530 +3D478366008D43EE4D8D7A68A3EF7ABE85450F42207223B0818C0B63E6EEFEFC +572FFE621D97F1837407CCDA5F53C193FFC91FB835409D6099928BA194B90036 +A423E9DD2BBD7C0D4FF99AA83190CADC86BE5FBB7034A3CD2B345BB396A3CA47 +FF656DE46D50935C1130BD470FDB47CF34C2317460A0C7396> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLO+CMR10 /Encoding get +dup 43 /plus put +dup 44 /comma put +dup 45 /hyphen put +dup 56 /eight put +dup 85 /U put +dup 175 /fi put +pop +%ADOEndSubsetFont +/YNDRLO+CMR10*1 +[40{/.notdef}rp /parenleft /parenright /.notdef /plus /comma /hyphen /period +/slash /zero /one /two /three /four /five 2{/.notdef}rp +/eight /.notdef /colon 2{/.notdef}rp /equal 3{/.notdef}rp /A /.notdef +/C 2{/.notdef}rp /F /.notdef /H 4{/.notdef}rp /M /N +/.notdef /P 2{/.notdef}rp /S /T /U 11{/.notdef}rp /a +/.notdef /c /d /e /f /g /h /i +3{/.notdef}rp /m /n /o /p /q /r /s +/t /u /v /.notdef /x 2{/.notdef}rp /endash 51{/.notdef}rp +/fi 80{/.notdef}rp] +YNDRLO+CMR10 nf +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-45.0216 -191.351 mo +(\()sh +YNDRLP+CMR9*1 [8.9664 0 0 -8.9664 0 0 ]msf +-41.1472 -191.351 mo +(5)sh +YNDRLQ+CMR6*1 [5.9776 0 0 -5.9776 0 0 ]msf +-36.5394 -195.658 mo +(pts) +[4.04142 2.87584 0 ]xsh +YNDRLP+CMR9*1 [8.9664 0 0 -8.9664 0 0 ]msf +-26.206 -191.351 mo +(\))sh +%ADOBeginSubsetFont: GFNBAA+CMBX10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLR+CMBX10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/five <1C60D8A8C9B7FCB6A4EC6CDC845AF08DBED09EA9C7F33182AFC703011 +60666AEA164958808F9011F6FA9DB2F58BA8568ED7327DA5423B9D702A196C72 +8AA107A4AB8C8EACBE3017CDF3A5211CECD1BE830110553F9F08F4EF9E634B24 +219505B139C4E7F16310FDAE20ED23F1564E52FDBF0312361108AA486EDC0FD0 +6827CA1BEFDBE2B56A02A9426FF43266AC2E214D839A31D77D0DB548899751FF +8FFFB115778B8280430E41E54537FDC801CD3CA21011131C53199DA913D184CD +2656A0A0911E6616EE78AC5CCCF1EF48CFA> |- +/a <1C60D8A8C9B08A95C60527548E754D765DB4EDA6BA0D2CC6D8A620394D95 +5731400D0093175DD4FDCB6F936DAB2E93BD9C1B54BF99F619E92F88F8093B57 +6575F38778E5971C238BB03705C8902A6FCFED1FF202619A2D8A4C3FD818942E +E7E0400EE37C1268C755A54355454E010823DC11303C9CDCFFF1370DF47DDE8E +0505D81ACB493683AAFD9A5B8B94F66FF9ECA66884B26F31C72D900D51753830 +4DA83D95E97AC104F2FDC53254E575E01E9C7E8025E9> |- +/e <1C60D8A8C9B08A95D1DE8AA71D3914AC9DDC5BFDDE55301EE17DAE184B08 +E53C36FBF9A44FDF3309DBE08895DBFECCF103737D7326528346FD01CD1D9FC3 +874638E8C50ADE3B494897353EB3188B512405DD1BA5DA59E8C179230F7C8D15 +AFCEA2228DAC03C77D614B36A41126CE831B41CDF160A67B175BB36C52353A72 +5460F4256C> |- +/f <1C60D8A8C9B08A95959A8F784B7EF0775E015DD20DEA1213AD0E07AF4C09 +CE165F97A542F1816A5AC50A3C909AAD1BC3E7C3F642FEBC0CECFA1D309AFF8D +13A6E13D72E8A154D7B3CD36A60FD1AE6F9C242B1780C55702CDA8788486BCF4 +B3081800F3610659D71EE1030C59AFB6C99C8518A3513B1EEAFB312E1D76B804 +BF82> |- +/l <1C60D8A8C9B08A9560D4C2F3A74D92CE39CD89050C421F6EB031E3EDE051 +2AA4AD5B81E17A938D0422CF87295A2035937494C11C32195EF4AB3FD58FD45B +46FD4E5EE0FC3A> |- +/m <1C60D8A8C9B08A943819E9A7E2C5069B3F1B2D03CD1524D83A2D258C3F82 +7FDF54BB18F721FE3F454FAABC11D7CA89C4C19C11B5C30D173E79137EC84AC2 +77B998A334D7BA85C6B96AA4B0F02CC2BED450B3A709B0F96F78B6CE241D5BFA +AC403F83855B7A94329ECB40DA8F31599AFB6EF8B71B13B5AB4C664C4C065A0E +E78334BEF0A5D4AB7E30F69B04B4E35F289A7CE142CE71AF2C96F59A109E30BF +D7494BECBB0A4A078F86EB3A84A14D516A64047A3607B48A7DE80EA48BF4C45B +F5BC9C74E2CCBE70D6D270A69F1E0B7D776846F978> |- +/o <1C60D8A8C9B7FCB6A15C803B3B972EE31F5A721ABF9B8490D1BCABFAF507 +3D6D0835AA64493F9EC5B8BAE86BFF5C8028599ED438B3807899BF98EB3DF2EE +9BBE5DC52FDB77ACA45EA052A40521B13F529CBBBB8B40F192297C658BE1CF97 +9B5618AA4355B6A77C9FC09641> |- +/r <1C60D8A8C9B08A95A5BEE1199161ADD44E1E8B27A5C75D09130CF9546F37 +4B2A22381A06BD734F2C4BF093B03F9AF2D0D4C8BE8AA6899632B1BDCEA5F8FA +27D0647BB27FC7927912A6761C3F8A51172D73B92082F06EFA277243DBD96EE1 +6421DB7B86390678EAD31E9D8E521BD186BAE7A8A68851384DC5E4933D7D1C5E +E5A527356EDB77> |- +/t <1C60D8A8C9B08A95B289C730516FE0D4538DFB1DC5F03AB2A5BEF8745C1E +35FCB761515E409A6F65039A0D58B91172FF5C95F2480FE3881FAA4AD06F5183 +F1B973B251F977BA472832041222D1E0F2231105C2CDDEEF4D7697B4581717> |- +/u <1C60D8A8C9B08A95E5CBCB515510AF055BEAA5A885DDAB81EBFFFCEF09D0 +4F66877D2C2F3DC2FF20129B503D0259EFE57E291A13CFF6B1511568438D4A20 +297E1247987321757C81667B7BC4DB2CD1ED658E5F8864225BE2E87B909D3E7C +4B6F1CABF222FF59DF64FD0A1246441792DB31FF90BD769AB08F5CF519DB0C> |- +/v <1C60D8A8C9B08A95F1118A977C624E83CF27678167D409FB9CBB2CD28A75 +267A2384DA90A49D89E5BF350EA89EC55761E77C6CD88C98506090A75A746C46 +9A927AA468E2A4D26BAFA4A508A54BA0F40FF721C9C2716F5A4628037B04E9B7 +042CBF20C913B0AE56899A0AC9D01020E32C0360762279F9E0CB> |- +/x <1C60D8A8C9B08A95F1118A977C6242CC6F5E327BF4FA5D5A96003A353B9F +5194FC29E209B0E58D492B32361BA463B6BF5C8F5713114044F381A33FC053B0 +4264D2166B00A0D46B0483E7D71E6B2BF037C36A33F31F6939D5141C37793F10 +64A0F374AFDFD9C87199B35E9C7A6009C599A58421D97E6DEA9C4D9690F018C5 +EE3E53343C76D3E513788DA12001E489EB7FF420036E340D26978DF0E5DDDF42 +F55B791009CB89C0F4FDC246D837796B093D849043F6C168FB> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLR+CMBX10 /Encoding get +dup 53 /five put +dup 97 /a put +dup 101 /e put +dup 102 /f put +dup 108 /l put +dup 109 /m put +dup 111 /o put +dup 114 /r put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 120 /x put +pop +%ADOEndSubsetFont +/YNDRLR+CMBX10*1 +[46{/.notdef}rp /period 5{/.notdef}rp /four /five 43{/.notdef}rp /a 3{/.notdef}rp +/e /f 5{/.notdef}rp /l /m /.notdef /o 2{/.notdef}rp +/r /.notdef /t /u /v /.notdef /x 135{/.notdef}rp] +YNDRLR+CMBX10 nf +YNDRLR+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-5.93501 -191.351 mo +(5.) +[5.72846 0 ]xsh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +6.7952 -191.351 mo +(Usethe) +[7.47195 3.92524 13.1088 3.87552 5.53921 0 ]xsh +YNDRLR+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +53.8336 -191.351 mo +(vertexformula) +[5.72943 5.25023 4.72226 4.45334 5.25023 16.0358 3.49684 5.72847 4.72226 9.22629 6.36618 3.17807 +0 ]xsh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +142.254 -191.351 mo +(to\257ndthe) +[3.87553 13.6667 5.5392 5.5392 14.2246 3.87552 5.53922 0 ]xsh +%ADOBeginSubsetFont: HJCBAA+CMMI10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLS+CMMI10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/h <1C60D8A8C9B08A95FDA51623F05A9A2A6A39B89F3D1AEC8E6882E4D019E1 +EE3223B66924A1F490116934BD651EEDE67679700979054D4F9C056A7A822424 +FD7D9B8BB4EF44E21D821C9BC2DC1CA0EA5B2FD8AAD4BBE7D9D6E0B70C0C2F4F +87945E636760D0AD8DADF1CA59165D8797B5050DDD7E7BA968915EF5A1AA319C +F3912D16DA7D42B75F1FBCDDF88B5B6529D3064AB3E881A082F8DB91528CD457 +5C8DF1CDC6067EB5AA702E24D2E9FCAFAC4CC2CE3EEF0A86DB41A080FC8BF41B +36A612E9D38EE5FE8C1F6E730D033DB10D1CE4BD13F1D549CC26> |- +/k <1C60D8A8C9B08A950870E36747CCD2F069BAB4078E293FC46118DBB0FF50 +21FD267E305A93E3B9EEC42C57CCDC98E9085508A0279B5E924DC8D8249FB392 +C042269C59395DE18C56A360550D8C0ED9C3AFC2FDA4AE58AD909C542F1D56B1 +61C5179601DBF5C94444DD0B9F055BE088FB6B642BE14831A86C5BEEF0E256B3 +9D4AC46C4ED9DF4A354293CDCB8A1813369714C569D8175330F277A54A760D07 +A53A3C00B10B1764A5E232EA1C68F5C304B41316F75BD759DC633B0BA29C870B +363D372EA12A78A4D533B5A688CD4860D786992FBDB0833174D4125943DE5B62 +FF7B77A96423BE665CBFC96F04F996C6434785D817FA8F95D8BFEC21E11687C7 +716A7F64FE23864587A3> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLS+CMMI10 /Encoding get +dup 104 /h put +dup 107 /k put +pop +%ADOEndSubsetFont +/YNDRLS+CMMI10*1 +[59{/.notdef}rp /comma 20{/.notdef}rp /P 5{/.notdef}rp /V 15{/.notdef}rp /f +/.notdef /h 2{/.notdef}rp /k 12{/.notdef}rp /x /y 134{/.notdef}rp] +YNDRLS+CMMI10 nf +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +207.608 -191.351 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +213.302 -191.351 mo +(-)sh +6.79521 -179.395 mo +(coordinate,) +[4.42339 5.25826 4.9813 3.90532 5.53921 2.7696 5.5392 4.98131 3.87552 4.4234 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +60.5385 -179.395 mo +(h)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +66.2789 -179.395 mo +(,andthe) +[8.05576 4.98129 5.53922 10.4328 3.87552 5.53922 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +114.007 -179.395 mo +(y)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +119.249 -179.395 mo +(-coordinate,) +[3.31747 4.4234 5.25825 4.98129 3.90533 5.5392 2.76959 5.53922 4.98129 3.87552 4.4234 0 +]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +176.314 -179.395 mo +(k)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +181.814 -179.395 mo +(,ofthe) +[8.05576 4.98129 7.94119 3.87552 5.53922 0 ]xsh +6.79525 -167.44 mo +(quadraticfunction) +[5.26025 5.5392 4.9813 5.53921 3.90532 4.9813 3.87553 2.7696 7.74393 3.04855 5.5392 5.5392 +4.4234 3.87553 2.76959 4.98129 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +90.3994 -167.44 mo +(f)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +96.3491 -167.44 mo +(\()sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +100.224 -167.44 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +105.917 -167.44 mo +(\)=2) +[6.64314 10.5185 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +128.056 -167.44 mo +(x)sh +%ADOBeginSubsetFont: UGXAAA+CMR7 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /UGXAAA+CMR7 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1992 Blue Sky Research and Y&Y, Inc. http://www.YandY.com) def +/Weight (Medium) def +/ItalicAngle 0 def +/BaseFontName (CMR7) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 50 /two put +def +/UniqueID 5000790 def +/FontBBox {-286 -250 1122 967} def +end +systemdict begin +dup /Private +13 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-20 -0 683 703 431 446 664 674] def +/OtherBlues [-205 -194] def +/BlueScale 0.04379 def +/StdHW [36] def +/StdVW [79] def +/StemSnapH [28 36] def +/StemSnapV [79 95] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +2 dict dup begin +/two <1C60D8A8C9B08A95C25148D4A67F955E56DED8709BEAC975B0F2E8A32A +514F6D9222A5E47F7F9AE809FC929439005D711A5946815CD69262A805D0F899 +C8EBB5027F0DDD5B81DF529E7E3811173669493CAEFC29805ADB063CD3E32E39 +72B91F3A4784DBF342B608A84378E8760E2174C16BC88D5442E7B57E279222AA +7C3147D75D44707368> |- +/.notdef <1C60D8A8C9B08A958AA685092D4752> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLT+CMR7 /UGXAAA+CMR7 findfont ct_VMDictPut +/YNDRLT+CMR7*1 +[50{/.notdef}rp /two 205{/.notdef}rp] +YNDRLT+CMR7 nf +YNDRLT+CMR7*1 [6.9738 0 0 -6.9738 0 0 ]msf +133.751 -171.554 mo +(2)sh +%ADOBeginSubsetFont: MZQAAA+CMSY10 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /MZQAAA+CMSY10 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1996 Y&Y, Inc. All Right Reserved. http://www.YandY.com) def +/Weight (Medium) def +/ItalicAngle -14.035 def +/BaseFontName (CMSY10) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 161 /minus put +def +/UniqueID 5096651 def +/FontBBox {-29 -960 1116 775} def +end +systemdict begin +dup /Private +13 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-24 -0 683 705] def +/OtherBlues [-135 -124] def +/BlueScale 0.04379 def +/StdHW [40] def +/StdVW [40] def +/StemSnapH [40 56] def +/StemSnapV [40 56] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +2 dict dup begin +/minus <1C60D8A8C9B08A946182837629008DF7702985522C1BEB4D11AB8A6B +5589D8B615C840A4D8FD35DE7CD09D4C55DA8FE732830DDE> |- +/.notdef <1C60D8A8C9B08A959E2F69652E8B8F> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLU+CMSY10 /MZQAAA+CMSY10 findfont ct_VMDictPut +/YNDRLU+CMSY10*1 +[161{/.notdef}rp /minus 94{/.notdef}rp] +YNDRLU+CMSY10 nf +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +140.434 -167.44 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +150.397 -167.44 mo +(8)sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +155.378 -167.44 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +163.286 -167.44 mo +(+5.) +[9.9646 4.98129 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +14.691 -139.812 mo +(h)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +23.1981 -139.812 mo +(=)sh +11.3025 -158.342 mo +109.1 -158.342 li +@ +11.5015 -130.048 mo +11.5015 -158.342 li +@ +108.901 -130.048 mo +108.901 -158.342 li +@ +11.3025 -130.048 mo +109.1 -130.048 li +@ +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +122.451 -139.811 mo +(k)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +130.719 -139.811 mo +(=)sh +119.063 -158.342 mo +216.621 -158.342 li +@ +119.263 -130.048 mo +119.263 -158.342 li +@ +216.422 -130.048 mo +216.422 -158.342 li +@ +119.063 -130.048 mo +216.621 -130.048 li +@ +231.565 -82.514 mo +231.565 -201.313 li +@ +%ADOBeginSubsetFont: GFNBAA+CMBX10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLR+CMBX10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/six <1C60D8A8C9B7FCB6A4EC6CCC9FCABED061B15B7D04288E658174D7F720 +94397557BC1198A2FF4B60C32EFFD71DB7057614ADD82D4EFF80CD28362F7945 +42C97EBB540D8B3019D847C0B1FCF0F66803F24063196B4E884DF3D051032E2B +962A0F0ADA01C960A76EEC3E28519ED1661A37488E4A35EFD6A7F15C7746AB33 +304982B589A0BF07E27CF8960828F787448A9EAF8B8FB3EA4556CD435193CA14 +B0D480234697D67B2B9ACB08B1BCB089378EE507536C29A4B3F1233D5F0D41DC +85AD> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLR+CMBX10 /Encoding get +dup 54 /six put +pop +%ADOEndSubsetFont +/YNDRLR+CMBX10*1 +[46{/.notdef}rp /period 5{/.notdef}rp /four /five /six 42{/.notdef}rp /a +3{/.notdef}rp /e /f 5{/.notdef}rp /l /m /.notdef /o +2{/.notdef}rp /r /.notdef /t /u /v /.notdef /x +135{/.notdef}rp] +YNDRLR+CMBX10 nf +YNDRLR+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +233.78 -191.351 mo +(6.) +[5.72845 0 ]xsh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +246.51 -191.351 mo +(\(3pts\)Thefunction) +[3.87552 6.64206 5.53922 3.87552 3.92523 8.59085 7.19299 5.53918 9.1387 3.04855 5.53922 5.53918 +4.4234 3.87552 2.76962 4.98129 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +341.243 -191.351 mo +(f)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +347.193 -191.351 mo +(\()sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +351.067 -191.351 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +356.761 -191.351 mo +(\)=) +[8.96741 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +378.567 -191.351 mo +(x)sh +YNDRLT+CMR7*1 [6.9738 0 0 -6.9738 0 0 ]msf +384.263 -195.464 mo +(2)sh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +391.876 -191.351 mo +(\241)sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +402.768 -191.351 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +411.606 -191.351 mo +(+1hasa) +[10.8941 9.69659 5.53918 4.98132 8.6405 0 ]xsh +246.509 -178.001 mo +300.509 -178.001 li +@ +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +303.83 -179.395 mo +(\(max/min\)at) +[3.87552 8.29877 4.98132 5.26025 4.98129 8.29877 2.76959 5.53922 7.19604 4.98132 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +367.205 -179.395 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +375.666 -179.395 mo +(=)sh +386.182 -178.001 mo +422.182 -178.001 li +@ +%ADOBeginSubsetFont: PBAAAA+CMR10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLO+CMR10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/b <1C60D8A8C9B08A95C5897169EED96641DA8B10CA087E6B7A5588052BABB7 +BC0836B12A49068694BF7254A2B820A876E020738250AC32ED44C3A7F2C5F700 +C2D03E307AFB7135F6415FEEB6D856569E9D5429B4DD3F524606607A7502F4FA +00BE0184FC677554B2B6367E60A281A4837A2231515AF09B33399B7D5C3D2E8F +3A2971F2933C4A4CAAA727A80DBDC9692BD6B38D543D422C14068650D2C61B6B +E587855459543E451B14A31F96D9B341DFF415> |- +/l <1C60D8A8C9B08A9570810981675968AD25F317189905083B97CD6CD1B880 +05B79B666989E13C0F8D0889AD0162C7E87274D188EBBD1A911FDD0B6E360AA1 +C515725198B9106B157680FC> |- +/y <1C60D8A8C9B08A95D222871B45C8674D920EF37C9F679699CE0B0FB82274 +530CA6994E4FADB5C701717EBB278510CEF9D9EF1CB9FAAD7A4852BC3264781D +C6E288589EC6BAAB146DF34989FBC4BF92E31D5C616C1050CCC8D58166B328D1 +E315EF5F39AF721DC6173775DFB26E6B6D40709A2BB053DECCFFF00649FC51FF +5F341744BBA1E71297E598A51054A43B9F951D7105485742D0A3BB595676EC69 +1F5215F9D0DE2FC2C87BF5CCF8146FF6F88E> |- +/z <1C60D8A8C9B08A95B1F07368C45D864DF4474A20870D1E195FBAAC9373D9 +2C93E3D24F1DE2394D0012E9565A09A0C2FC94DD6A6D4770D74AFB126C31DCA6 +ECBCA4E2CE8063F08F3759339B5A93CD00FEFB275550CDB6A2EDD2B1ADD82E89 +901E70494FCAD520852AE0> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLO+CMR10 /Encoding get +dup 98 /b put +dup 108 /l put +dup 121 /y put +dup 122 /z put +pop +%ADOEndSubsetFont +/YNDRLO+CMR10*1 +[40{/.notdef}rp /parenleft /parenright /.notdef /plus /comma /hyphen /period +/slash /zero /one /two /three /four /five 2{/.notdef}rp +/eight /.notdef /colon 2{/.notdef}rp /equal 3{/.notdef}rp /A /.notdef +/C 2{/.notdef}rp /F /.notdef /H 4{/.notdef}rp /M /N +/.notdef /P 2{/.notdef}rp /S /T /U 11{/.notdef}rp /a +/b /c /d /e /f /g /h /i +2{/.notdef}rp /l /m /n /o /p /q /r +/s /t /u /v /.notdef /x /y /z +/endash 51{/.notdef}rp /fi 80{/.notdef}rp] +YNDRLO+CMR10 nf +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +422.182 -179.395 mo +(.)sh +-45.0199 -60.5415 mo +(\()sh +%ADOBeginSubsetFont: HIBBAA+CMR9 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLP+CMR9 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/four <1C60D8A8C9B08A95D419B460E029B72392EFD3516AC6D47A0580F8E7F +F8847046F49DCDA4820A0DC9E78CEE823202EFBD2B71DC482E2F0C7EBB391D22 +B16C197936E1F1399F8FCE0BC3C8FB98225FDE550707B36E94FA8270E630DFD5 +1A75573A58A24800A486D3D63B84BD85BBA07> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLP+CMR9 /Encoding get +dup 52 /four put +pop +%ADOEndSubsetFont +/YNDRLP+CMR9*1 +[41{/.notdef}rp /parenright 10{/.notdef}rp /four /five 202{/.notdef}rp] +YNDRLP+CMR9 nf +YNDRLP+CMR9*1 [8.9664 0 0 -8.9664 0 0 ]msf +-41.1472 -60.5411 mo +(4)sh +YNDRLQ+CMR6*1 [5.9776 0 0 -5.9776 0 0 ]msf +-36.5394 -64.8482 mo +(pts) +[4.04142 2.87584 0 ]xsh +YNDRLP+CMR9*1 [8.9664 0 0 -8.9664 0 0 ]msf +-26.206 -60.5411 mo +(\))sh +%ADOBeginSubsetFont: GFNBAA+CMBX10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLR+CMBX10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/seven <1C60D8A8C9B7FCB6A4FAB6A9D341141913323C94D688DF3A3CA84F36 +AE7F8D04C5AC2854620CED2689E1219070992AF07DF9A674CD2A62E1ABD46722 +C3D4B8026D12D1710944752B1E696F8038B7BE5D69EB782F0E83B442C89314B6 +131E48D72131FC42DC96F7B2F0D2BC4C7378E5151A75B2EFD41680E05B1DDA3F> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLR+CMBX10 /Encoding get +dup 55 /seven put +pop +%ADOEndSubsetFont +/YNDRLR+CMBX10*1 +[46{/.notdef}rp /period 5{/.notdef}rp /four /five /six /seven 41{/.notdef}rp +/a 3{/.notdef}rp /e /f 5{/.notdef}rp /l /m /.notdef +/o 2{/.notdef}rp /r /.notdef /t /u /v /.notdef +/x 135{/.notdef}rp] +YNDRLR+CMBX10 nf +YNDRLR+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-5.93501 -60.5411 mo +(7.) +[5.72846 0 ]xsh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +6.7952 -60.5411 mo +(Forapolynomialofdegree12,accordingtotheory,themaximumnumberofzerosis) +[5.67569 4.9813 7.12823 8.2042 5.81616 4.9813 2.76961 5.26025 5.5392 4.98129 8.29878 2.76959 +4.98129 5.99252 4.98129 6.27145 5.5392 4.4234 4.98131 3.9053 4.4234 7.6463 4.98129 4.98131 +6.01242 4.98131 4.4234 4.42339 4.98131 3.90532 5.5392 2.76962 5.53918 8.20419 3.87552 8.20422 +3.87552 5.53922 4.4234 4.98126 3.90533 4.43036 6.01245 3.87552 5.53922 7.6463 8.29877 4.98129 +5.26025 2.76959 8.02182 5.53922 11.5217 5.26224 5.53922 8.02179 5.81616 4.4234 7.12823 4.98129 +6.27145 4.4234 4.4234 3.90533 4.98129 7.14816 2.76959 0 ]xsh +377.996 -59.146 mo +413.996 -59.146 li +@ +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +417.219 -60.541 mo +(,andthe) +[6.01242 4.98129 5.53922 8.76208 3.87555 5.53918 0 ]xsh +6.79616 -48.5859 mo +(maximumnumberofturningpointsis) +[8.29877 4.98129 5.26025 2.76961 8.0218 5.5392 11.6193 5.26225 5.5392 8.0218 5.81616 4.4234 +7.22586 4.98129 6.36908 3.87553 5.5392 3.90533 5.53918 2.76961 5.53919 8.30185 5.81613 4.98132 +2.76959 5.26224 3.87555 7.24576 2.76959 0 ]xsh +176.327 -47.191 mo +212.327 -47.191 li +@ +%ADOBeginSubsetFont: PBAAAA+CMR10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLO+CMR10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/D <1C60D8A8C9B08A9464DE8546F88D2A05AE66A80CFAB072F6DD7E68AFC04F +8CB1FADB5E26854F1AB31DBD2A5DF3CA3DD1B59308732B5F717D99BE176292FB +4B61473C545010195B72D8BD51A37A97972F71DA29D05B719122162A62E85384 +B5893DABEC3DD4C6F100837213E0F5892BD442264F7EBD017CA7B57BEF07B0D0 +16> |- +/k <1C60D8A8C9B08A95D222871B45C8170346D4B3692EE324314ECB68C750E8 +0C39C0E118E6175CCD69769E2118B02E8AEF864A1ADB8D0BF5A5FFDD4A9B9B6C +C867F43FFF5A7BBEB959851C5A4053DF1F3B8EBF64DEEC6B682D7055139D4103 +B0A63AD1D8193F253FA365D16CC3EC1AC7C7AEA533CCF6F8272FF6B8CD1FC7B4 +0DE006133FBB2B23E8E1776C461B4D8ABE09C8DE32B25BAD44EC36CACD378C29 +9496103B1CB809290EFAF69E7582E8754F6B25D7A0FD> |- +/w <1C60D8A8C9B08A9454CA4C75C5C9761F27DFD501BA4813FE991E533E1CD1 +E174DB2ECA59D495EC56B0C1FD43D089BD170DD220487C38F20C192FAA7E2E88 +3AD5437BC552CE37BD6C6BBA40409BE02939A8B895FF98709899D61A578F68A8 +22D6CFB7A000AD2B69212700685F8E729740E6656D3B8D43A0C52B18628B0EFF +5F05D1944E33A86827C6670A3438CE653DA430AB3E54D22481FDFA780C4812C2 +F3255AA0E07A5FC796A8653D62150A6CD8B7FE4B68F43CAA66CB6512EB54E359 +E67F4D5FAA2BB87B8812835557ADA47955DD5F> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLO+CMR10 /Encoding get +dup 68 /D put +dup 107 /k put +dup 119 /w put +pop +%ADOEndSubsetFont +/YNDRLO+CMR10*1 +[40{/.notdef}rp /parenleft /parenright /.notdef /plus /comma /hyphen /period +/slash /zero /one /two /three /four /five 2{/.notdef}rp +/eight /.notdef /colon 2{/.notdef}rp /equal 3{/.notdef}rp /A /.notdef +/C /D /.notdef /F /.notdef /H 4{/.notdef}rp /M +/N /.notdef /P 2{/.notdef}rp /S /T /U 11{/.notdef}rp +/a /b /c /d /e /f /g /h +/i /.notdef /k /l /m /n /o /p +/q /r /s /t /u /v /w /x +/y /z /endash 51{/.notdef}rp /fi 80{/.notdef}rp] +YNDRLO+CMR10 nf +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +215.649 -48.5859 mo +(.)sh +-45.0208 -21.6869 mo +(\()sh +%ADOBeginSubsetFont: HIBBAA+CMR9 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLP+CMR9 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/eight <1C60D8A8C9B08A95D419B460E02949711E7C08BD6D2FC80DA151FC7A +5CB0A7D077860651A04CAB51E65C4D8CE6C7FB979F91CA3CFEF3C5AEA866C506 +4B2F3765E86222B233E7295AE3C4637A5020E4EEA27A4F4CD3A6A95719E8AEDA +962724231D429ABD3467505C1522B617B0A402070F763A15B4B310D15C899EA3 +5A5B19AF01D3621043009733D9F84C91B9CA4510ED5F3602A79C98E04261D905 +959C30B56F21A71E01D9F42169A1B567DE6DD02CF4009B> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLP+CMR9 /Encoding get +dup 56 /eight put +pop +%ADOEndSubsetFont +/YNDRLP+CMR9*1 +[41{/.notdef}rp /parenright 10{/.notdef}rp /four /five 2{/.notdef}rp /eight 199{/.notdef}rp] +YNDRLP+CMR9 nf +YNDRLP+CMR9*1 [8.9664 0 0 -8.9664 0 0 ]msf +-41.1472 -21.6868 mo +(8)sh +YNDRLQ+CMR6*1 [5.9776 0 0 -5.9776 0 0 ]msf +-36.5394 -25.9939 mo +(pts) +[4.04142 2.87584 0 ]xsh +YNDRLP+CMR9*1 [8.9664 0 0 -8.9664 0 0 ]msf +-26.206 -21.6868 mo +(\))sh +%ADOBeginSubsetFont: GFNBAA+CMBX10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLR+CMBX10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/eight <1C60D8A8C9B7FCB6A4EC6CCC71FFBC41969F86A86636A65E5BD14FD4 +EBD93FCE205F86ECC615335CAFE8E2240019DB970894F9979E3FDF252D8A9472 +1B680E23D2DF204A99891D5AD0E347695938A6FCE4923A098978EC0AC2A3894C +8A94767FEBA61293F9C489BAC7A89726BFA765D56F2D198E99D500D81046ACE1 +5301FD9FB36D2F2E4EAA017CCF306EAEC8E157B40FDE6DC2FA713180A587E730 +6AD0870F441697503D> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLR+CMBX10 /Encoding get +dup 56 /eight put +pop +%ADOEndSubsetFont +/YNDRLR+CMBX10*1 +[46{/.notdef}rp /period 5{/.notdef}rp /four /five /six /seven /eight +40{/.notdef}rp /a 3{/.notdef}rp /e /f 5{/.notdef}rp /l /m +/.notdef /o 2{/.notdef}rp /r /.notdef /t /u /v +/.notdef /x 135{/.notdef}rp] +YNDRLR+CMBX10 nf +YNDRLR+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-5.93501 -21.6868 mo +(8.) +[5.72846 0 ]xsh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +6.7952 -21.6868 mo +(De\257ne) +[7.6115 4.42339 5.5392 5.53921 0 ]xsh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +37.4252 -21.6868 mo +(f)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +43.3749 -21.6868 mo +(\()sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +47.2493 -21.6868 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +52.943 -21.6868 mo +(\)=) +[6.64314 0 ]xsh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +70.1005 -21.6868 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +77.8495 -21.6868 mo +(2)sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +82.8308 -21.6868 mo +(x)sh +YNDRLT+CMR7*1 [6.9738 0 0 -6.9738 0 0 ]msf +88.5255 -25.8003 mo +(2)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +92.9949 -21.6868 mo +(\()sh +YNDRLS+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +96.8693 -21.6868 mo +(x)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +104.323 -21.6868 mo +(+1\).Makeagoodsketchofthegraphinthecoordinateplanebelow,takinginto) +[9.51129 4.98131 3.87552 7.12226 9.13577 4.98131 4.98328 7.51779 8.07568 4.98129 5.25827 5.25827 +8.63358 3.92523 4.98331 4.4234 3.87552 4.14642 8.63361 4.98129 6.14294 3.87552 5.53922 7.51779 +4.98129 3.9053 4.98132 5.53918 8.63361 2.76959 8.63358 3.87552 5.53922 7.51779 4.4234 5.25824 +4.98132 3.9053 5.53922 2.76959 5.53918 4.98132 3.87552 7.51779 5.53918 2.76959 4.98132 5.53918 +7.51782 5.81616 4.4234 2.76959 4.70435 7.19299 5.90881 3.87549 4.98132 5.26025 2.76959 5.53918 +8.07568 2.76965 5.26221 3.87555 0 ]xsh +6.79548 -9.73169 mo +(considerationtheend-behaviorofthepolynomial,anditsintercepts.) +[4.42339 4.9813 5.53921 3.92524 2.76959 5.53921 4.42339 3.90533 4.9813 3.87553 2.76959 4.98129 +8.85974 3.87553 5.5392 7.74393 4.4234 5.53922 5.53918 3.31747 5.81616 4.4234 5.5392 4.70435 +5.26025 2.76961 4.98129 7.22585 4.98131 6.36908 3.87553 5.5392 7.74393 5.81616 4.98132 2.76959 +5.26025 5.53918 4.98132 8.29877 2.76959 4.98129 2.76962 6.09012 4.98129 5.53922 8.85971 2.76962 +3.87552 7.24579 2.76959 5.26224 3.87552 4.4234 3.90533 4.4234 4.42337 5.53922 3.87552 3.92523 +0 ]xsh +254.471 93.712 mo +258.795 92.168 li +254.471 90.624 li +256.201 92.168 li +f +gsave +258.794 182.168 mo +6.7945 182.168 li +6.7945 2.168 li +258.794 2.168 li +cp +clp +.797 lw +6.79449 92.168 mo +256.2 92.168 li +@ +grestore +.399 lw +132.794 96.153 mo +132.794 88.183 li +@ +160.794 96.153 mo +160.794 88.183 li +@ +188.794 96.153 mo +188.794 88.183 li +@ +216.794 96.153 mo +216.794 88.183 li +@ +244.794 96.153 mo +244.794 88.183 li +@ +132.794 96.153 mo +132.794 88.183 li +@ +104.795 96.153 mo +104.795 88.183 li +@ +76.7945 96.153 mo +76.7945 88.183 li +@ +48.7945 96.153 mo +48.7945 88.183 li +@ +20.7945 96.153 mo +20.7945 88.183 li +@ +134.339 6.492 mo +132.795 2.16803 li +131.251 6.492 li +132.795 4.76303 li +f +.797 lw +132.794 182.168 mo +132.794 4.76199 li +@ +.399 lw +128.809 92.168 mo +136.779 92.168 li +@ +128.809 72.168 mo +136.779 72.168 li +@ +128.809 52.168 mo +136.779 52.168 li +@ +128.809 32.168 mo +136.779 32.168 li +@ +128.809 12.168 mo +136.779 12.168 li +@ +128.809 92.168 mo +136.779 92.168 li +@ +128.809 112.168 mo +136.779 112.168 li +@ +128.809 132.168 mo +136.779 132.168 li +@ +128.809 152.168 mo +136.779 152.168 li +@ +128.809 172.168 mo +136.779 172.168 li +@ +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +118.847 75.3784 mo +(1)sh +118.847 55.3785 mo +(2)sh +118.847 35.3786 mo +(3)sh +118.847 15.3787 mo +(4)sh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +111.098 114.963 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +118.847 114.963 mo +(1)sh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +111.098 134.963 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +118.847 134.963 mo +(2)sh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +111.098 154.963 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +118.847 154.963 mo +(3)sh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +111.098 174.963 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +118.847 174.963 mo +(4)sh +158.304 107.555 mo +(1234) +[27.9999 27.9999 27.9999 0 ]xsh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +98.4298 107.555 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +106.179 107.555 mo +(1)sh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +70.43 107.555 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +78.1789 107.555 mo +(2)sh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +42.4301 107.555 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +50.179 107.555 mo +(3)sh +YNDRLU+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +14.4302 107.555 mo +(\241)sh +YNDRLO+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +22.1791 107.555 mo +(4)sh +.797 lw +1 lc +[0 2 ] 1 dsh +true sadj +20.7945 173.168 mo +20.7945 11.168 li +48.7945 173.168 mo +48.7945 11.168 li +76.7945 173.168 mo +76.7945 11.168 li +104.794 173.168 mo +104.794 11.168 li +132.794 173.168 mo +132.794 11.168 li +160.794 173.168 mo +160.794 11.168 li +188.794 173.168 mo +188.794 11.168 li +216.794 173.168 mo +216.794 11.168 li +244.794 173.168 mo +244.794 11.168 li +@ +[0 2.8 ] 1.4 dsh +19.3945 172.168 mo +246.194 172.168 li +19.3945 152.168 mo +246.194 152.168 li +19.3945 132.168 mo +246.194 132.168 li +19.3945 112.168 mo +246.194 112.168 li +19.3945 92.168 mo +246.194 92.168 li +19.3945 72.168 mo +246.194 72.168 li +19.3945 52.168 mo +246.194 52.168 li +19.3945 32.168 mo +246.194 32.168 li +19.3945 12.168 mo +246.194 12.168 li +@ +%ADOBeginSubsetFont: GFNBAA+CMBX10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLR+CMBX10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/A <1C60D8A8C9B08A941DDBC3AF1C109AC61AF06DEF14497758E2577FC09808 +E2F83FED36FAC5C5DF9845F9151204EBE19A62A093C0C714296A8AEB5EA72983 +7304C560208E23A9B00E450B7895C64B840FF7B8D2624ED826E8D6D1CB5BC276 +3958AE415A241BD617EA928FD9818043D58C39BCDA5256A3F17DFF2FADD0CDFE +4A5999053732F0E5CE29974C519106> |- +/W <1C60D8A8C9B08A949EE89938EFD2B089915D4CA87E50351E8DD3F3914A85 +384965AB9720D1BDB02951199DD63BE938B296E11B8132C78ABED307E15E2C96 +04E0EEA5C8FB1D25F45078482232C4120E0C6D7ECC100B9CF59823239764E960 +AC203F05154297337EBEC8D426CABE71C6D1BABE3D2EE87EB4EC26DC5A175D2E +1776DC7CB846E1C76A588A844BC3111554540D100610F9152C35EB0670475763 +7F97762997D01BB6BF9BF94F9DBF981A5DB94B101F849599A265> |- +/k <1C60D8A8C9B08A95F1118A977C6242CC6F5E327BF4A2BCE6E631EAC27F33 +5285F637895192724CE2C53641A392411149B8A3F127ECD7DEB11923D35A35EC +238223B6B1C9CF9675A0C83B3A0C95C18823DF1B6F368BBFEEE7185E77AE9040 +378C34B27A11D9EE3C9721E2EAFF82B925C0F3ABE698646F0C4A57CEC100EA29 +86134B063D8450710541B66D42FC62B89A6AB4B6D6C05FC0E5F8EF9F1253768A +DA78BF283C77228ACE6FD83E9384> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLR+CMBX10 /Encoding get +dup 65 /A put +dup 87 /W put +dup 107 /k put +pop +%ADOEndSubsetFont +/YNDRLR+CMBX10*1 +[46{/.notdef}rp /period 5{/.notdef}rp /four /five /six /seven /eight +8{/.notdef}rp /A 21{/.notdef}rp /W 9{/.notdef}rp /a 3{/.notdef}rp /e +/f 4{/.notdef}rp /k /l /m /.notdef /o 2{/.notdef}rp +/r /.notdef /t /u /v /.notdef /x 135{/.notdef}rp] +YNDRLR+CMBX10 nf +YNDRLR+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +344.808 9.08679 mo +(WorkArea) +[10.8911 5.72845 4.72226 9.86591 8.65753 4.72226 5.25021 0 ]xsh +grestore +grestore +pgrs +%%PageTrailer +[ +[/CSA [/0 ]] +[/CSD [/0 ]] +] del_res +/YNDRLP+CMR9*1 uf +/YNDRLP+CMR9 uf +/HIBBAA+CMR9 uf +/YNDRLT+CMR7*1 uf +/YNDRLT+CMR7 uf +/UGXAAA+CMR7 uf +/YNDRLR+CMBX10*1 uf +/YNDRLR+CMBX10 uf +/GFNBAA+CMBX10 uf +/YNDRLU+CMSY10*1 uf +/YNDRLU+CMSY10 uf +/MZQAAA+CMSY10 uf +/YNDRLO+CMR10*1 uf +/YNDRLO+CMR10 uf +/PBAAAA+CMR10 uf +/YNDRLS+CMMI10*1 uf +/YNDRLS+CMMI10 uf +/HJCBAA+CMMI10 uf +/YNDRLQ+CMR6*1 uf +/YNDRLQ+CMR6 uf +/QJJAAA+CMR6 uf +Adobe_AGM_Image/pt gx +Adobe_CoolType_Core/pt get exec +Adobe_AGM_Core/restore_mysetup gx +Adobe_AGM_Core/pt gx +currentdict Adobe_AGM_Utils eq {end} if +%%Trailer +Adobe_AGM_Utils begin +[/EMC pdfmark_5 +currentdict Adobe_AGM_Utils eq {end} if +Adobe_AGM_Image/dt get exec +Adobe_CoolType_Core/dt get exec +Adobe_AGM_Core/dt get exec +%%Pages: 1 +%%DocumentNeededResources: +%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 +%%+ procset Adobe_CoolType_Utility_T42 1.0 0 +%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 +%%+ procset Adobe_CoolType_Core 2.31 0 +%%+ procset Adobe_AGM_Core 2.0 0 +%%+ procset Adobe_AGM_Utils 1.0 0 +%%DocumentNeededFeatures: +%%DocumentSuppliedFeatures: +%%DocumentCustomColors: +%%CMYKCustomColor: +%%RGBCustomColor: +%%EOF diff --git a/macros/latex/contrib/eqexam/examples/coorplane.pdf b/macros/latex/contrib/eqexam/examples/coorplane.pdf new file mode 100644 index 0000000000..391442d36e Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/coorplane.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/eqex_solnsonly.pdf b/macros/latex/contrib/eqexam/examples/eqex_solnsonly.pdf new file mode 100644 index 0000000000..76c35e35b9 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/eqex_solnsonly.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/eqex_solnsonly.tex b/macros/latex/contrib/eqexam/examples/eqex_solnsonly.tex new file mode 100644 index 0000000000..6f7974d9d2 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/eqex_solnsonly.tex @@ -0,0 +1,121 @@ +\documentclass{article} +\usepackage[fleqn]{amsmath} +%\usepackage[pointsonleft,nototals,forpaper,useforms,vspacewithsolns]{eqexam} +\usepackage[pointsonleft,nototals,forpaper,useforms,solutionsonly]{eqexam} + +\solAtEndFormatting{\eqequesitemsep{3pt}} + +\subject[MC]{My Course} +\title[T1]{Test 1} +\author{Dr.\ D. P. Story} +\date{\thisterm, \the\year} +\duedate{2012/04/28} +\keywords{My Course, Exam \nExam, {\thisterm} semester, \theduedate, at AcroTeX.Net} + +% +% Compile the file with the vspacewithsolns option to create the .sol auxiliary file +% that contains a listing of all the solutions, like so +% \usepackage[pointsonleft,nototals,forpaper,useforms,vspacewithsolns]{eqexam} +% then compile with the solutionsonly option, like so +% \usepackage[pointsonleft,nototals,forpaper,useforms,solutionsonly]{eqexam} +% +\encloseProblemsWith{theseproblems} + +\begin{document} + +\maketitle + +\begin{exam}{myProblems} + +\ifsolutionsonly +\begin{instructions}[Solutions.] +The solutions to Test~1. +\end{instructions} +\belowsqskip{\par} % removes the skip after the exam env +\else +\begin{instructions} +Solve each problem and box in your final $\boxed{\text{answer}}$. +\end{instructions} +\fi + +\begin{theseproblems} + +\begin{problem*}[3ea] +\leadinitem + It is well known that \fillin{1in}{Newton} and + \fillin{1in}{Leibniz} are jointly credited as the founders + of modern calculus. +\ifkeyalt +\begin{solution} + It is well known that \fillin{1in}{Newton} and + \fillin{1in}{Leibniz} are jointly credited as the founders + of modern calculus. +\end{solution} +\fi + +\begin{parts} +\item \TF{T} (True `T' or False `F') The area of a circle is $\pi r^2$. +\ifkeyalt +\begin{solution} +\item\TF{T} The area of a circle is $\pi r^2$. +\end{solution} +\fi + +\item Suppose the \emph{discriminant} of a quadratic equation is +\emph{negative}, which statement describes the roots to +the equation? +\begin{answers}{2} +\bChoices + \Ans0 There is only one real root\eAns + \Ans0 There are two distinct real roots\eAns + \Ans1 There are two complex roots\eAns + \Ans0 None of these\eAns +\eChoices +\end{answers} +\ifkeyalt +\begin{solution}[] +\parbox[t]{\linewidth}{\sqTabPos{t}% +\begin{answers}{2} +\bChoices + \Ans0 There is only one real root\eAns + \Ans0 There are two distinct real roots\eAns + \Ans1 There are two complex roots\eAns + \Ans0 None of these\eAns +\eChoices +\end{answers}}% +\adjDisplayBelow +\end{solution} +\fi +\end{parts} +\end{problem*} + +\begin{problem}[8] +In the space below, solve the quadratic equation +$ 2x^2 - 3x + 2 = 0 $ using any valid method. +\begin{solution}[1.5in] +We use the quadratic formula: +\begin{equation*} + x = \frac{3 \pm \sqrt{9-4\cdot2\cdot2}}{2\cdot2} + = \frac{3 \pm \sqrt{-7}}{4} + = \boxed{ \frac{3 \pm \sqrt{7}\,\imath}{4} } +\end{equation*} +\end{solution} +\end{problem} + +\begin{problem}[8] +Find the equation of the line perpendicular to $ 3x - 5y = 2 $ and passing +through the point $P(1,7)$. Leave your answer in the general form. +\[ + \text{Ans:\quad} + \fillin[boxed,boxsize=Large]{2in}{5x+3y=26} +\] +\begin{solution}[.5in]\ifkeyalt$ \text{Ans:\quad} + \fillin[boxed,boxsize=Large]{2in}{5x+3y=26}$\\[3pt]\fi +Apparently the given line has slope $m=3/5$, so $ m_{\perp}=-5/3$. The rest +is left to the reader. +\end{solution} +\end{problem} + +\end{theseproblems} +\end{exam} +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/fig1.bb b/macros/latex/contrib/eqexam/examples/fig1.bb new file mode 100644 index 0000000000..ac080e4eb1 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/fig1.bb @@ -0,0 +1,5 @@ +%%Title: ./fig1.jpg +%%Creator: ebb Version 0.5.2 +%%BoundingBox: 0 0 636 704 +%%CreationDate: Fri Feb 04 18:59:33 2005 + diff --git a/macros/latex/contrib/eqexam/examples/fig1.eps b/macros/latex/contrib/eqexam/examples/fig1.eps new file mode 100644 index 0000000000..9ea1b0cbc3 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/fig1.eps differ diff --git a/macros/latex/contrib/eqexam/examples/fig1.jpg b/macros/latex/contrib/eqexam/examples/fig1.jpg new file mode 100644 index 0000000000..27e8564dab Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/fig1.jpg differ diff --git a/macros/latex/contrib/eqexam/examples/fig1.pdf b/macros/latex/contrib/eqexam/examples/fig1.pdf new file mode 100644 index 0000000000..054fe38f56 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/fig1.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/flextended-opt.pdf b/macros/latex/contrib/eqexam/examples/flextended-opt.pdf new file mode 100644 index 0000000000..1a5f1cab68 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/flextended-opt.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/flextended-opt.tex b/macros/latex/contrib/eqexam/examples/flextended-opt.tex new file mode 100644 index 0000000000..23bf670aa4 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/flextended-opt.tex @@ -0,0 +1,106 @@ +\documentclass{article} +\usepackage[fleqn]{amsmath} +\usepackage[pdf,forcolorpaper,nopoints,useforms, +% Try compiling this file under one of these options: + nosolutions, +% answerkey, +% vspacewithsolns, + flextended +]{eqexam}[2018/01/12] + +\subject[Essay]{Extending Fill Lines} +\title[HW]{Essay HW} +\author{Dr.\ D. P. Story} +\date{Spring 2018} +\duedate{03/07/2018} +\keywords{Homework due \theduedate} + +\forceNoColor +\DoNotFitItIn +\useFillerLines +\vspacewithkeyOn +\turnflnosolnsOn +\turnflanskeyOn +\turnContAnnotOn +\setFillLinesFmt{fltype=line,numbers=left} + +\solAtEndFormatting{\eqequesitemsep{3pt}} + +\let\opt\texttt +\let\env\texttt + +% these commands pass their arguments to the priorworkarea and solution +% environments, respectively. +\priorworkareaCmds{\baselineskip\wlVspace\parindent\wlVspace} +\solutionafterExCmds{\baselineskip\wlVspace + \parindent\wlVspace} + +\begin{document} + +\maketitle + +\begin{exam}{fl1} + +\begin{instructions}[] +Respond to each problem, use your best effort. Turn in your essays by the end of the day. +\end{instructions} + +\flPageBreakMsg{\textbf{Problem~{\eqeCurrProb} continues on next page\strut}}% + +\begin{problem} +Expound on all you know on the subject. +\begin{priorworkarea} +When the \opt{flextended} option is not in force, these three lines are blank. However, in this example, +\opt{flextended} is active, and I can write to these lines. +\end{priorworkarea} +\begin{solution}[nLines=3] +Your guess is as good as mine. +\end{solution} +\end{problem} + +\setFillLinesFmt{fltype=grid,gridtype=line,numbers=right,topline,color=lightgray} + +\begin{problem} +Expound on all you know on the subject. +\begin{priorworkarea} +Essay area. +\end{priorworkarea} +\begin{solution}[42pt] +Your guess is as good as mine. +\end{solution} +\end{problem} + +\vspace{2.1in} +\smash{\makebox[\linewidth][c]{\parbox{.5\linewidth}{\bfseries\slshape + This space left blank so the next problem can break across the page.}}} +\vspace{2.1in} + +\begin{problem} +Expound on all you know on the subject. +\begin{priorworkarea} +When the \opt{flextended} option is not in force, these three lines are +blank. However, in this example, \opt{flextended} is active, and I can write +to these lines. + +The contents of the \env{priorworkarea} environment can also break across a +page boundary. We'll try to make it so.\vspace{2\baselineskip} + +Are we on the next page? I think yes. +\end{priorworkarea} +\begin{solution}[nLines=10] +Your guess is as good as mine. The content has the capability of breaking across pages. + +I've added more lines because this problem has a chance breaking across a page boundary. +Let's prattle on until we go to the next page.\vspace{\baselineskip} + +We'll jump down a couple of lines cause I don't have much to say. Gotta keep +going to get to the next page. If all works as it should, I'll see you one +the other side! Perfect! \vspace{3\baselineskip} + +\noindent +All in all, this is very cool.\enspace dps +\end{solution} +\end{problem} +\end{exam} + +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/graph.eps b/macros/latex/contrib/eqexam/examples/graph.eps new file mode 100644 index 0000000000..bf1e4599d6 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/graph.eps @@ -0,0 +1,9158 @@ +%!PS-Adobe-3.1 EPSF-3.0 +%ADO_DSC_Encoding: Windows Roman +%%Title: graph.pdf +%%Creator: Adobe Acrobat 10.0.1 +%%For: D. P. Story +%%CreationDate: 4/8/2011, 3:22:12 PM +%%BoundingBox: -1 0 257 195 +%%HiResBoundingBox: 0 0 256.7930 194.9510 +%%CropBox: 0 0 256.7930 194.9510 +%%LanguageLevel: 2 +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentNeededFeatures: (atend) +%%DocumentSuppliedFeatures: (atend) +%%DocumentData: Clean7Bit +%%Pages: (atend) +%%DocumentProcessColors: Black +%%DocumentCustomColors: (atend) +%%EndComments +%%BeginDefaults +%%ViewingOrientation: 1 0 0 1 +%%EndDefaults +%%BeginProlog +%%BeginResource: procset Adobe_AGM_Utils 1.0 0 +%%Version: 1.0 0 +%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{currentpacking true setpacking}if +userdict/Adobe_AGM_Utils 75 dict dup begin put +/bdf +{bind def}bind def +/nd{null def}bdf +/xdf +{exch def}bdf +/ldf +{load def}bdf +/ddf +{put}bdf +/xddf +{3 -1 roll put}bdf +/xpt +{exch put}bdf +/ndf +{ + exch dup where{ + pop pop pop + }{ + xdf + }ifelse +}def +/cdndf +{ + exch dup currentdict exch known{ + pop pop + }{ + exch def + }ifelse +}def +/gx +{get exec}bdf +/ps_level + /languagelevel where{ + pop systemdict/languagelevel gx + }{ + 1 + }ifelse +def +/level2 + ps_level 2 ge +def +/level3 + ps_level 3 ge +def +/ps_version + {version cvr}stopped{-1}if +def +/set_gvm +{currentglobal exch setglobal}bdf +/reset_gvm +{setglobal}bdf +/makereadonlyarray +{ + /packedarray where{pop packedarray + }{ + array astore readonly}ifelse +}bdf +/map_reserved_ink_name +{ + dup type/stringtype eq{ + dup/Red eq{ + pop(_Red_) + }{ + dup/Green eq{ + pop(_Green_) + }{ + dup/Blue eq{ + pop(_Blue_) + }{ + dup()cvn eq{ + pop(Process) + }if + }ifelse + }ifelse + }ifelse + }if +}bdf +/AGMUTIL_GSTATE 22 dict def +/get_gstate +{ + AGMUTIL_GSTATE begin + /AGMUTIL_GSTATE_clr_spc currentcolorspace def + /AGMUTIL_GSTATE_clr_indx 0 def + /AGMUTIL_GSTATE_clr_comps 12 array def + mark currentcolor counttomark + {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put + /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop + /AGMUTIL_GSTATE_fnt rootfont def + /AGMUTIL_GSTATE_lw currentlinewidth def + /AGMUTIL_GSTATE_lc currentlinecap def + /AGMUTIL_GSTATE_lj currentlinejoin def + /AGMUTIL_GSTATE_ml currentmiterlimit def + currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf + /AGMUTIL_GSTATE_sa currentstrokeadjust def + /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def + /AGMUTIL_GSTATE_op currentoverprint def + /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def + /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def + currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf + cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf + /AGMUTIL_GSTATE_ht currenthalftone def + /AGMUTIL_GSTATE_flt currentflat def + end +}def +/set_gstate +{ + AGMUTIL_GSTATE begin + AGMUTIL_GSTATE_clr_spc setcolorspace + AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get + /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor + AGMUTIL_GSTATE_fnt setfont + AGMUTIL_GSTATE_lw setlinewidth + AGMUTIL_GSTATE_lc setlinecap + AGMUTIL_GSTATE_lj setlinejoin + AGMUTIL_GSTATE_ml setmiterlimit + AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash + AGMUTIL_GSTATE_sa setstrokeadjust + AGMUTIL_GSTATE_clr_rnd setcolorrendering + AGMUTIL_GSTATE_op setoverprint + AGMUTIL_GSTATE_bg cvx setblackgeneration + AGMUTIL_GSTATE_ucr cvx setundercolorremoval + AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx + AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer + AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or + { + currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne + { + mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark + }if + }{ + AGMUTIL_GSTATE_ht sethalftone + }ifelse + AGMUTIL_GSTATE_flt setflat + end +}def +/get_gstate_and_matrix +{ + AGMUTIL_GSTATE begin + /AGMUTIL_GSTATE_ctm matrix currentmatrix def + end + get_gstate +}def +/set_gstate_and_matrix +{ + set_gstate + AGMUTIL_GSTATE begin + AGMUTIL_GSTATE_ctm setmatrix + end +}def +/AGMUTIL_str256 256 string def +/AGMUTIL_src256 256 string def +/AGMUTIL_dst64 64 string def +/AGMUTIL_srcLen nd +/AGMUTIL_ndx nd +/AGMUTIL_cpd nd +/capture_cpd{ + //Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf +}def +/thold_halftone +{ + level3 + {sethalftone currenthalftone} + { + dup/HalftoneType get 3 eq + { + sethalftone currenthalftone + }{ + begin + Width Height mul{ + Thresholds read{pop}if + }repeat + end + currenthalftone + }ifelse + }ifelse +}def +/rdcmntline +{ + currentfile AGMUTIL_str256 readline pop + (%)anchorsearch{pop}if +}bdf +/filter_cmyk +{ + dup type/filetype ne{ + exch()/SubFileDecode filter + }{ + exch pop + } + ifelse + [ + exch + { + AGMUTIL_src256 readstring pop + dup length/AGMUTIL_srcLen exch def + /AGMUTIL_ndx 0 def + AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ + 1 index exch get + AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put + /AGMUTIL_ndx AGMUTIL_ndx 1 add def + }for + pop + AGMUTIL_dst64 0 AGMUTIL_ndx getinterval + } + bind + /exec cvx + ]cvx +}bdf +/filter_indexed_devn +{ + cvi Names length mul names_index add Lookup exch get +}bdf +/filter_devn +{ + 4 dict begin + /srcStr xdf + /dstStr xdf + dup type/filetype ne{ + 0()/SubFileDecode filter + }if + [ + exch + [ + /devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx + currentdict/srcStr get/readstring cvx/pop cvx + /dup cvx/length cvx 0/gt cvx[ + Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx + names_index Names length currentdict/srcStr get length 1 sub{ + 1/index cvx/exch cvx/get cvx + currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx + Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx + }for + currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx + ]cvx/if cvx + /end cvx + ]cvx + bind + /exec cvx + ]cvx + end +}bdf +/AGMUTIL_imagefile nd +/read_image_file +{ + AGMUTIL_imagefile 0 setfileposition + 10 dict begin + /imageDict xdf + /imbufLen Width BitsPerComponent mul 7 add 8 idiv def + /imbufIdx 0 def + /origDataSource imageDict/DataSource get def + /origMultipleDataSources imageDict/MultipleDataSources get def + /origDecode imageDict/Decode get def + /dstDataStr imageDict/Width get colorSpaceElemCnt mul string def + imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse + { + /imbufCnt imageDict/DataSource get length def + /imbufs imbufCnt array def + 0 1 imbufCnt 1 sub{ + /imbufIdx xdf + imbufs imbufIdx imbufLen string put + imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put + }for + DeviceN_PS2{ + imageDict begin + /DataSource[DataSource/devn_sep_datasource cvx]cvx def + /MultipleDataSources false def + /Decode[0 1]def + end + }if + }{ + /imbuf imbufLen string def + Indexed_DeviceN level3 not and DeviceN_NoneName or{ + /srcDataStrs[imageDict begin + currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse + { + Width Decode length 2 div mul cvi string + }repeat + end]def + imageDict begin + /DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def + /Decode[0 1]def + end + }{ + imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put + imageDict/Decode[0 1]put + }ifelse + }ifelse + imageDict exch + load exec + imageDict/DataSource origDataSource put + imageDict/MultipleDataSources origMultipleDataSources put + imageDict/Decode origDecode put + end +}bdf +/write_image_file +{ + begin + {(AGMUTIL_imagefile)(w+)file}stopped{ + false + }{ + Adobe_AGM_Utils/AGMUTIL_imagefile xddf + 2 dict begin + /imbufLen Width BitsPerComponent mul 7 add 8 idiv def + MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{ + /imbuf imbufLen string def + }if + 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ + pop + MultipleDataSources{ + 0 1 DataSource length 1 sub{ + DataSource type dup + /arraytype eq{ + pop DataSource exch gx + }{ + /filetype eq{ + DataSource exch get imbuf readstring pop + }{ + DataSource exch get + }ifelse + }ifelse + AGMUTIL_imagefile exch writestring + }for + }{ + DataSource type dup + /arraytype eq{ + pop DataSource exec + }{ + /filetype eq{ + DataSource imbuf readstring pop + }{ + DataSource + }ifelse + }ifelse + AGMUTIL_imagefile exch writestring + }ifelse + }for + end + true + }ifelse + end +}bdf +/close_image_file +{ + AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile +}def +statusdict/product known userdict/AGMP_current_show known not and{ + /pstr statusdict/product get def + pstr(HP LaserJet 2200)eq + pstr(HP LaserJet 4000 Series)eq or + pstr(HP LaserJet 4050 Series )eq or + pstr(HP LaserJet 8000 Series)eq or + pstr(HP LaserJet 8100 Series)eq or + pstr(HP LaserJet 8150 Series)eq or + pstr(HP LaserJet 5000 Series)eq or + pstr(HP LaserJet 5100 Series)eq or + pstr(HP Color LaserJet 4500)eq or + pstr(HP Color LaserJet 4600)eq or + pstr(HP LaserJet 5Si)eq or + pstr(HP LaserJet 1200 Series)eq or + pstr(HP LaserJet 1300 Series)eq or + pstr(HP LaserJet 4100 Series)eq or + { + userdict/AGMP_current_show/show load put + userdict/show{ + currentcolorspace 0 get + /Pattern eq + {false charpath f} + {AGMP_current_show}ifelse + }put + }if + currentdict/pstr undef +}if +/consumeimagedata +{ + begin + AGMIMG_init_common + currentdict/MultipleDataSources known not + {/MultipleDataSources false def}if + MultipleDataSources + { + DataSource 0 get type + dup/filetype eq + { + 1 dict begin + /flushbuffer Width cvi string def + 1 1 Height cvi + { + pop + 0 1 DataSource length 1 sub + { + DataSource exch get + flushbuffer readstring pop pop + }for + }for + end + }if + dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and + { + Width Height mul cvi + { + 0 1 DataSource length 1 sub + {dup DataSource exch gx length exch 0 ne{pop}if}for + dup 0 eq + {pop exit}if + sub dup 0 le + {exit}if + }loop + pop + }if + } + { + /DataSource load type + dup/filetype eq + { + 1 dict begin + /flushbuffer Width Decode length 2 idiv mul cvi string def + 1 1 Height{pop DataSource flushbuffer readstring pop pop}for + end + }if + dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and + { + Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul + { + DataSource length dup 0 eq + {pop exit}if + sub dup 0 le + {exit}if + }loop + pop + }if + }ifelse + end +}bdf +/addprocs +{ + 2{/exec load}repeat + 3 1 roll + [5 1 roll]bind cvx +}def +/modify_halftone_xfer +{ + currenthalftone dup length dict copy begin + currentdict 2 index known{ + 1 index load dup length dict copy begin + currentdict/TransferFunction known{ + /TransferFunction load + }{ + currenttransfer + }ifelse + addprocs/TransferFunction xdf + currentdict end def + currentdict end sethalftone + }{ + currentdict/TransferFunction known{ + /TransferFunction load + }{ + currenttransfer + }ifelse + addprocs/TransferFunction xdf + currentdict end sethalftone + pop + }ifelse +}def +/clonearray +{ + dup xcheck exch + dup length array exch + Adobe_AGM_Core/AGMCORE_tmp -1 ddf + { + Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf + dup type/dicttype eq + { + Adobe_AGM_Core/AGMCORE_tmp get + exch + clonedict + Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf + }if + dup type/arraytype eq + { + Adobe_AGM_Core/AGMCORE_tmp get exch + clonearray + Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf + }if + exch dup + Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put + }forall + exch{cvx}if +}bdf +/clonedict +{ + dup length dict + begin + { + dup type/dicttype eq + {clonedict}if + dup type/arraytype eq + {clonearray}if + def + }forall + currentdict + end +}bdf +/DeviceN_PS2 +{ + /currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and +}bdf +/Indexed_DeviceN +{ + /indexed_colorspace_dict AGMCORE_gget dup null ne{ + dup/CSDBase known{ + /CSDBase get/CSD get_res/Names known + }{ + pop false + }ifelse + }{ + pop false + }ifelse +}bdf +/DeviceN_NoneName +{ + /Names where{ + pop + false Names + { + (None)eq or + }forall + }{ + false + }ifelse +}bdf +/DeviceN_PS2_inRip_seps +{ + /AGMCORE_in_rip_sep where + { + pop dup type dup/arraytype eq exch/packedarraytype eq or + { + dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and + { + /currentcolorspace exch AGMCORE_gput + false + }{ + true + }ifelse + }{ + true + }ifelse + }{ + true + }ifelse +}bdf +/base_colorspace_type +{ + dup type/arraytype eq{0 get}if +}bdf +/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse +{ + /pdfmark_5{cleartomark}bind def +}{ + /pdfmark_5{pdfmark}bind def +}ifelse +/ReadBypdfmark_5 +{ + currentfile exch 0 exch/SubFileDecode filter + /currentdistillerparams where + {pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse + {flushfile cleartomark} + {/PUT pdfmark}ifelse +}bdf +/ReadBypdfmark_5_string +{ + 2 dict begin + /makerString exch def string/tmpString exch def + { + currentfile tmpString readline not{pop exit}if + makerString anchorsearch + { + pop pop cleartomark exit + }{ + 3 copy/PUT pdfmark_5 pop 2 copy(\n)/PUT pdfmark_5 + }ifelse + }loop + end +}bdf +/xpdfm +{ + { + dup 0 get/Label eq + { + aload length[exch 1 add 1 roll/PAGELABEL + }{ + aload pop + [{ThisPage}<<5 -2 roll>>/PUT + }ifelse + pdfmark_5 + }forall +}bdf +/lmt{ + dup 2 index le{exch}if pop dup 2 index ge{exch}if pop +}bdf +/int{ + dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul exch pop add exch pop +}bdf +/ds{ + Adobe_AGM_Utils begin +}bdf +/dt{ + currentdict Adobe_AGM_Utils eq{ + end + }if +}bdf +systemdict/setpacking known +{setpacking}if +%%EndResource +%%BeginResource: procset Adobe_AGM_Core 2.0 0 +%%Version: 2.0 0 +%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{ + currentpacking + true setpacking +}if +userdict/Adobe_AGM_Core 209 dict dup begin put +/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def +/AGMCORE_str256 256 string def +/AGMCORE_save nd +/AGMCORE_graphicsave nd +/AGMCORE_c 0 def +/AGMCORE_m 0 def +/AGMCORE_y 0 def +/AGMCORE_k 0 def +/AGMCORE_cmykbuf 4 array def +/AGMCORE_screen[currentscreen]cvx def +/AGMCORE_tmp 0 def +/AGMCORE_&setgray nd +/AGMCORE_&setcolor nd +/AGMCORE_&setcolorspace nd +/AGMCORE_&setcmykcolor nd +/AGMCORE_cyan_plate nd +/AGMCORE_magenta_plate nd +/AGMCORE_yellow_plate nd +/AGMCORE_black_plate nd +/AGMCORE_plate_ndx nd +/AGMCORE_get_ink_data nd +/AGMCORE_is_cmyk_sep nd +/AGMCORE_host_sep nd +/AGMCORE_avoid_L2_sep_space nd +/AGMCORE_distilling nd +/AGMCORE_composite_job nd +/AGMCORE_producing_seps nd +/AGMCORE_ps_level -1 def +/AGMCORE_ps_version -1 def +/AGMCORE_environ_ok nd +/AGMCORE_CSD_cache 0 dict def +/AGMCORE_currentoverprint false def +/AGMCORE_deltaX nd +/AGMCORE_deltaY nd +/AGMCORE_name nd +/AGMCORE_sep_special nd +/AGMCORE_err_strings 4 dict def +/AGMCORE_cur_err nd +/AGMCORE_current_spot_alias false def +/AGMCORE_inverting false def +/AGMCORE_feature_dictCount nd +/AGMCORE_feature_opCount nd +/AGMCORE_feature_ctm nd +/AGMCORE_ConvertToProcess false def +/AGMCORE_Default_CTM matrix def +/AGMCORE_Default_PageSize nd +/AGMCORE_Default_flatness nd +/AGMCORE_currentbg nd +/AGMCORE_currentucr nd +/AGMCORE_pattern_paint_type 0 def +/knockout_unitsq nd +currentglobal true setglobal +[/CSA/Gradient/Procedure] +{ + /Generic/Category findresource dup length dict copy/Category defineresource pop +}forall +setglobal +/AGMCORE_key_known +{ + where{ + /Adobe_AGM_Core_Id known + }{ + false + }ifelse +}ndf +/flushinput +{ + save + 2 dict begin + /CompareBuffer 3 -1 roll def + /readbuffer 256 string def + mark + { + currentfile readbuffer{readline}stopped + {cleartomark mark} + { + not + {pop exit} + if + CompareBuffer eq + {exit} + if + }ifelse + }loop + cleartomark + end + restore +}bdf +/getspotfunction +{ + AGMCORE_screen exch pop exch pop + dup type/dicttype eq{ + dup/HalftoneType get 1 eq{ + /SpotFunction get + }{ + dup/HalftoneType get 2 eq{ + /GraySpotFunction get + }{ + pop + { + abs exch abs 2 copy add 1 gt{ + 1 sub dup mul exch 1 sub dup mul add 1 sub + }{ + dup mul exch dup mul add 1 exch sub + }ifelse + }bind + }ifelse + }ifelse + }if +}def +/np +{newpath}bdf +/clp_npth +{clip np}def +/eoclp_npth +{eoclip np}def +/npth_clp +{np clip}def +/graphic_setup +{ + /AGMCORE_graphicsave save store + concat + 0 setgray + 0 setlinecap + 0 setlinejoin + 1 setlinewidth + []0 setdash + 10 setmiterlimit + np + false setoverprint + false setstrokeadjust + //Adobe_AGM_Core/spot_alias gx + /Adobe_AGM_Image where{ + pop + Adobe_AGM_Image/spot_alias 2 copy known{ + gx + }{ + pop pop + }ifelse + }if + /sep_colorspace_dict null AGMCORE_gput + 100 dict begin + /dictstackcount countdictstack def + /showpage{}def + mark +}def +/graphic_cleanup +{ + cleartomark + dictstackcount 1 countdictstack 1 sub{end}for + end + AGMCORE_graphicsave restore +}def +/compose_error_msg +{ + grestoreall initgraphics + /Helvetica findfont 10 scalefont setfont + /AGMCORE_deltaY 100 def + /AGMCORE_deltaX 310 def + clippath pathbbox np pop pop 36 add exch 36 add exch moveto + 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto + 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath + 0 AGMCORE_&setgray + gsave 1 AGMCORE_&setgray fill grestore + 1 setlinewidth gsave stroke grestore + currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto + /AGMCORE_deltaY 12 def + /AGMCORE_tmp 0 def + AGMCORE_err_strings exch get + { + dup 32 eq + { + pop + AGMCORE_str256 0 AGMCORE_tmp getinterval + stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt + { + currentpoint AGMCORE_deltaY sub exch pop + clippath pathbbox pop pop pop 44 add exch moveto + }if + AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show + 0 1 AGMCORE_str256 length 1 sub + { + AGMCORE_str256 exch 0 put + }for + /AGMCORE_tmp 0 def + }{ + AGMCORE_str256 exch AGMCORE_tmp xpt + /AGMCORE_tmp AGMCORE_tmp 1 add def + }ifelse + }forall +}bdf +/AGMCORE_CMYKDeviceNColorspaces[ + [/Separation/None/DeviceCMYK{0 0 0}] + [/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind] + [/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind] + [/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind] + [/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind] + [/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind] + [/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind] + [/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind] + [/Separation(Cyan)/DeviceCMYK{0 0 0}] + [/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind] + [/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind] + [/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind] + [/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}] + [/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind] + [/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}] + [/DeviceCMYK] +]def +/ds{ + Adobe_AGM_Core begin + /currentdistillerparams where + { + pop currentdistillerparams/CoreDistVersion get 5000 lt + {<>setdistillerparams}if + }if + /AGMCORE_ps_version xdf + /AGMCORE_ps_level xdf + errordict/AGM_handleerror known not{ + errordict/AGM_handleerror errordict/handleerror get put + errordict/handleerror{ + Adobe_AGM_Core begin + $error/newerror get AGMCORE_cur_err null ne and{ + $error/newerror false put + AGMCORE_cur_err compose_error_msg + }if + $error/newerror true put + end + errordict/AGM_handleerror get exec + }bind put + }if + /AGMCORE_environ_ok + ps_level AGMCORE_ps_level ge + ps_version AGMCORE_ps_version ge and + AGMCORE_ps_level -1 eq or + def + AGMCORE_environ_ok not + {/AGMCORE_cur_err/AGMCORE_bad_environ def}if + /AGMCORE_&setgray systemdict/setgray get def + level2{ + /AGMCORE_&setcolor systemdict/setcolor get def + /AGMCORE_&setcolorspace systemdict/setcolorspace get def + }if + /AGMCORE_currentbg currentblackgeneration def + /AGMCORE_currentucr currentundercolorremoval def + /AGMCORE_Default_flatness currentflat def + /AGMCORE_distilling + /product where{ + pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and + }{ + false + }ifelse + def + /AGMCORE_GSTATE AGMCORE_key_known not{ + /AGMCORE_GSTATE 21 dict def + /AGMCORE_tmpmatrix matrix def + /AGMCORE_gstack 32 array def + /AGMCORE_gstackptr 0 def + /AGMCORE_gstacksaveptr 0 def + /AGMCORE_gstackframekeys 14 def + /AGMCORE_&gsave/gsave ldf + /AGMCORE_&grestore/grestore ldf + /AGMCORE_&grestoreall/grestoreall ldf + /AGMCORE_&save/save ldf + /AGMCORE_&setoverprint/setoverprint ldf + /AGMCORE_gdictcopy{ + begin + {def}forall + end + }def + /AGMCORE_gput{ + AGMCORE_gstack AGMCORE_gstackptr get + 3 1 roll + put + }def + /AGMCORE_gget{ + AGMCORE_gstack AGMCORE_gstackptr get + exch + get + }def + /gsave{ + AGMCORE_&gsave + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gstackptr 1 add + dup 32 ge{limitcheck}if + /AGMCORE_gstackptr exch store + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gdictcopy + }def + /grestore{ + AGMCORE_&grestore + AGMCORE_gstackptr 1 sub + dup AGMCORE_gstacksaveptr lt{1 add}if + dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known + {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse + /AGMCORE_gstackptr exch store + }def + /grestoreall{ + AGMCORE_&grestoreall + /AGMCORE_gstackptr AGMCORE_gstacksaveptr store + }def + /save{ + AGMCORE_&save + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gstackptr 1 add + dup 32 ge{limitcheck}if + /AGMCORE_gstackptr exch store + /AGMCORE_gstacksaveptr AGMCORE_gstackptr store + AGMCORE_gstack AGMCORE_gstackptr get + AGMCORE_gdictcopy + }def + /setoverprint{ + dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint + }def + 0 1 AGMCORE_gstack length 1 sub{ + AGMCORE_gstack exch AGMCORE_gstackframekeys dict put + }for + }if + level3/AGMCORE_&sysshfill AGMCORE_key_known not and + { + /AGMCORE_&sysshfill systemdict/shfill get def + /AGMCORE_&sysmakepattern systemdict/makepattern get def + /AGMCORE_&usrmakepattern/makepattern load def + }if + /currentcmykcolor[0 0 0 0]AGMCORE_gput + /currentstrokeadjust false AGMCORE_gput + /currentcolorspace[/DeviceGray]AGMCORE_gput + /sep_tint 0 AGMCORE_gput + /devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput + /sep_colorspace_dict null AGMCORE_gput + /devicen_colorspace_dict null AGMCORE_gput + /indexed_colorspace_dict null AGMCORE_gput + /currentcolor_intent()AGMCORE_gput + /customcolor_tint 1 AGMCORE_gput + /absolute_colorimetric_crd null AGMCORE_gput + /relative_colorimetric_crd null AGMCORE_gput + /saturation_crd null AGMCORE_gput + /perceptual_crd null AGMCORE_gput + currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf + cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf + << + /MaxPatternItem currentsystemparams/MaxPatternCache get + >> + setuserparams + end +}def +/ps +{ + /setcmykcolor where{ + pop + Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put + }if + Adobe_AGM_Core begin + /setcmykcolor + { + 4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput + 1 sub 4 1 roll + 3{ + 3 index add neg dup 0 lt{ + pop 0 + }if + 3 1 roll + }repeat + setrgbcolor pop + }ndf + /currentcmykcolor + { + /currentcmykcolor AGMCORE_gget aload pop + }ndf + /setoverprint + {pop}ndf + /currentoverprint + {false}ndf + /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def + /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def + /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def + /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def + /AGMCORE_plate_ndx + AGMCORE_cyan_plate{ + 0 + }{ + AGMCORE_magenta_plate{ + 1 + }{ + AGMCORE_yellow_plate{ + 2 + }{ + AGMCORE_black_plate{ + 3 + }{ + 4 + }ifelse + }ifelse + }ifelse + }ifelse + def + /AGMCORE_have_reported_unsupported_color_space false def + /AGMCORE_report_unsupported_color_space + { + AGMCORE_have_reported_unsupported_color_space false eq + { + (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)== + Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf + }if + }def + /AGMCORE_composite_job + AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def + /AGMCORE_in_rip_sep + /AGMCORE_in_rip_sep where{ + pop AGMCORE_in_rip_sep + }{ + AGMCORE_distilling + { + false + }{ + userdict/Adobe_AGM_OnHost_Seps known{ + false + }{ + level2{ + currentpagedevice/Separations 2 copy known{ + get + }{ + pop pop false + }ifelse + }{ + false + }ifelse + }ifelse + }ifelse + }ifelse + def + /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def + /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def + /AGM_preserve_spots + /AGM_preserve_spots where{ + pop AGM_preserve_spots + }{ + AGMCORE_distilling AGMCORE_producing_seps or + }ifelse + def + /AGM_is_distiller_preserving_spotimages + { + currentdistillerparams/PreserveOverprintSettings known + { + currentdistillerparams/PreserveOverprintSettings get + { + currentdistillerparams/ColorConversionStrategy known + { + currentdistillerparams/ColorConversionStrategy get + /sRGB ne + }{ + true + }ifelse + }{ + false + }ifelse + }{ + false + }ifelse + }def + /convert_spot_to_process where{pop}{ + /convert_spot_to_process + { + //Adobe_AGM_Core begin + dup map_alias{ + /Name get exch pop + }if + dup dup(None)eq exch(All)eq or + { + pop false + }{ + AGMCORE_host_sep + { + gsave + 1 0 0 0 setcmykcolor currentgray 1 exch sub + 0 1 0 0 setcmykcolor currentgray 1 exch sub + 0 0 1 0 setcmykcolor currentgray 1 exch sub + 0 0 0 1 setcmykcolor currentgray 1 exch sub + add add add 0 eq + { + pop false + }{ + false setoverprint + current_spot_alias false set_spot_alias + 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor + set_spot_alias + currentgray 1 ne + }ifelse + grestore + }{ + AGMCORE_distilling + { + pop AGM_is_distiller_preserving_spotimages not + }{ + //Adobe_AGM_Core/AGMCORE_name xddf + false + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq + AGMUTIL_cpd/OverrideSeparations known and + { + AGMUTIL_cpd/OverrideSeparations get + { + /HqnSpots/ProcSet resourcestatus + { + pop pop pop true + }if + }if + }if + { + AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not + }{ + gsave + [/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace + false + AGMUTIL_cpd/SeparationColorNames 2 copy known + { + get + {AGMCORE_name eq or}forall + not + }{ + pop pop pop true + }ifelse + grestore + }ifelse + }ifelse + }ifelse + }ifelse + end + }def + }ifelse + /convert_to_process where{pop}{ + /convert_to_process + { + dup length 0 eq + { + pop false + }{ + AGMCORE_host_sep + { + dup true exch + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + dup(Black)eq 3 -1 roll or + {pop} + {convert_spot_to_process and}ifelse + } + forall + { + true exch + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + (Black)eq or and + }forall + not + }{pop false}ifelse + }{ + false exch + { + /PhotoshopDuotoneList where{pop false}{true}ifelse + { + dup(Cyan)eq exch + dup(Magenta)eq 3 -1 roll or exch + dup(Yellow)eq 3 -1 roll or exch + dup(Black)eq 3 -1 roll or + {pop} + {convert_spot_to_process or}ifelse + } + { + convert_spot_to_process or + } + ifelse + } + forall + }ifelse + }ifelse + }def + }ifelse + /AGMCORE_avoid_L2_sep_space + version cvr 2012 lt + level2 and + AGMCORE_producing_seps not and + def + /AGMCORE_is_cmyk_sep + AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or + def + /AGM_avoid_0_cmyk where{ + pop AGM_avoid_0_cmyk + }{ + AGM_preserve_spots + userdict/Adobe_AGM_OnHost_Seps known + userdict/Adobe_AGM_InRip_Seps known or + not and + }ifelse + { + /setcmykcolor[ + { + 4 copy add add add 0 eq currentoverprint and{ + pop 0.0005 + }if + }/exec cvx + /AGMCORE_&setcmykcolor load dup type/operatortype ne{ + /exec cvx + }if + ]cvx def + }if + /AGMCORE_IsSeparationAProcessColor + { + dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or + }def + AGMCORE_host_sep{ + /setcolortransfer + { + AGMCORE_cyan_plate{ + pop pop pop + }{ + AGMCORE_magenta_plate{ + 4 3 roll pop pop pop + }{ + AGMCORE_yellow_plate{ + 4 2 roll pop pop pop + }{ + 4 1 roll pop pop pop + }ifelse + }ifelse + }ifelse + settransfer + } + def + /AGMCORE_get_ink_data + AGMCORE_cyan_plate{ + {pop pop pop} + }{ + AGMCORE_magenta_plate{ + {4 3 roll pop pop pop} + }{ + AGMCORE_yellow_plate{ + {4 2 roll pop pop pop} + }{ + {4 1 roll pop pop pop} + }ifelse + }ifelse + }ifelse + def + /AGMCORE_RemoveProcessColorNames + { + 1 dict begin + /filtername + { + dup/Cyan eq 1 index(Cyan)eq or + {pop(_cyan_)}if + dup/Magenta eq 1 index(Magenta)eq or + {pop(_magenta_)}if + dup/Yellow eq 1 index(Yellow)eq or + {pop(_yellow_)}if + dup/Black eq 1 index(Black)eq or + {pop(_black_)}if + }def + dup type/arraytype eq + {[exch{filtername}forall]} + {filtername}ifelse + end + }def + level3{ + /AGMCORE_IsCurrentColor + { + dup AGMCORE_IsSeparationAProcessColor + { + AGMCORE_plate_ndx 0 eq + {dup(Cyan)eq exch/Cyan eq or}if + AGMCORE_plate_ndx 1 eq + {dup(Magenta)eq exch/Magenta eq or}if + AGMCORE_plate_ndx 2 eq + {dup(Yellow)eq exch/Yellow eq or}if + AGMCORE_plate_ndx 3 eq + {dup(Black)eq exch/Black eq or}if + AGMCORE_plate_ndx 4 eq + {pop false}if + }{ + gsave + false setoverprint + current_spot_alias false set_spot_alias + 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor + set_spot_alias + currentgray 1 ne + grestore + }ifelse + }def + /AGMCORE_filter_functiondatasource + { + 5 dict begin + /data_in xdf + data_in type/stringtype eq + { + /ncomp xdf + /comp xdf + /string_out data_in length ncomp idiv string def + 0 ncomp data_in length 1 sub + { + string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put + }for + string_out + }{ + string/string_in xdf + /string_out 1 string def + /component xdf + [ + data_in string_in/readstring cvx + [component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx + [/pop cvx()]cvx/ifelse cvx + ]cvx/ReusableStreamDecode filter + }ifelse + end + }def + /AGMCORE_separateShadingFunction + { + 2 dict begin + /paint? xdf + /channel xdf + dup type/dicttype eq + { + begin + FunctionType 0 eq + { + /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def + currentdict/Decode known + {/Decode Decode channel 2 mul 2 getinterval def}if + paint? not + {/Decode[1 1]def}if + }if + FunctionType 2 eq + { + paint? + { + /C0[C0 channel get 1 exch sub]def + /C1[C1 channel get 1 exch sub]def + }{ + /C0[1]def + /C1[1]def + }ifelse + }if + FunctionType 3 eq + { + /Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def + }if + currentdict/Range known + {/Range[0 1]def}if + currentdict + end}{ + channel get 0 paint? AGMCORE_separateShadingFunction + }ifelse + end + }def + /AGMCORE_separateShading + { + 3 -1 roll begin + currentdict/Function known + { + currentdict/Background known + {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if + Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf + /ColorSpace[/DeviceGray]def + }{ + ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def + }{ + ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put + }ifelse + ColorSpace 0 get/Separation eq + { + { + [1/exch cvx/sub cvx]cvx + }{ + [/pop cvx 1]cvx + }ifelse + ColorSpace 3 3 -1 roll put + pop + }{ + { + [exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx + }{ + pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx + }ifelse + ColorSpace 3 3 -1 roll bind put + }ifelse + ColorSpace 2/DeviceGray put + }ifelse + end + }def + /AGMCORE_separateShadingDict + { + dup/ColorSpace get + dup type/arraytype ne + {[exch]}if + dup 0 get/DeviceCMYK eq + { + exch begin + currentdict + AGMCORE_cyan_plate + {0 true}if + AGMCORE_magenta_plate + {1 true}if + AGMCORE_yellow_plate + {2 true}if + AGMCORE_black_plate + {3 true}if + AGMCORE_plate_ndx 4 eq + {0 false}if + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + currentdict + end exch + }if + dup 0 get/Separation eq + { + exch begin + ColorSpace 1 get dup/None ne exch/All ne and + { + ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and + { + ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace + [ + /Separation + ColorSpace 1 get + /DeviceGray + [ + ColorSpace 3 get/exec cvx + 4 AGMCORE_plate_ndx sub -1/roll cvx + 4 1/roll cvx + 3[/pop cvx]cvx/repeat cvx + 1/exch cvx/sub cvx + ]cvx + ]def + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + currentdict 0 false AGMCORE_separateShading + }if + }ifelse + }{ + currentdict ColorSpace 1 get AGMCORE_IsCurrentColor + 0 exch + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + }ifelse + }if + currentdict + end exch + }if + dup 0 get/DeviceN eq + { + exch begin + ColorSpace 1 get convert_to_process + { + ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq + { + /ColorSpace + [ + /DeviceN + ColorSpace 1 get + /DeviceGray + [ + ColorSpace 3 get/exec cvx + 4 AGMCORE_plate_ndx sub -1/roll cvx + 4 1/roll cvx + 3[/pop cvx]cvx/repeat cvx + 1/exch cvx/sub cvx + ]cvx + ]def + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + currentdict 0 false AGMCORE_separateShading + /ColorSpace[/DeviceGray]def + }if + }ifelse + }{ + currentdict + false -1 ColorSpace 1 get + { + AGMCORE_IsCurrentColor + { + 1 add + exch pop true exch exit + }if + 1 add + }forall + exch + dup not currentoverprint and + {/AGMCORE_ignoreshade true def}if + AGMCORE_separateShading + }ifelse + currentdict + end exch + }if + dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not + { + exch begin + ColorSpace dup type/arraytype eq + {0 get}if + /DeviceGray ne + { + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate not + { + ColorSpace 0 get/CIEBasedA eq + { + /ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def + }if + ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or + { + /ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def + }if + ColorSpace 0 get/CIEBasedDEFG eq + { + /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def + }if + currentdict 0 false AGMCORE_separateShading + }if + }if + currentdict + end exch + }if + pop + dup/AGMCORE_ignoreshade known + { + begin + /ColorSpace[/Separation(None)/DeviceGray{}]def + currentdict end + }if + }def + /shfill + { + AGMCORE_separateShadingDict + dup/AGMCORE_ignoreshade known + {pop} + {AGMCORE_&sysshfill}ifelse + }def + /makepattern + { + exch + dup/PatternType get 2 eq + { + clonedict + begin + /Shading Shading AGMCORE_separateShadingDict def + Shading/AGMCORE_ignoreshade known + currentdict end exch + {pop<>}if + exch AGMCORE_&sysmakepattern + }{ + exch AGMCORE_&usrmakepattern + }ifelse + }def + }if + }if + AGMCORE_in_rip_sep{ + /setcustomcolor + { + exch aload pop + dup 7 1 roll inRip_spot_has_ink not { + 4{4 index mul 4 1 roll} + repeat + /DeviceCMYK setcolorspace + 6 -2 roll pop pop + }{ + //Adobe_AGM_Core begin + /AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf + end + [/Separation 4 -1 roll/DeviceCMYK + {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} + ] + setcolorspace + }ifelse + setcolor + }ndf + /setseparationgray + { + [/Separation(All)/DeviceGray{}]setcolorspace_opt + 1 exch sub setcolor + }ndf + }{ + /setseparationgray + { + AGMCORE_&setgray + }ndf + }ifelse + /findcmykcustomcolor + { + 5 makereadonlyarray + }ndf + /setcustomcolor + { + exch aload pop pop + 4{4 index mul 4 1 roll}repeat + setcmykcolor pop + }ndf + /has_color + /colorimage where{ + AGMCORE_producing_seps{ + pop true + }{ + systemdict eq + }ifelse + }{ + false + }ifelse + def + /map_index + { + 1 index mul exch getinterval{255 div}forall + }bdf + /map_indexed_devn + { + Lookup Names length 3 -1 roll cvi map_index + }bdf + /n_color_components + { + base_colorspace_type + dup/DeviceGray eq{ + pop 1 + }{ + /DeviceCMYK eq{ + 4 + }{ + 3 + }ifelse + }ifelse + }bdf + level2{ + /mo/moveto ldf + /li/lineto ldf + /cv/curveto ldf + /knockout_unitsq + { + 1 setgray + 0 0 1 1 rectfill + }def + level2/setcolorspace AGMCORE_key_known not and{ + /AGMCORE_&&&setcolorspace/setcolorspace ldf + /AGMCORE_ReplaceMappedColor + { + dup type dup/arraytype eq exch/packedarraytype eq or + { + /AGMCORE_SpotAliasAry2 where{ + begin + dup 0 get dup/Separation eq + { + pop + dup length array copy + dup dup 1 get + current_spot_alias + { + dup map_alias + { + false set_spot_alias + dup 1 exch setsepcolorspace + true set_spot_alias + begin + /sep_colorspace_dict currentdict AGMCORE_gput + pop pop pop + [ + /Separation Name + CSA map_csa + MappedCSA + /sep_colorspace_proc load + ] + dup Name + end + }if + }if + map_reserved_ink_name 1 xpt + }{ + /DeviceN eq + { + dup length array copy + dup dup 1 get[ + exch{ + current_spot_alias{ + dup map_alias{ + /Name get exch pop + }if + }if + map_reserved_ink_name + }forall + ]1 xpt + }if + }ifelse + end + }if + }if + }def + /setcolorspace + { + dup type dup/arraytype eq exch/packedarraytype eq or + { + dup 0 get/Indexed eq + { + AGMCORE_distilling + { + /PhotoshopDuotoneList where + { + pop false + }{ + true + }ifelse + }{ + true + }ifelse + { + aload pop 3 -1 roll + AGMCORE_ReplaceMappedColor + 3 1 roll 4 array astore + }if + }{ + AGMCORE_ReplaceMappedColor + }ifelse + }if + DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if + }def + }if + }{ + /adj + { + currentstrokeadjust{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform + }if + }def + /mo{ + adj moveto + }def + /li{ + adj lineto + }def + /cv{ + 6 2 roll adj + 6 2 roll adj + 6 2 roll adj curveto + }def + /knockout_unitsq + { + 1 setgray + 8 8 1[8 0 0 8 0 0]{}image + }def + /currentstrokeadjust{ + /currentstrokeadjust AGMCORE_gget + }def + /setstrokeadjust{ + /currentstrokeadjust exch AGMCORE_gput + }def + /setcolorspace + { + /currentcolorspace exch AGMCORE_gput + }def + /currentcolorspace + { + /currentcolorspace AGMCORE_gget + }def + /setcolor_devicecolor + { + base_colorspace_type + dup/DeviceGray eq{ + pop setgray + }{ + /DeviceCMYK eq{ + setcmykcolor + }{ + setrgbcolor + }ifelse + }ifelse + }def + /setcolor + { + currentcolorspace 0 get + dup/DeviceGray ne{ + dup/DeviceCMYK ne{ + dup/DeviceRGB ne{ + dup/Separation eq{ + pop + currentcolorspace 3 gx + currentcolorspace 2 get + }{ + dup/Indexed eq{ + pop + currentcolorspace 3 get dup type/stringtype eq{ + currentcolorspace 1 get n_color_components + 3 -1 roll map_index + }{ + exec + }ifelse + currentcolorspace 1 get + }{ + /AGMCORE_cur_err/AGMCORE_invalid_color_space def + AGMCORE_invalid_color_space + }ifelse + }ifelse + }if + }if + }if + setcolor_devicecolor + }def + }ifelse + /sop/setoverprint ldf + /lw/setlinewidth ldf + /lc/setlinecap ldf + /lj/setlinejoin ldf + /ml/setmiterlimit ldf + /dsh/setdash ldf + /sadj/setstrokeadjust ldf + /gry/setgray ldf + /rgb/setrgbcolor ldf + /cmyk[ + /currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx + /setcmykcolor load dup type/operatortype ne{/exec cvx}if + ]cvx bdf + level3 AGMCORE_host_sep not and{ + /nzopmsc{ + 6 dict begin + /kk exch def + /yy exch def + /mm exch def + /cc exch def + /sum 0 def + cc 0 ne{/sum sum 2#1000 or def cc}if + mm 0 ne{/sum sum 2#0100 or def mm}if + yy 0 ne{/sum sum 2#0010 or def yy}if + kk 0 ne{/sum sum 2#0001 or def kk}if + AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace + sum 0 eq{0}if + end + setcolor + }bdf + }{ + /nzopmsc/cmyk ldf + }ifelse + /sep/setsepcolor ldf + /devn/setdevicencolor ldf + /idx/setindexedcolor ldf + /colr/setcolor ldf + /csacrd/set_csa_crd ldf + /sepcs/setsepcolorspace ldf + /devncs/setdevicencolorspace ldf + /idxcs/setindexedcolorspace ldf + /cp/closepath ldf + /clp/clp_npth ldf + /eclp/eoclp_npth ldf + /f/fill ldf + /ef/eofill ldf + /@/stroke ldf + /nclp/npth_clp ldf + /gset/graphic_setup ldf + /gcln/graphic_cleanup ldf + /ct/concat ldf + /cf/currentfile ldf + /fl/filter ldf + /rs/readstring ldf + /AGMCORE_def_ht currenthalftone def + /clonedict Adobe_AGM_Utils begin/clonedict load end def + /clonearray Adobe_AGM_Utils begin/clonearray load end def + currentdict{ + dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ + bind + }if + def + }forall + /getrampcolor + { + /indx exch def + 0 1 NumComp 1 sub + { + dup + Samples exch get + dup type/stringtype eq{indx get}if + exch + Scaling exch get aload pop + 3 1 roll + mul add + }for + ColorSpaceFamily/Separation eq + {sep} + { + ColorSpaceFamily/DeviceN eq + {devn}{setcolor}ifelse + }ifelse + }bdf + /sssetbackground{ + aload pop + ColorSpaceFamily/Separation eq + {sep} + { + ColorSpaceFamily/DeviceN eq + {devn}{setcolor}ifelse + }ifelse + }bdf + /RadialShade + { + 40 dict begin + /ColorSpaceFamily xdf + /background xdf + /ext1 xdf + /ext0 xdf + /BBox xdf + /r2 xdf + /c2y xdf + /c2x xdf + /r1 xdf + /c1y xdf + /c1x xdf + /rampdict xdf + /setinkoverprint where{pop/setinkoverprint{pop}def}if + gsave + BBox length 0 gt + { + np + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + np + }if + c1x c2x eq + { + c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse + }{ + /slope c2y c1y sub c2x c1x sub div def + /theta slope 1 atan def + c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if + c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if + }ifelse + gsave + clippath + c1x c1y translate + theta rotate + -90 rotate + {pathbbox}stopped + {0 0 0 0}if + /yMax xdf + /xMax xdf + /yMin xdf + /xMin xdf + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + }{ + /max{2 copy gt{pop}{exch pop}ifelse}bdf + /min{2 copy lt{pop}{exch pop}ifelse}bdf + rampdict begin + 40 dict begin + background length 0 gt{background sssetbackground gsave clippath fill grestore}if + gsave + c1x c1y translate + theta rotate + -90 rotate + /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def + /c1y 0 def + /c1x 0 def + /c2x 0 def + ext0 + { + 0 getrampcolor + c2y r2 add r1 sub 0.0001 lt + { + c1x c1y r1 360 0 arcn + pathbbox + /aymax exch def + /axmax exch def + /aymin exch def + /axmin exch def + /bxMin xMin axmin min def + /byMin yMin aymin min def + /bxMax xMax axmax max def + /byMax yMax aymax max def + bxMin byMin moveto + bxMax byMin lineto + bxMax byMax lineto + bxMin byMax lineto + bxMin byMin lineto + eofill + }{ + c2y r1 add r2 le + { + c1x c1y r1 0 360 arc + fill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r1 neg def + /p1y c1y def + /p2x r1 def + /p2y c1y def + p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto + fill + }{ + /AA r2 r1 sub c2y div def + AA -1 eq + {/theta 89.99 def} + {/theta AA 1 AA dup mul sub sqrt div 1 atan def} + ifelse + /SS1 90 theta add dup sin exch cos div def + /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y p1x SS1 div neg def + /SS2 90 theta sub dup sin exch cos div def + /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y p2x SS2 div neg def + r1 r2 gt + { + /L1maxX p1x yMin p1y sub SS1 div add def + /L2maxX p2x yMin p2y sub SS2 div add def + }{ + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + }ifelse + }ifelse + }ifelse + }if + c1x c2x sub dup mul + c1y c2y sub dup mul + add 0.5 exp + 0 dtransform + dup mul exch dup mul add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt{exch}if pop + /hires xdf + hires mul + /numpix xdf + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + }if + }if + /xInc c2x c1x sub numsteps div def + /yInc c2y c1y sub numsteps div def + /rInc r2 r1 sub numsteps div def + /cx c1x def + /cy c1y def + /radius r1 def + np + xInc 0 eq yInc 0 eq rInc 0 eq and and + { + 0 getrampcolor + cx cy radius 0 360 arc + stroke + NumSamples 1 sub getrampcolor + cx cy radius 72 hires div add 0 360 arc + 0 setlinewidth + stroke + }{ + 0 + numsteps + { + dup + subsampling{round cvi}if + getrampcolor + cx cy radius 0 360 arc + /cx cx xInc add def + /cy cy yInc add def + /radius radius rInc add def + cx cy radius 360 0 arcn + eofill + rampIndxInc add + }repeat + pop + }ifelse + ext1 + { + c2y r2 add r1 lt + { + c2x c2y r2 0 360 arc + fill + }{ + c2y r1 add r2 sub 0.0001 le + { + c2x c2y r2 360 0 arcn + pathbbox + /aymax exch def + /axmax exch def + /aymin exch def + /axmin exch def + /bxMin xMin axmin min def + /byMin yMin aymin min def + /bxMax xMax axmax max def + /byMax yMax aymax max def + bxMin byMin moveto + bxMax byMin lineto + bxMax byMax lineto + bxMin byMax lineto + bxMin byMin lineto + eofill + }{ + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r2 neg def + /p1y c2y def + /p2x r2 def + /p2y c2y def + p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto + fill + }{ + /AA r2 r1 sub c2y div def + AA -1 eq + {/theta 89.99 def} + {/theta AA 1 AA dup mul sub sqrt div 1 atan def} + ifelse + /SS1 90 theta add dup sin exch cos div def + /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y c2y p1x SS1 div sub def + /SS2 90 theta sub dup sin exch cos div def + /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y c2y p2x SS2 div sub def + r1 r2 lt + { + /L1maxX p1x yMax p1y sub SS1 div add def + /L2maxX p2x yMax p2y sub SS2 div add def + }{ + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + }ifelse + }ifelse + }ifelse + }if + grestore + grestore + end + end + end + }ifelse + }bdf + /GenStrips + { + 40 dict begin + /ColorSpaceFamily xdf + /background xdf + /ext1 xdf + /ext0 xdf + /BBox xdf + /y2 xdf + /x2 xdf + /y1 xdf + /x1 xdf + /rampdict xdf + /setinkoverprint where{pop/setinkoverprint{pop}def}if + gsave + BBox length 0 gt + { + np + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + np + }if + x1 x2 eq + { + y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse + }{ + /slope y2 y1 sub x2 x1 sub div def + /theta slope 1 atan def + x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if + x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if + } + ifelse + gsave + clippath + x1 y1 translate + theta rotate + {pathbbox}stopped + {0 0 0 0}if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + }{ + rampdict begin + 20 dict begin + background length 0 gt{background sssetbackground gsave clippath fill grestore}if + gsave + x1 y1 translate + theta rotate + /xStart 0 def + /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def + /ySpan yMax yMin sub def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + xStart 0 transform + xEnd 0 transform + 3 -1 roll + sub dup mul + 3 1 roll + sub dup mul + add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt{exch}if pop + mul + /numpix xdf + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + }if + }if + ext0 + { + 0 getrampcolor + xMin xStart lt + { + xMin yMin xMin neg ySpan rectfill + }if + }if + /xInc xEnd xStart sub numsteps div def + /x xStart def + 0 + numsteps + { + dup + subsampling{round cvi}if + getrampcolor + x yMin xInc ySpan rectfill + /x x xInc add def + rampIndxInc add + }repeat + pop + ext1{ + xMax xEnd gt + { + xEnd yMin xMax xEnd sub ySpan rectfill + }if + }if + grestore + grestore + end + end + end + }ifelse + }bdf +}def +/pt +{ + end +}def +/dt{ +}def +/pgsv{ + //Adobe_AGM_Core/AGMCORE_save save put +}def +/pgrs{ + //Adobe_AGM_Core/AGMCORE_save get restore +}def +systemdict/findcolorrendering known{ + /findcolorrendering systemdict/findcolorrendering get def +}if +systemdict/setcolorrendering known{ + /setcolorrendering systemdict/setcolorrendering get def +}if +/test_cmyk_color_plate +{ + gsave + setcmykcolor currentgray 1 ne + grestore +}def +/inRip_spot_has_ink +{ + dup//Adobe_AGM_Core/AGMCORE_name xddf + convert_spot_to_process not +}def +/map255_to_range +{ + 1 index sub + 3 -1 roll 255 div mul add +}def +/set_csa_crd +{ + /sep_colorspace_dict null AGMCORE_gput + begin + CSA get_csa_by_name setcolorspace_opt + set_crd + end +} +def +/map_csa +{ + currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse + {pop}{get_csa_by_name/MappedCSA xdf}ifelse +}def +/setsepcolor +{ + /sep_colorspace_dict AGMCORE_gget begin + dup/sep_tint exch AGMCORE_gput + TintProc + end +}def +/setdevicencolor +{ + /devicen_colorspace_dict AGMCORE_gget begin + Names length copy + Names length 1 sub -1 0 + { + /devicen_tints AGMCORE_gget 3 1 roll xpt + }for + TintProc + end +}def +/sep_colorspace_proc +{ + /AGMCORE_tmp exch store + /sep_colorspace_dict AGMCORE_gget begin + currentdict/Components known{ + Components aload pop + TintMethod/Lab eq{ + 2{AGMCORE_tmp mul NComponents 1 roll}repeat + LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll + }{ + TintMethod/Subtractive eq{ + NComponents{ + AGMCORE_tmp mul NComponents 1 roll + }repeat + }{ + NComponents{ + 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll + }repeat + }ifelse + }ifelse + }{ + ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get + aload pop + }ifelse + end +}def +/sep_colorspace_gray_proc +{ + /AGMCORE_tmp exch store + /sep_colorspace_dict AGMCORE_gget begin + GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get + end +}def +/sep_proc_name +{ + dup 0 get + dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{ + pop[/DeviceGray] + /sep_colorspace_gray_proc + }{ + /sep_colorspace_proc + }ifelse +}def +/setsepcolorspace +{ + current_spot_alias{ + dup begin + Name map_alias{ + exch pop + }if + end + }if + dup/sep_colorspace_dict exch AGMCORE_gput + begin + CSA map_csa + /AGMCORE_sep_special Name dup()eq exch(All)eq or store + AGMCORE_avoid_L2_sep_space{ + [/Indexed MappedCSA sep_proc_name 255 exch + {255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx + ]setcolorspace_opt + /TintProc{ + 255 mul round cvi setcolor + }bdf + }{ + MappedCSA 0 get/DeviceCMYK eq + currentdict/Components known and + AGMCORE_sep_special not and{ + /TintProc[ + Components aload pop Name findcmykcustomcolor + /exch cvx/setcustomcolor cvx + ]cvx bdf + }{ + AGMCORE_host_sep Name(All)eq and{ + /TintProc{ + 1 exch sub setseparationgray + }bdf + }{ + AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and + AGMCORE_host_sep or + Name()eq and{ + /TintProc[ + MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{ + cvx/setcmykcolor cvx + }{ + cvx/setgray cvx + }ifelse + ]cvx bdf + }{ + AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{ + /TintProc[ + /dup cvx + MappedCSA sep_proc_name cvx exch + 0 get/DeviceGray eq{ + 1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx + }if + /Name cvx/findcmykcustomcolor cvx/exch cvx + AGMCORE_host_sep{ + AGMCORE_is_cmyk_sep + /Name cvx + /AGMCORE_IsSeparationAProcessColor load/exec cvx + /not cvx/and cvx + }{ + Name inRip_spot_has_ink not + }ifelse + [ + /pop cvx 1 + ]cvx/if cvx + /setcustomcolor cvx + ]cvx bdf + }{ + /TintProc{setcolor}bdf + [/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt + }ifelse + }ifelse + }ifelse + }ifelse + }ifelse + set_crd + setsepcolor + end +}def +/additive_blend +{ + 3 dict begin + /numarrays xdf + /numcolors xdf + 0 1 numcolors 1 sub + { + /c1 xdf + 1 + 0 1 numarrays 1 sub + { + 1 exch add/index cvx + c1/get cvx/mul cvx + }for + numarrays 1 add 1/roll cvx + }for + numarrays[/pop cvx]cvx/repeat cvx + end +}def +/subtractive_blend +{ + 3 dict begin + /numarrays xdf + /numcolors xdf + 0 1 numcolors 1 sub + { + /c1 xdf + 1 1 + 0 1 numarrays 1 sub + { + 1 3 3 -1 roll add/index cvx + c1/get cvx/sub cvx/mul cvx + }for + /sub cvx + numarrays 1 add 1/roll cvx + }for + numarrays[/pop cvx]cvx/repeat cvx + end +}def +/exec_tint_transform +{ + /TintProc[ + /TintTransform cvx/setcolor cvx + ]cvx bdf + MappedCSA setcolorspace_opt +}bdf +/devn_makecustomcolor +{ + 2 dict begin + /names_index xdf + /Names xdf + 1 1 1 1 Names names_index get findcmykcustomcolor + /devicen_tints AGMCORE_gget names_index get setcustomcolor + Names length{pop}repeat + end +}bdf +/setdevicencolorspace +{ + dup/AliasedColorants known{false}{true}ifelse + current_spot_alias and{ + 7 dict begin + /names_index 0 def + dup/names_len exch/Names get length def + /new_names names_len array def + /new_LookupTables names_len array def + /alias_cnt 0 def + dup/Names get + { + dup map_alias{ + exch pop + dup/ColorLookup known{ + dup begin + new_LookupTables names_index ColorLookup put + end + }{ + dup/Components known{ + dup begin + new_LookupTables names_index Components put + end + }{ + dup begin + new_LookupTables names_index[null null null null]put + end + }ifelse + }ifelse + new_names names_index 3 -1 roll/Name get put + /alias_cnt alias_cnt 1 add def + }{ + /name xdf + new_names names_index name put + dup/LookupTables known{ + dup begin + new_LookupTables names_index LookupTables names_index get put + end + }{ + dup begin + new_LookupTables names_index[null null null null]put + end + }ifelse + }ifelse + /names_index names_index 1 add def + }forall + alias_cnt 0 gt{ + /AliasedColorants true def + /lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def + 0 1 names_len 1 sub{ + /names_index xdf + new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{ + /AliasedColorants false def + exit + }{ + new_LookupTables names_index get 0 get null eq{ + dup/Names get names_index get/name xdf + name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq + or or or not{ + /AliasedColorants false def + exit + }if + }if + }ifelse + }for + lut_entry_len 1 eq{ + /AliasedColorants false def + }if + AliasedColorants{ + dup begin + /Names new_names def + /LookupTables new_LookupTables def + /AliasedColorants true def + /NComponents lut_entry_len def + /TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def + /MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def + currentdict/TTTablesIdx known not{ + /TTTablesIdx -1 def + }if + end + }if + }if + end + }if + dup/devicen_colorspace_dict exch AGMCORE_gput + begin + currentdict/AliasedColorants known{ + AliasedColorants + }{ + false + }ifelse + dup not{ + CSA map_csa + }if + /TintTransform load type/nulltype eq or{ + /TintTransform[ + 0 1 Names length 1 sub + { + /TTTablesIdx TTTablesIdx 1 add def + dup LookupTables exch get dup 0 get null eq + { + 1 index + Names exch get + dup(Cyan)eq + { + pop exch + LookupTables length exch sub + /index cvx + 0 0 0 + } + { + dup(Magenta)eq + { + pop exch + LookupTables length exch sub + /index cvx + 0/exch cvx 0 0 + }{ + (Yellow)eq + { + exch + LookupTables length exch sub + /index cvx + 0 0 3 -1/roll cvx 0 + }{ + exch + LookupTables length exch sub + /index cvx + 0 0 0 4 -1/roll cvx + }ifelse + }ifelse + }ifelse + 5 -1/roll cvx/astore cvx + }{ + dup length 1 sub + LookupTables length 4 -1 roll sub 1 add + /index cvx/mul cvx/round cvx/cvi cvx/get cvx + }ifelse + Names length TTTablesIdx add 1 add 1/roll cvx + }for + Names length[/pop cvx]cvx/repeat cvx + NComponents Names length + TintMethod/Subtractive eq + { + subtractive_blend + }{ + additive_blend + }ifelse + ]cvx bdf + }if + AGMCORE_host_sep{ + Names convert_to_process{ + exec_tint_transform + } + { + currentdict/AliasedColorants known{ + AliasedColorants not + }{ + false + }ifelse + 5 dict begin + /AvoidAliasedColorants xdf + /painted? false def + /names_index 0 def + /names_len Names length def + AvoidAliasedColorants{ + /currentspotalias current_spot_alias def + false set_spot_alias + }if + Names{ + AGMCORE_is_cmyk_sep{ + dup(Cyan)eq AGMCORE_cyan_plate and exch + dup(Magenta)eq AGMCORE_magenta_plate and exch + dup(Yellow)eq AGMCORE_yellow_plate and exch + (Black)eq AGMCORE_black_plate and or or or{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + Names names_index/devn_makecustomcolor cvx + ]cvx ddf + /painted? true def + }if + painted?{exit}if + }{ + 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + Names names_index/devn_makecustomcolor cvx + ]cvx ddf + /painted? true def + exit + }if + }ifelse + /names_index names_index 1 add def + }forall + AvoidAliasedColorants{ + currentspotalias set_spot_alias + }if + painted?{ + /devicen_colorspace_dict AGMCORE_gget/names_index names_index put + }{ + /devicen_colorspace_dict AGMCORE_gget/TintProc[ + names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx + 0 0 0 0/setcmykcolor cvx + ]cvx ddf + }ifelse + end + }ifelse + } + { + AGMCORE_in_rip_sep{ + Names convert_to_process not + }{ + level3 + }ifelse + { + [/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt + /TintProc level3 not AGMCORE_in_rip_sep and{ + [ + Names/length cvx[/pop cvx]cvx/repeat cvx + ]cvx bdf + }{ + {setcolor}bdf + }ifelse + }{ + exec_tint_transform + }ifelse + }ifelse + set_crd + /AliasedColorants false def + end +}def +/setindexedcolorspace +{ + dup/indexed_colorspace_dict exch AGMCORE_gput + begin + currentdict/CSDBase known{ + CSDBase/CSD get_res begin + currentdict/Names known{ + currentdict devncs + }{ + 1 currentdict sepcs + }ifelse + AGMCORE_host_sep{ + 4 dict begin + /compCnt/Names where{pop Names length}{1}ifelse def + /NewLookup HiVal 1 add string def + 0 1 HiVal{ + /tableIndex xdf + Lookup dup type/stringtype eq{ + compCnt tableIndex map_index + }{ + exec + }ifelse + /Names where{ + pop setdevicencolor + }{ + setsepcolor + }ifelse + currentgray + tableIndex exch + 255 mul cvi + NewLookup 3 1 roll put + }for + [/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt + end + }{ + level3 + { + currentdict/Names known{ + [/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt + }{ + [/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt + }ifelse + }{ + [/Indexed MappedCSA HiVal + [ + currentdict/Names known{ + Lookup dup type/stringtype eq + {/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx} + {/exec cvx}ifelse + /TintTransform load/exec cvx + }{ + Lookup dup type/stringtype eq + {/exch cvx/get cvx 255/div cvx} + {/exec cvx}ifelse + CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx + }ifelse + ]cvx + ]setcolorspace_opt + }ifelse + }ifelse + end + set_crd + } + { + CSA map_csa + AGMCORE_host_sep level2 not and{ + 0 0 0 0 setcmykcolor + }{ + [/Indexed MappedCSA + level2 not has_color not and{ + dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{ + pop[/DeviceGray] + }if + HiVal GrayLookup + }{ + HiVal + currentdict/RangeArray known{ + { + /indexed_colorspace_dict AGMCORE_gget begin + Lookup exch + dup HiVal gt{ + pop HiVal + }if + NComponents mul NComponents getinterval{}forall + NComponents 1 sub -1 0{ + RangeArray exch 2 mul 2 getinterval aload pop map255_to_range + NComponents 1 roll + }for + end + }bind + }{ + Lookup + }ifelse + }ifelse + ]setcolorspace_opt + set_crd + }ifelse + }ifelse + end +}def +/setindexedcolor +{ + AGMCORE_host_sep{ + /indexed_colorspace_dict AGMCORE_gget + begin + currentdict/CSDBase known{ + CSDBase/CSD get_res begin + currentdict/Names known{ + map_indexed_devn + devn + } + { + Lookup 1 3 -1 roll map_index + sep + }ifelse + end + }{ + Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll + map_index + MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse + }ifelse + end + }{ + level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{ + /indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin + map_indexed_devn + devn + end + } + { + setcolor + }ifelse + }ifelse +}def +/ignoreimagedata +{ + currentoverprint not{ + gsave + dup clonedict begin + 1 setgray + /Decode[0 1]def + /DataSourcedef + /MultipleDataSources false def + /BitsPerComponent 8 def + currentdict end + systemdict/image gx + grestore + }if + consumeimagedata +}def +/add_res +{ + dup/CSD eq{ + pop + //Adobe_AGM_Core begin + /AGMCORE_CSD_cache load 3 1 roll put + end + }{ + defineresource pop + }ifelse +}def +/del_res +{ + { + aload pop exch + dup/CSD eq{ + pop + {//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall + }{ + exch + {1 index undefineresource}forall + pop + }ifelse + }forall +}def +/get_res +{ + dup/CSD eq{ + pop + dup type dup/nametype eq exch/stringtype eq or{ + AGMCORE_CSD_cache exch get + }if + }{ + findresource + }ifelse +}def +/get_csa_by_name +{ + dup type dup/nametype eq exch/stringtype eq or{ + /CSA get_res + }if +}def +/paintproc_buf_init +{ + /count get 0 0 put +}def +/paintproc_buf_next +{ + dup/count get dup 0 get + dup 3 1 roll + 1 add 0 xpt + get +}def +/cachepaintproc_compress +{ + 5 dict begin + currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def + /ppdict 20 dict def + /string_size 16000 def + /readbuffer string_size string def + currentglobal true setglobal + ppdict 1 array dup 0 1 put/count xpt + setglobal + /LZWFilter + { + exch + dup length 0 eq{ + pop + }{ + ppdict dup length 1 sub 3 -1 roll put + }ifelse + {string_size}{0}ifelse string + }/LZWEncode filter def + { + ReadFilter readbuffer readstring + exch LZWFilter exch writestring + not{exit}if + }loop + LZWFilter closefile + ppdict + end +}def +/cachepaintproc +{ + 2 dict begin + currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def + /ppdict 20 dict def + currentglobal true setglobal + ppdict 1 array dup 0 1 put/count xpt + setglobal + { + ReadFilter 16000 string readstring exch + ppdict dup length 1 sub 3 -1 roll put + not{exit}if + }loop + ppdict dup dup length 1 sub()put + end +}def +/make_pattern +{ + exch clonedict exch + dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform + exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub + exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub + matrix translate exch matrix concatmatrix + 1 index begin + BBox 0 get XStep div cvi XStep mul/xshift exch neg def + BBox 1 get YStep div cvi YStep mul/yshift exch neg def + BBox 0 get xshift add + BBox 1 get yshift add + BBox 2 get xshift add + BBox 3 get yshift add + 4 array astore + /BBox exch def + [xshift yshift/translate load null/exec load]dup + 3/PaintProc load put cvx/PaintProc exch def + end + gsave 0 setgray + makepattern + grestore +}def +/set_pattern +{ + dup/PatternType get 1 eq{ + dup/PaintType get 1 eq{ + currentoverprint sop[/DeviceGray]setcolorspace 0 setgray + }if + }if + setpattern +}def +/setcolorspace_opt +{ + dup currentcolorspace eq{pop}{setcolorspace}ifelse +}def +/updatecolorrendering +{ + currentcolorrendering/RenderingIntent known{ + currentcolorrendering/RenderingIntent get + } + { + Intent/AbsoluteColorimetric eq + { + /absolute_colorimetric_crd AGMCORE_gget dup null eq + } + { + Intent/RelativeColorimetric eq + { + /relative_colorimetric_crd AGMCORE_gget dup null eq + } + { + Intent/Saturation eq + { + /saturation_crd AGMCORE_gget dup null eq + } + { + /perceptual_crd AGMCORE_gget dup null eq + }ifelse + }ifelse + }ifelse + { + pop null + } + { + /RenderingIntent known{null}{Intent}ifelse + }ifelse + }ifelse + Intent ne{ + Intent/ColorRendering{findresource}stopped + { + pop pop systemdict/findcolorrendering known + { + Intent findcolorrendering + { + /ColorRendering findresource true exch + } + { + /ColorRendering findresource + product(Xerox Phaser 5400)ne + exch + }ifelse + dup Intent/AbsoluteColorimetric eq + { + /absolute_colorimetric_crd exch AGMCORE_gput + } + { + Intent/RelativeColorimetric eq + { + /relative_colorimetric_crd exch AGMCORE_gput + } + { + Intent/Saturation eq + { + /saturation_crd exch AGMCORE_gput + } + { + Intent/Perceptual eq + { + /perceptual_crd exch AGMCORE_gput + } + { + pop + }ifelse + }ifelse + }ifelse + }ifelse + 1 index{exch}{pop}ifelse + } + {false}ifelse + } + {true}ifelse + { + dup begin + currentdict/TransformPQR known{ + currentdict/TransformPQR get aload pop + 3{{}eq 3 1 roll}repeat or or + } + {true}ifelse + currentdict/MatrixPQR known{ + currentdict/MatrixPQR get aload pop + 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll + 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll + 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq + and and and and and and and and + } + {true}ifelse + end + or + { + clonedict begin + /TransformPQR[ + {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div + 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind + {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div + 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind + {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div + 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind + ]def + /MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def + /RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def + currentdict end + }if + setcolorrendering_opt + }if + }if +}def +/set_crd +{ + AGMCORE_host_sep not level2 and{ + currentdict/ColorRendering known{ + ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if + }{ + currentdict/Intent known{ + updatecolorrendering + }if + }ifelse + currentcolorspace dup type/arraytype eq + {0 get}if + /DeviceRGB eq + { + currentdict/UCR known + {/UCR}{/AGMCORE_currentucr}ifelse + load setundercolorremoval + currentdict/BG known + {/BG}{/AGMCORE_currentbg}ifelse + load setblackgeneration + }if + }if +}def +/set_ucrbg +{ + dup null eq {pop /AGMCORE_currentbg load}{/Procedure get_res}ifelse + dup currentblackgeneration eq {pop}{setblackgeneration}ifelse + dup null eq {pop /AGMCORE_currentucr load}{/Procedure get_res}ifelse + dup currentundercolorremoval eq {pop}{setundercolorremoval}ifelse +}def +/setcolorrendering_opt +{ + dup currentcolorrendering eq{ + pop + }{ + product(HP Color LaserJet 2605)anchorsearch{ + pop pop pop + }{ + pop + clonedict + begin + /Intent Intent def + currentdict + end + setcolorrendering + }ifelse + }ifelse +}def +/cpaint_gcomp +{ + convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf + //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not + { + (%end_cpaint_gcomp)flushinput + }if +}def +/cpaint_gsep +{ + //Adobe_AGM_Core/AGMCORE_ConvertToProcess get + { + (%end_cpaint_gsep)flushinput + }if +}def +/cpaint_gend +{np}def +/T1_path +{ + currentfile token pop currentfile token pop mo + { + currentfile token pop dup type/stringtype eq + {pop exit}if + 0 exch rlineto + currentfile token pop dup type/stringtype eq + {pop exit}if + 0 rlineto + }loop +}def +/T1_gsave + level3 + {/clipsave} + {/gsave}ifelse + load def +/T1_grestore + level3 + {/cliprestore} + {/grestore}ifelse + load def +/set_spot_alias_ary +{ + dup inherit_aliases + //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf +}def +/set_spot_normalization_ary +{ + dup inherit_aliases + dup length + /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if + array + //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf + /AGMCORE_SpotAliasAry where{ + pop + AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval + AGMCORE_SpotAliasAry length + }{0}ifelse + AGMCORE_SpotAliasAry2 3 1 roll exch putinterval + true set_spot_alias +}def +/inherit_aliases +{ + {dup/Name get map_alias{/CSD put}{pop}ifelse}forall +}def +/set_spot_alias +{ + /AGMCORE_SpotAliasAry2 where{ + /AGMCORE_current_spot_alias 3 -1 roll put + }{ + pop + }ifelse +}def +/current_spot_alias +{ + /AGMCORE_SpotAliasAry2 where{ + /AGMCORE_current_spot_alias get + }{ + false + }ifelse +}def +/map_alias +{ + /AGMCORE_SpotAliasAry2 where{ + begin + /AGMCORE_name xdf + false + AGMCORE_SpotAliasAry2{ + dup/Name get AGMCORE_name eq{ + /CSD get/CSD get_res + exch pop true + exit + }{ + pop + }ifelse + }forall + end + }{ + pop false + }ifelse +}bdf +/spot_alias +{ + true set_spot_alias + /AGMCORE_&setcustomcolor AGMCORE_key_known not{ + //Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put + }if + /customcolor_tint 1 AGMCORE_gput + //Adobe_AGM_Core begin + /setcustomcolor + { + //Adobe_AGM_Core begin + dup/customcolor_tint exch AGMCORE_gput + 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not + current_spot_alias and{1 index 4 get map_alias}{false}ifelse + { + false set_spot_alias + /sep_colorspace_dict AGMCORE_gget null ne + {/sep_colorspace_dict AGMCORE_gget/ForeignContent known not}{false}ifelse + 3 1 roll 2 index{ + exch pop/sep_tint AGMCORE_gget exch + }if + mark 3 1 roll + setsepcolorspace + counttomark 0 ne{ + setsepcolor + }if + pop + not{/sep_tint 1.0 AGMCORE_gput/sep_colorspace_dict AGMCORE_gget/ForeignContent true put}if + pop + true set_spot_alias + }{ + AGMCORE_&setcustomcolor + }ifelse + end + }bdf + end +}def +/begin_feature +{ + Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put + count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put + {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if +}def +/end_feature +{ + 2 dict begin + /spd/setpagedevice load def + /setpagedevice{get_gstate spd set_gstate}def + stopped{$error/newerror false put}if + end + count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse + countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse + {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if +}def +/set_negative +{ + //Adobe_AGM_Core begin + /AGMCORE_inverting exch def + level2{ + currentpagedevice/NegativePrint known AGMCORE_distilling not and{ + currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{ + true begin_feature true{ + <>setpagedevice + }end_feature + }if + /AGMCORE_inverting false def + }if + }if + AGMCORE_inverting{ + [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer + AGMCORE_distilling{ + erasepage + }{ + gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse + /AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore + }ifelse + }if + end +}def +/lw_save_restore_override{ + /md where{ + pop + md begin + initializepage + /initializepage{}def + /pmSVsetup{}def + /endp{}def + /pse{}def + /psb{}def + /orig_showpage where + {pop} + {/orig_showpage/showpage load def} + ifelse + /showpage{orig_showpage gR}def + end + }if +}def +/pscript_showpage_override{ + /NTPSOct95 where + { + begin + showpage + save + /showpage/restore load def + /restore{exch pop}def + end + }if +}def +/driver_media_override +{ + /md where{ + pop + md/initializepage known{ + md/initializepage{}put + }if + md/rC known{ + md/rC{4{pop}repeat}put + }if + }if + /mysetup where{ + /mysetup[1 0 0 1 0 0]put + }if + Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put + level2 + {Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if +}def +/capture_mysetup +{ + /Pscript_Win_Data where{ + pop + Pscript_Win_Data/mysetup known{ + Adobe_AGM_Core/save_mysetup Pscript_Win_Data/mysetup get put + }if + }if +}def +/restore_mysetup +{ + /Pscript_Win_Data where{ + pop + Pscript_Win_Data/mysetup known{ + Adobe_AGM_Core/save_mysetup known{ + Pscript_Win_Data/mysetup Adobe_AGM_Core/save_mysetup get put + Adobe_AGM_Core/save_mysetup undef + }if + }if + }if +}def +/driver_check_media_override +{ + /PrepsDict where + {pop} + { + Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne + Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq + { + Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and + Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and + }if + { + Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix + }if + }ifelse +}def +AGMCORE_err_strings begin + /AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def + /AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def + /AGMCORE_invalid_color_space(This job contains an invalid color space. )def +end +/set_def_ht +{AGMCORE_def_ht sethalftone}def +/set_def_flat +{AGMCORE_Default_flatness setflat}def +end +systemdict/setpacking known +{setpacking}if +%%EndResource +%%BeginResource: procset Adobe_CoolType_Core 2.31 0 +%%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved. +%%Version: 2.31 0 +10 dict begin +/Adobe_CoolType_Passthru currentdict def +/Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def +Adobe_CoolType_Core_Defined + {/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def} +if +userdict/Adobe_CoolType_Core 70 dict dup begin put +/Adobe_CoolType_Version 2.31 def +/Level2? + systemdict/languagelevel known dup + {pop systemdict/languagelevel get 2 ge} + if def +Level2? not + { + /currentglobal false def + /setglobal/pop load def + /gcheck{pop false}bind def + /currentpacking false def + /setpacking/pop load def + /SharedFontDirectory 0 dict def + } +if +currentpacking +true setpacking +currentglobal false setglobal +userdict/Adobe_CoolType_Data 2 copy known not + {2 copy 10 dict put} +if +get + begin + /@opStackCountByLevel 32 dict def + /@opStackLevel 0 def + /@dictStackCountByLevel 32 dict def + /@dictStackLevel 0 def + end +setglobal +currentglobal true setglobal +userdict/Adobe_CoolType_GVMFonts known not + {userdict/Adobe_CoolType_GVMFonts 10 dict put} +if +setglobal +currentglobal false setglobal +userdict/Adobe_CoolType_LVMFonts known not + {userdict/Adobe_CoolType_LVMFonts 10 dict put} +if +setglobal +/ct_VMDictPut + { + dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse + 3 1 roll put + }bind def +/ct_VMDictUndef + { + dup Adobe_CoolType_GVMFonts exch known + {Adobe_CoolType_GVMFonts exch undef} + { + dup Adobe_CoolType_LVMFonts exch known + {Adobe_CoolType_LVMFonts exch undef} + {pop} + ifelse + }ifelse + }bind def +/ct_str1 1 string def +/ct_xshow +{ + /_ct_na exch def + /_ct_i 0 def + currentpoint + /_ct_y exch def + /_ct_x exch def + { + pop pop + ct_str1 exch 0 exch put + ct_str1 show + {_ct_na _ct_i get}stopped + {pop pop} + { + _ct_x _ct_y moveto + 0 + rmoveto + } + ifelse + /_ct_i _ct_i 1 add def + currentpoint + /_ct_y exch def + /_ct_x exch def + } + exch + @cshow +}bind def +/ct_yshow +{ + /_ct_na exch def + /_ct_i 0 def + currentpoint + /_ct_y exch def + /_ct_x exch def + { + pop pop + ct_str1 exch 0 exch put + ct_str1 show + {_ct_na _ct_i get}stopped + {pop pop} + { + _ct_x _ct_y moveto + 0 exch + rmoveto + } + ifelse + /_ct_i _ct_i 1 add def + currentpoint + /_ct_y exch def + /_ct_x exch def + } + exch + @cshow +}bind def +/ct_xyshow +{ + /_ct_na exch def + /_ct_i 0 def + currentpoint + /_ct_y exch def + /_ct_x exch def + { + pop pop + ct_str1 exch 0 exch put + ct_str1 show + {_ct_na _ct_i get}stopped + {pop pop} + { + {_ct_na _ct_i 1 add get}stopped + {pop pop pop} + { + _ct_x _ct_y moveto + rmoveto + } + ifelse + } + ifelse + /_ct_i _ct_i 2 add def + currentpoint + /_ct_y exch def + /_ct_x exch def + } + exch + @cshow +}bind def +/xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def +/ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def +/xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def +currentglobal true setglobal +/ct_T3Defs +{ +/BuildChar +{ + 1 index/Encoding get exch get + 1 index/BuildGlyph get exec +}bind def +/BuildGlyph +{ + exch begin + GlyphProcs exch get exec + end +}bind def +}bind def +setglobal +/@_SaveStackLevels + { + Adobe_CoolType_Data + begin + /@vmState currentglobal def false setglobal + @opStackCountByLevel + @opStackLevel + 2 copy known not + { + 2 copy + 3 dict dup/args + 7 index + 5 add array put + put get + } + { + get dup/args get dup length 3 index lt + { + dup length 5 add array exch + 1 index exch 0 exch putinterval + 1 index exch/args exch put + } + {pop} + ifelse + } + ifelse + begin + count 1 sub + 1 index lt + {pop count} + if + dup/argCount exch def + dup 0 gt + { + args exch 0 exch getinterval + astore pop + } + {pop} + ifelse + count + /restCount exch def + end + /@opStackLevel @opStackLevel 1 add def + countdictstack 1 sub + @dictStackCountByLevel exch @dictStackLevel exch put + /@dictStackLevel @dictStackLevel 1 add def + @vmState setglobal + end + }bind def +/@_RestoreStackLevels + { + Adobe_CoolType_Data + begin + /@opStackLevel @opStackLevel 1 sub def + @opStackCountByLevel @opStackLevel get + begin + count restCount sub dup 0 gt + {{pop}repeat} + {pop} + ifelse + args 0 argCount getinterval{}forall + end + /@dictStackLevel @dictStackLevel 1 sub def + @dictStackCountByLevel @dictStackLevel get + end + countdictstack exch sub dup 0 gt + {{end}repeat} + {pop} + ifelse + }bind def +/@_PopStackLevels + { + Adobe_CoolType_Data + begin + /@opStackLevel @opStackLevel 1 sub def + /@dictStackLevel @dictStackLevel 1 sub def + end + }bind def +/@Raise + { + exch cvx exch errordict exch get exec + stop + }bind def +/@ReRaise + { + cvx $error/errorname get errordict exch get exec + stop + }bind def +/@Stopped + { + 0 @#Stopped + }bind def +/@#Stopped + { + @_SaveStackLevels + stopped + {@_RestoreStackLevels true} + {@_PopStackLevels false} + ifelse + }bind def +/@Arg + { + Adobe_CoolType_Data + begin + @opStackCountByLevel @opStackLevel 1 sub get + begin + args exch + argCount 1 sub exch sub get + end + end + }bind def +currentglobal true setglobal +/CTHasResourceForAllBug + Level2? + { + 1 dict dup + /@shouldNotDisappearDictValue true def + Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put + begin + count @_SaveStackLevels + {(*){pop stop}128 string/Category resourceforall} + stopped pop + @_RestoreStackLevels + currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll + { + /@shouldNotDisappearDictValue known + { + { + end + currentdict 1 index eq + {pop exit} + if + } + loop + } + if + } + { + pop + end + } + ifelse + } + {false} + ifelse + def +true setglobal +/CTHasResourceStatusBug + Level2? + { + mark + {/steveamerige/Category resourcestatus} + stopped + {cleartomark true} + {cleartomark currentglobal not} + ifelse + } + {false} + ifelse + def +setglobal +/CTResourceStatus + { + mark 3 1 roll + /Category findresource + begin + ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec + {cleartomark false} + {{3 2 roll pop true}{cleartomark false}ifelse} + ifelse + end + }bind def +/CTWorkAroundBugs + { + Level2? + { + /cid_PreLoad/ProcSet resourcestatus + { + pop pop + currentglobal + mark + { + (*) + { + dup/CMap CTHasResourceStatusBug + {CTResourceStatus} + {resourcestatus} + ifelse + { + pop dup 0 eq exch 1 eq or + { + dup/CMap findresource gcheck setglobal + /CMap undefineresource + } + { + pop CTHasResourceForAllBug + {exit} + {stop} + ifelse + } + ifelse + } + {pop} + ifelse + } + 128 string/CMap resourceforall + } + stopped + {cleartomark} + stopped pop + setglobal + } + if + } + if + }bind def +/ds + { + Adobe_CoolType_Core + begin + CTWorkAroundBugs + /mo/moveto load def + /nf/newencodedfont load def + /msf{makefont setfont}bind def + /uf{dup undefinefont ct_VMDictUndef}bind def + /ur/undefineresource load def + /chp/charpath load def + /awsh/awidthshow load def + /wsh/widthshow load def + /ash/ashow load def + /@xshow/xshow load def + /@yshow/yshow load def + /@xyshow/xyshow load def + /@cshow/cshow load def + /sh/show load def + /rp/repeat load def + /.n/.notdef def + end + currentglobal false setglobal + userdict/Adobe_CoolType_Data 2 copy known not + {2 copy 10 dict put} + if + get + begin + /AddWidths? false def + /CC 0 def + /charcode 2 string def + /@opStackCountByLevel 32 dict def + /@opStackLevel 0 def + /@dictStackCountByLevel 32 dict def + /@dictStackLevel 0 def + /InVMFontsByCMap 10 dict def + /InVMDeepCopiedFonts 10 dict def + end + setglobal + }bind def +/dt + { + currentdict Adobe_CoolType_Core eq + {end} + if + }bind def +/ps + { + Adobe_CoolType_Core begin + Adobe_CoolType_GVMFonts begin + Adobe_CoolType_LVMFonts begin + SharedFontDirectory begin + }bind def +/pt + { + end + end + end + end + }bind def +/unload + { + systemdict/languagelevel known + { + systemdict/languagelevel get 2 ge + { + userdict/Adobe_CoolType_Core 2 copy known + {undef} + {pop pop} + ifelse + } + if + } + if + }bind def +/ndf + { + 1 index where + {pop pop pop} + {dup xcheck{bind}if def} + ifelse + }def +/findfont systemdict + begin + userdict + begin + /globaldict where{/globaldict get begin}if + dup where pop exch get + /globaldict where{pop end}if + end + end +Adobe_CoolType_Core_Defined + {/systemfindfont exch def} + { + /findfont 1 index def + /systemfindfont exch def + } +ifelse +/undefinefont + {pop}ndf +/copyfont + { + currentglobal 3 1 roll + 1 index gcheck setglobal + dup null eq{0}{dup length}ifelse + 2 index length add 1 add dict + begin + exch + { + 1 index/FID eq + {pop pop} + {def} + ifelse + } + forall + dup null eq + {pop} + {{def}forall} + ifelse + currentdict + end + exch setglobal + }bind def +/copyarray + { + currentglobal exch + dup gcheck setglobal + dup length array copy + exch setglobal + }bind def +/newencodedfont + { + currentglobal + { + SharedFontDirectory 3 index known + {SharedFontDirectory 3 index get/FontReferenced known} + {false} + ifelse + } + { + FontDirectory 3 index known + {FontDirectory 3 index get/FontReferenced known} + { + SharedFontDirectory 3 index known + {SharedFontDirectory 3 index get/FontReferenced known} + {false} + ifelse + } + ifelse + } + ifelse + dup + { + 3 index findfont/FontReferenced get + 2 index dup type/nametype eq + {findfont} + if ne + {pop false} + if + } + if + dup + { + 1 index dup type/nametype eq + {findfont} + if + dup/CharStrings known + { + /CharStrings get length + 4 index findfont/CharStrings get length + ne + { + pop false + } + if + } + {pop} + ifelse + } + if + { + pop + 1 index findfont + /Encoding get exch + 0 1 255 + {2 copy get 3 index 3 1 roll put} + for + pop pop pop + } + { + currentglobal + 4 1 roll + dup type/nametype eq + {findfont} + if + dup gcheck setglobal + dup dup maxlength 2 add dict + begin + exch + { + 1 index/FID ne + 2 index/Encoding ne and + {def} + {pop pop} + ifelse + } + forall + /FontReferenced exch def + /Encoding exch dup length array copy def + /FontName 1 index dup type/stringtype eq{cvn}if def dup + currentdict + end + definefont ct_VMDictPut + setglobal + } + ifelse + }bind def +/SetSubstituteStrategy + { + $SubstituteFont + begin + dup type/dicttype ne + {0 dict} + if + currentdict/$Strategies known + { + exch $Strategies exch + 2 copy known + { + get + 2 copy maxlength exch maxlength add dict + begin + {def}forall + {def}forall + currentdict + dup/$Init known + {dup/$Init get exec} + if + end + /$Strategy exch def + } + {pop pop pop} + ifelse + } + {pop pop} + ifelse + end + }bind def +/scff + { + $SubstituteFont + begin + dup type/stringtype eq + {dup length exch} + {null} + ifelse + /$sname exch def + /$slen exch def + /$inVMIndex + $sname null eq + { + 1 index $str cvs + dup length $slen sub $slen getinterval cvn + } + {$sname} + ifelse def + end + {findfont} + @Stopped + { + dup length 8 add string exch + 1 index 0(BadFont:)putinterval + 1 index exch 8 exch dup length string cvs putinterval cvn + {findfont} + @Stopped + {pop/Courier findfont} + if + } + if + $SubstituteFont + begin + /$sname null def + /$slen 0 def + /$inVMIndex null def + end + }bind def +/isWidthsOnlyFont + { + dup/WidthsOnly known + {pop pop true} + { + dup/FDepVector known + {/FDepVector get{isWidthsOnlyFont dup{exit}if}forall} + { + dup/FDArray known + {/FDArray get{isWidthsOnlyFont dup{exit}if}forall} + {pop} + ifelse + } + ifelse + } + ifelse + }bind def +/ct_StyleDicts 4 dict dup begin + /Adobe-Japan1 4 dict dup begin + Level2? + { + /Serif + /HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus + {pop pop/HeiseiMin-W3} + { + /CIDFont/Category resourcestatus + { + pop pop + /HeiseiMin-W3/CIDFont resourcestatus + {pop pop/HeiseiMin-W3} + {/Ryumin-Light} + ifelse + } + {/Ryumin-Light} + ifelse + } + ifelse + def + /SansSerif + /HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus + {pop pop/HeiseiKakuGo-W5} + { + /CIDFont/Category resourcestatus + { + pop pop + /HeiseiKakuGo-W5/CIDFont resourcestatus + {pop pop/HeiseiKakuGo-W5} + {/GothicBBB-Medium} + ifelse + } + {/GothicBBB-Medium} + ifelse + } + ifelse + def + /HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus + {pop pop/HeiseiMaruGo-W4} + { + /CIDFont/Category resourcestatus + { + pop pop + /HeiseiMaruGo-W4/CIDFont resourcestatus + {pop pop/HeiseiMaruGo-W4} + { + /Jun101-Light-RKSJ-H/Font resourcestatus + {pop pop/Jun101-Light} + {SansSerif} + ifelse + } + ifelse + } + { + /Jun101-Light-RKSJ-H/Font resourcestatus + {pop pop/Jun101-Light} + {SansSerif} + ifelse + } + ifelse + } + ifelse + /RoundSansSerif exch def + /Default Serif def + } + { + /Serif/Ryumin-Light def + /SansSerif/GothicBBB-Medium def + { + (fonts/Jun101-Light-83pv-RKSJ-H)status + }stopped + {pop}{ + {pop pop pop pop/Jun101-Light} + {SansSerif} + ifelse + /RoundSansSerif exch def + }ifelse + /Default Serif def + } + ifelse + end + def + /Adobe-Korea1 4 dict dup begin + /Serif/HYSMyeongJo-Medium def + /SansSerif/HYGoThic-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-GB1 4 dict dup begin + /Serif/STSong-Light def + /SansSerif/STHeiti-Regular def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-CNS1 4 dict dup begin + /Serif/MKai-Medium def + /SansSerif/MHei-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def +end +def +Level2?{currentglobal true setglobal}if +/ct_BoldRomanWidthProc + { + stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth + 0 0 + }bind def +/ct_Type0WidthProc + { + dup stringwidth 0 0 moveto + 2 index true charpath pathbbox + 0 -1 + 7 index 2 div .88 + setcachedevice2 + pop + 0 0 + }bind def +/ct_Type0WMode1WidthProc + { + dup stringwidth + pop 2 div neg -0.88 + 2 copy + moveto + 0 -1 + 5 -1 roll true charpath pathbbox + setcachedevice + }bind def +/cHexEncoding +[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 +/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 +/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 +/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B +/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E +/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 +/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 +/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 +/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA +/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD +/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 +/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 +/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 +/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def +/ct_BoldBaseFont + 11 dict begin + /FontType 3 def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /Encoding cHexEncoding def + /_setwidthProc/ct_BoldRomanWidthProc load def + /_bcstr1 1 string def + /BuildChar + { + exch begin + _basefont setfont + _bcstr1 dup 0 4 -1 roll put + dup + _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bind def + currentdict + end +def +systemdict/composefont known +{ +/ct_DefineIdentity-H +{ + /Identity-H/CMap resourcestatus + { + pop pop + } + { + /CIDInit/ProcSet findresource begin + 12 dict begin + begincmap + /CIDSystemInfo 3 dict dup begin + /Registry(Adobe)def + /Ordering(Identity)def + /Supplement 0 def + end def + /CMapName/Identity-H def + /CMapVersion 1.000 def + /CMapType 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000>0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } + ifelse +} +def +/ct_BoldBaseCIDFont + 11 dict begin + /CIDFontType 1 def + /CIDFontName/ct_BoldBaseCIDFont def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /_setwidthProc/ct_Type0WidthProc load def + /_bcstr2 2 string def + /BuildGlyph + { + exch begin + _basefont setfont + _bcstr2 1 2 index 256 mod put + _bcstr2 0 3 -1 roll 256 idiv put + _bcstr2 dup _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bind def + currentdict + end +def +}if +Level2?{setglobal}if +/ct_CopyFont{ + { + 1 index/FID ne 2 index/UniqueID ne and + {def}{pop pop}ifelse + }forall +}bind def +/ct_Type0CopyFont +{ + exch + dup length dict + begin + ct_CopyFont + [ + exch + FDepVector + { + dup/FontType get 0 eq + { + 1 index ct_Type0CopyFont + /_ctType0 exch definefont + } + { + /_ctBaseFont exch + 2 index exec + } + ifelse + exch + } + forall + pop + ] + /FDepVector exch def + currentdict + end +}bind def +/ct_MakeBoldFont +{ + dup/ct_SyntheticBold known + { + dup length 3 add dict begin + ct_CopyFont + /ct_StrokeWidth .03 0 FontMatrix idtransform pop def + /ct_SyntheticBold true def + currentdict + end + definefont + } + { + dup dup length 3 add dict + begin + ct_CopyFont + /PaintType 2 def + /StrokeWidth .03 0 FontMatrix idtransform pop def + /dummybold currentdict + end + definefont + dup/FontType get dup 9 ge exch 11 le and + { + ct_BoldBaseCIDFont + dup length 3 add dict copy begin + dup/CIDSystemInfo get/CIDSystemInfo exch def + ct_DefineIdentity-H + /_Type0Identity/Identity-H 3 -1 roll[exch]composefont + /_basefont exch def + /_Type0Identity/Identity-H 3 -1 roll[exch]composefont + /_basefonto exch def + currentdict + end + /CIDFont defineresource + } + { + ct_BoldBaseFont + dup length 3 add dict copy begin + /_basefont exch def + /_basefonto exch def + currentdict + end + definefont + } + ifelse + } + ifelse +}bind def +/ct_MakeBold{ + 1 index + 1 index + findfont + currentglobal 5 1 roll + dup gcheck setglobal + dup + /FontType get 0 eq + { + dup/WMode known{dup/WMode get 1 eq}{false}ifelse + version length 4 ge + and + {version 0 4 getinterval cvi 2015 ge} + {true} + ifelse + {/ct_Type0WidthProc} + {/ct_Type0WMode1WidthProc} + ifelse + ct_BoldBaseFont/_setwidthProc 3 -1 roll load put + {ct_MakeBoldFont}ct_Type0CopyFont definefont + } + { + dup/_fauxfont known not 1 index/SubstMaster known not and + { + ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put + ct_MakeBoldFont + } + { + 2 index 2 index eq + {exch pop } + { + dup length dict begin + ct_CopyFont + currentdict + end + definefont + } + ifelse + } + ifelse + } + ifelse + pop pop pop + setglobal +}bind def +/?str1 256 string def +/?set + { + $SubstituteFont + begin + /$substituteFound false def + /$fontname 1 index def + /$doSmartSub false def + end + dup + findfont + $SubstituteFont + begin + $substituteFound + {false} + { + dup/FontName known + { + dup/FontName get $fontname eq + 1 index/DistillerFauxFont known not and + /currentdistillerparams where + {pop false 2 index isWidthsOnlyFont not and} + if + } + {false} + ifelse + } + ifelse + exch pop + /$doSmartSub true def + end + { + 5 1 roll pop pop pop pop + findfont + } + { + 1 index + findfont + dup/FontType get 3 eq + { + 6 1 roll pop pop pop pop pop false + } + {pop true} + ifelse + { + $SubstituteFont + begin + pop pop + /$styleArray 1 index def + /$regOrdering 2 index def + pop pop + 0 1 $styleArray length 1 sub + { + $styleArray exch get + ct_StyleDicts $regOrdering + 2 copy known + { + get + exch 2 copy known not + {pop/Default} + if + get + dup type/nametype eq + { + ?str1 cvs length dup 1 add exch + ?str1 exch(-)putinterval + exch dup length exch ?str1 exch 3 index exch putinterval + add ?str1 exch 0 exch getinterval cvn + } + { + pop pop/Unknown + } + ifelse + } + { + pop pop pop pop/Unknown + } + ifelse + } + for + end + findfont + }if + } + ifelse + currentglobal false setglobal 3 1 roll + null copyfont definefont pop + setglobal + }bind def +setpacking +userdict/$SubstituteFont 25 dict put +1 dict + begin + /SubstituteFont + dup $error exch 2 copy known + {get} + {pop pop{pop/Courier}bind} + ifelse def + /currentdistillerparams where dup + { + pop pop + currentdistillerparams/CannotEmbedFontPolicy 2 copy known + {get/Error eq} + {pop pop false} + ifelse + } + if not + { + countdictstack array dictstack 0 get + begin + userdict + begin + $SubstituteFont + begin + /$str 128 string def + /$fontpat 128 string def + /$slen 0 def + /$sname null def + /$match false def + /$fontname null def + /$substituteFound false def + /$inVMIndex null def + /$doSmartSub true def + /$depth 0 def + /$fontname null def + /$italicangle 26.5 def + /$dstack null def + /$Strategies 10 dict dup + begin + /$Type3Underprint + { + currentglobal exch false setglobal + 11 dict + begin + /UseFont exch + $WMode 0 ne + { + dup length dict copy + dup/WMode $WMode put + /UseFont exch definefont + } + if def + /FontName $fontname dup type/stringtype eq{cvn}if def + /FontType 3 def + /FontMatrix[.001 0 0 .001 0 0]def + /Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def + /FontBBox[0 0 0 0]def + /CCInfo 7 dict dup + begin + /cc null def + /x 0 def + /y 0 def + end def + /BuildChar + { + exch + begin + CCInfo + begin + 1 string dup 0 3 index put exch pop + /cc exch def + UseFont 1000 scalefont setfont + cc stringwidth/y exch def/x exch def + x y setcharwidth + $SubstituteFont/$Strategy get/$Underprint get exec + 0 0 moveto cc show + x y moveto + end + end + }bind def + currentdict + end + exch setglobal + }bind def + /$GetaTint + 2 dict dup + begin + /$BuildFont + { + dup/WMode known + {dup/WMode get} + {0} + ifelse + /$WMode exch def + $fontname exch + dup/FontName known + { + dup/FontName get + dup type/stringtype eq{cvn}if + } + {/unnamedfont} + ifelse + exch + Adobe_CoolType_Data/InVMDeepCopiedFonts get + 1 index/FontName get known + { + pop + Adobe_CoolType_Data/InVMDeepCopiedFonts get + 1 index get + null copyfont + } + {$deepcopyfont} + ifelse + exch 1 index exch/FontBasedOn exch put + dup/FontName $fontname dup type/stringtype eq{cvn}if put + definefont + Adobe_CoolType_Data/InVMDeepCopiedFonts get + begin + dup/FontBasedOn get 1 index def + end + }bind def + /$Underprint + { + gsave + x abs y abs gt + {/y 1000 def} + {/x -1000 def 500 120 translate} + ifelse + Level2? + { + [/Separation(All)/DeviceCMYK{0 0 0 1 pop}] + setcolorspace + } + {0 setgray} + ifelse + 10 setlinewidth + x .8 mul + [7 3] + { + y mul 8 div 120 sub x 10 div exch moveto + 0 y 4 div neg rlineto + dup 0 rlineto + 0 y 4 div rlineto + closepath + gsave + Level2? + {.2 setcolor} + {.8 setgray} + ifelse + fill grestore + stroke + } + forall + pop + grestore + }bind def + end def + /$Oblique + 1 dict dup + begin + /$BuildFont + { + currentglobal exch dup gcheck setglobal + null copyfont + begin + /FontBasedOn + currentdict/FontName known + { + FontName + dup type/stringtype eq{cvn}if + } + {/unnamedfont} + ifelse + def + /FontName $fontname dup type/stringtype eq{cvn}if def + /currentdistillerparams where + {pop} + { + /FontInfo currentdict/FontInfo known + {FontInfo null copyfont} + {2 dict} + ifelse + dup + begin + /ItalicAngle $italicangle def + /FontMatrix FontMatrix + [1 0 ItalicAngle dup sin exch cos div 1 0 0] + matrix concatmatrix readonly + end + 4 2 roll def + def + } + ifelse + FontName currentdict + end + definefont + exch setglobal + }bind def + end def + /$None + 1 dict dup + begin + /$BuildFont{}bind def + end def + end def + /$Oblique SetSubstituteStrategy + /$findfontByEnum + { + dup type/stringtype eq{cvn}if + dup/$fontname exch def + $sname null eq + {$str cvs dup length $slen sub $slen getinterval} + {pop $sname} + ifelse + $fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval + /$match false def + $SubstituteFont/$dstack countdictstack array dictstack put + mark + { + $fontpat 0 $slen 7 add getinterval + {/$match exch def exit} + $str filenameforall + } + stopped + { + cleardictstack + currentdict + true + $SubstituteFont/$dstack get + { + exch + { + 1 index eq + {pop false} + {true} + ifelse + } + {begin false} + ifelse + } + forall + pop + } + if + cleartomark + /$slen 0 def + $match false ne + {$match(fonts/)anchorsearch pop pop cvn} + {/Courier} + ifelse + }bind def + /$ROS 1 dict dup + begin + /Adobe 4 dict dup + begin + /Japan1 [/Ryumin-Light/HeiseiMin-W3 + /GothicBBB-Medium/HeiseiKakuGo-W5 + /HeiseiMaruGo-W4/Jun101-Light]def + /Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def + /GB1 [/STSong-Light/STHeiti-Regular]def + /CNS1 [/MKai-Medium/MHei-Medium]def + end def + end def + /$cmapname null def + /$deepcopyfont + { + dup/FontType get 0 eq + { + 1 dict dup/FontName/copied put copyfont + begin + /FDepVector FDepVector copyarray + 0 1 2 index length 1 sub + { + 2 copy get $deepcopyfont + dup/FontName/copied put + /copied exch definefont + 3 copy put pop pop + } + for + def + currentdict + end + } + {$Strategies/$Type3Underprint get exec} + ifelse + }bind def + /$buildfontname + { + dup/CIDFont findresource/CIDSystemInfo get + begin + Registry length Ordering length Supplement 8 string cvs + 3 copy length 2 add add add string + dup 5 1 roll dup 0 Registry putinterval + dup 4 index(-)putinterval + dup 4 index 1 add Ordering putinterval + 4 2 roll add 1 add 2 copy(-)putinterval + end + 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch + anchorsearch + {pop pop 3 2 roll putinterval cvn/$cmapname exch def} + {pop pop pop pop pop} + ifelse + length + $str 1 index(-)putinterval 1 add + $str 1 index $cmapname $fontpat cvs putinterval + $cmapname length add + $str exch 0 exch getinterval cvn + }bind def + /$findfontByROS + { + /$fontname exch def + $ROS Registry 2 copy known + { + get Ordering 2 copy known + {get} + {pop pop[]} + ifelse + } + {pop pop[]} + ifelse + false exch + { + dup/CIDFont resourcestatus + { + pop pop + save + 1 index/CIDFont findresource + dup/WidthsOnly known + {dup/WidthsOnly get} + {false} + ifelse + exch pop + exch restore + {pop} + {exch pop true exit} + ifelse + } + {pop} + ifelse + } + forall + {$str cvs $buildfontname} + { + false(*) + { + save exch + dup/CIDFont findresource + dup/WidthsOnly known + {dup/WidthsOnly get not} + {true} + ifelse + exch/CIDSystemInfo get + dup/Registry get Registry eq + exch/Ordering get Ordering eq and and + {exch restore exch pop true exit} + {pop restore} + ifelse + } + $str/CIDFont resourceforall + {$buildfontname} + {$fontname $findfontByEnum} + ifelse + } + ifelse + }bind def + end + end + currentdict/$error known currentdict/languagelevel known and dup + {pop $error/SubstituteFont known} + if + dup + {$error} + {Adobe_CoolType_Core} + ifelse + begin + { + /SubstituteFont + /CMap/Category resourcestatus + { + pop pop + { + $SubstituteFont + begin + /$substituteFound true def + dup length $slen gt + $sname null ne or + $slen 0 gt and + { + $sname null eq + {dup $str cvs dup length $slen sub $slen getinterval cvn} + {$sname} + ifelse + Adobe_CoolType_Data/InVMFontsByCMap get + 1 index 2 copy known + { + get + false exch + { + pop + currentglobal + { + GlobalFontDirectory 1 index known + {exch pop true exit} + {pop} + ifelse + } + { + FontDirectory 1 index known + {exch pop true exit} + { + GlobalFontDirectory 1 index known + {exch pop true exit} + {pop} + ifelse + } + ifelse + } + ifelse + } + forall + } + {pop pop false} + ifelse + { + exch pop exch pop + } + { + dup/CMap resourcestatus + { + pop pop + dup/$cmapname exch def + /CMap findresource/CIDSystemInfo get{def}forall + $findfontByROS + } + { + 128 string cvs + dup(-)search + { + 3 1 roll search + { + 3 1 roll pop + {dup cvi} + stopped + {pop pop pop pop pop $findfontByEnum} + { + 4 2 roll pop pop + exch length + exch + 2 index length + 2 index + sub + exch 1 sub -1 0 + { + $str cvs dup length + 4 index + 0 + 4 index + 4 3 roll add + getinterval + exch 1 index exch 3 index exch + putinterval + dup/CMap resourcestatus + { + pop pop + 4 1 roll pop pop pop + dup/$cmapname exch def + /CMap findresource/CIDSystemInfo get{def}forall + $findfontByROS + true exit + } + {pop} + ifelse + } + for + dup type/booleantype eq + {pop} + {pop pop pop $findfontByEnum} + ifelse + } + ifelse + } + {pop pop pop $findfontByEnum} + ifelse + } + {pop pop $findfontByEnum} + ifelse + } + ifelse + } + ifelse + } + {//SubstituteFont exec} + ifelse + /$slen 0 def + end + } + } + { + { + $SubstituteFont + begin + /$substituteFound true def + dup length $slen gt + $sname null ne or + $slen 0 gt and + {$findfontByEnum} + {//SubstituteFont exec} + ifelse + end + } + } + ifelse + bind readonly def + Adobe_CoolType_Core/scfindfont/systemfindfont load put + } + { + /scfindfont + { + $SubstituteFont + begin + dup systemfindfont + dup/FontName known + {dup/FontName get dup 3 index ne} + {/noname true} + ifelse + dup + { + /$origfontnamefound 2 index def + /$origfontname 4 index def/$substituteFound true def + } + if + exch pop + { + $slen 0 gt + $sname null ne + 3 index length $slen gt or and + { + pop dup $findfontByEnum findfont + dup maxlength 1 add dict + begin + {1 index/FID eq{pop pop}{def}ifelse} + forall + currentdict + end + definefont + dup/FontName known{dup/FontName get}{null}ifelse + $origfontnamefound ne + { + $origfontname $str cvs print + ( substitution revised, using )print + dup/FontName known + {dup/FontName get}{(unspecified font)} + ifelse + $str cvs print(.\n)print + } + if + } + {exch pop} + ifelse + } + {exch pop} + ifelse + end + }bind def + } + ifelse + end + end + Adobe_CoolType_Core_Defined not + { + Adobe_CoolType_Core/findfont + { + $SubstituteFont + begin + $depth 0 eq + { + /$fontname 1 index dup type/stringtype ne{$str cvs}if def + /$substituteFound false def + } + if + /$depth $depth 1 add def + end + scfindfont + $SubstituteFont + begin + /$depth $depth 1 sub def + $substituteFound $depth 0 eq and + { + $inVMIndex null ne + {dup $inVMIndex $AddInVMFont} + if + $doSmartSub + { + currentdict/$Strategy known + {$Strategy/$BuildFont get exec} + if + } + if + } + if + end + }bind put + } + if + } + if + end +/$AddInVMFont + { + exch/FontName 2 copy known + { + get + 1 dict dup begin exch 1 index gcheck def end exch + Adobe_CoolType_Data/InVMFontsByCMap get exch + $DictAdd + } + {pop pop pop} + ifelse + }bind def +/$DictAdd + { + 2 copy known not + {2 copy 4 index length dict put} + if + Level2? not + { + 2 copy get dup maxlength exch length 4 index length add lt + 2 copy get dup length 4 index length add exch maxlength 1 index lt + { + 2 mul dict + begin + 2 copy get{forall}def + 2 copy currentdict put + end + } + {pop} + ifelse + } + if + get + begin + {def} + forall + end + }bind def +end +end +%%EndResource +currentglobal true setglobal +%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 +%%Copyright: Copyright 1987-2006 Adobe Systems Incorporated. +%%Version: 1.23 0 +systemdict/languagelevel known dup + {currentglobal false setglobal} + {false} +ifelse +exch +userdict/Adobe_CoolType_Utility 2 copy known + {2 copy get dup maxlength 27 add dict copy} + {27 dict} +ifelse put +Adobe_CoolType_Utility + begin + /@eexecStartData + def + /@recognizeCIDFont null def + /ct_Level2? exch def + /ct_Clone? 1183615869 internaldict dup + /CCRun known not + exch/eCCRun known not + ct_Level2? and or def +ct_Level2? + {globaldict begin currentglobal true setglobal} +if + /ct_AddStdCIDMap + ct_Level2? + {{ + mark + Adobe_CoolType_Utility/@recognizeCIDFont currentdict put + { + ((Hex)57 StartData + 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 + 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 + d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 + cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec + } + stopped + { + cleartomark + Adobe_CoolType_Utility/@recognizeCIDFont get + countdictstack dup array dictstack + exch 1 sub -1 0 + { + 2 copy get 3 index eq + {1 index length exch sub 1 sub{end}repeat exit} + {pop} + ifelse + } + for + pop pop + Adobe_CoolType_Utility/@eexecStartData get eexec + } + {cleartomark} + ifelse + }} + {{ + Adobe_CoolType_Utility/@eexecStartData get eexec + }} + ifelse bind def +userdict/cid_extensions known +dup{cid_extensions/cid_UpdateDB known and}if + { + cid_extensions + begin + /cid_GetCIDSystemInfo + { + 1 index type/stringtype eq + {exch cvn exch} + if + cid_extensions + begin + dup load 2 index known + { + 2 copy + cid_GetStatusInfo + dup null ne + { + 1 index load + 3 index get + dup null eq + {pop pop cid_UpdateDB} + { + exch + 1 index/Created get eq + {exch pop exch pop} + {pop cid_UpdateDB} + ifelse + } + ifelse + } + {pop cid_UpdateDB} + ifelse + } + {cid_UpdateDB} + ifelse + end + }bind def + end + } +if +ct_Level2? + {end setglobal} +if + /ct_UseNativeCapability? systemdict/composefont known def + /ct_MakeOCF 35 dict def + /ct_Vars 25 dict def + /ct_GlyphDirProcs 6 dict def + /ct_BuildCharDict 15 dict dup + begin + /charcode 2 string def + /dst_string 1500 string def + /nullstring()def + /usewidths? true def + end def + ct_Level2?{setglobal}{pop}ifelse + ct_GlyphDirProcs + begin + /GetGlyphDirectory + { + systemdict/languagelevel known + {pop/CIDFont findresource/GlyphDirectory get} + { + 1 index/CIDFont findresource/GlyphDirectory + get dup type/dicttype eq + { + dup dup maxlength exch length sub 2 index lt + { + dup length 2 index add dict copy 2 index + /CIDFont findresource/GlyphDirectory 2 index put + } + if + } + if + exch pop exch pop + } + ifelse + + + }def + /+ + { + systemdict/languagelevel known + { + currentglobal false setglobal + 3 dict begin + /vm exch def + } + {1 dict begin} + ifelse + /$ exch def + systemdict/languagelevel known + { + vm setglobal + /gvm currentglobal def + $ gcheck setglobal + } + if + ?{$ begin}if + }def + /?{$ type/dicttype eq}def + /|{ + userdict/Adobe_CoolType_Data known + { + Adobe_CoolType_Data/AddWidths? known + { + currentdict Adobe_CoolType_Data + begin + begin + AddWidths? + { + Adobe_CoolType_Data/CC 3 index put + ?{def}{$ 3 1 roll put}ifelse + CC charcode exch 1 index 0 2 index 256 idiv put + 1 index exch 1 exch 256 mod put + stringwidth 2 array astore + currentfont/Widths get exch CC exch put + } + {?{def}{$ 3 1 roll put}ifelse} + ifelse + end + end + } + {?{def}{$ 3 1 roll put}ifelse} ifelse + } + {?{def}{$ 3 1 roll put}ifelse} + ifelse + }def + /! + { + ?{end}if + systemdict/languagelevel known + {gvm setglobal} + if + end + }def + /:{string currentfile exch readstring pop}executeonly def + end + ct_MakeOCF + begin + /ct_cHexEncoding + [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 + /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 + /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 + /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B + /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E + /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 + /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 + /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 + /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA + /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD + /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 + /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 + /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 + /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def + /ct_CID_STR_SIZE 8000 def + /ct_mkocfStr100 100 string def + /ct_defaultFontMtx[.001 0 0 .001 0 0]def + /ct_1000Mtx[1000 0 0 1000 0 0]def + /ct_raise{exch cvx exch errordict exch get exec stop}bind def + /ct_reraise + {cvx $error/errorname get(Error: )print dup( )cvs print + errordict exch get exec stop + }bind def + /ct_cvnsi + { + 1 index add 1 sub 1 exch 0 4 1 roll + { + 2 index exch get + exch 8 bitshift + add + } + for + exch pop + }bind def + /ct_GetInterval + { + Adobe_CoolType_Utility/ct_BuildCharDict get + begin + /dst_index 0 def + dup dst_string length gt + {dup string/dst_string exch def} + if + 1 index ct_CID_STR_SIZE idiv + /arrayIndex exch def + 2 index arrayIndex get + 2 index + arrayIndex ct_CID_STR_SIZE mul + sub + { + dup 3 index add 2 index length le + { + 2 index getinterval + dst_string dst_index 2 index putinterval + length dst_index add/dst_index exch def + exit + } + { + 1 index length 1 index sub + dup 4 1 roll + getinterval + dst_string dst_index 2 index putinterval + pop dup dst_index add/dst_index exch def + sub + /arrayIndex arrayIndex 1 add def + 2 index dup length arrayIndex gt + {arrayIndex get} + { + pop + exit + } + ifelse + 0 + } + ifelse + } + loop + pop pop pop + dst_string 0 dst_index getinterval + end + }bind def + ct_Level2? + { + /ct_resourcestatus + currentglobal mark true setglobal + {/unknowninstancename/Category resourcestatus} + stopped + {cleartomark setglobal true} + {cleartomark currentglobal not exch setglobal} + ifelse + { + { + mark 3 1 roll/Category findresource + begin + ct_Vars/vm currentglobal put + ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec + {cleartomark false} + {{3 2 roll pop true}{cleartomark false}ifelse} + ifelse + ct_Vars/vm get setglobal + end + } + } + {{resourcestatus}} + ifelse bind def + /CIDFont/Category ct_resourcestatus + {pop pop} + { + currentglobal true setglobal + /Generic/Category findresource + dup length dict copy + dup/InstanceType/dicttype put + /CIDFont exch/Category defineresource pop + setglobal + } + ifelse + ct_UseNativeCapability? + { + /CIDInit/ProcSet findresource begin + 12 dict begin + begincmap + /CIDSystemInfo 3 dict dup begin + /Registry(Adobe)def + /Ordering(Identity)def + /Supplement 0 def + end def + /CMapName/Identity-H def + /CMapVersion 1.000 def + /CMapType 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000>0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } + if + } + { + /ct_Category 2 dict begin + /CIDFont 10 dict def + /ProcSet 2 dict def + currentdict + end + def + /defineresource + { + ct_Category 1 index 2 copy known + { + get + dup dup maxlength exch length eq + { + dup length 10 add dict copy + ct_Category 2 index 2 index put + } + if + 3 index 3 index put + pop exch pop + } + {pop pop/defineresource/undefined ct_raise} + ifelse + }bind def + /findresource + { + ct_Category 1 index 2 copy known + { + get + 2 index 2 copy known + {get 3 1 roll pop pop} + {pop pop/findresource/undefinedresource ct_raise} + ifelse + } + {pop pop/findresource/undefined ct_raise} + ifelse + }bind def + /resourcestatus + { + ct_Category 1 index 2 copy known + { + get + 2 index known + exch pop exch pop + { + 0 -1 true + } + { + false + } + ifelse + } + {pop pop/findresource/undefined ct_raise} + ifelse + }bind def + /ct_resourcestatus/resourcestatus load def + } + ifelse + /ct_CIDInit 2 dict + begin + /ct_cidfont_stream_init + { + { + dup(Binary)eq + { + pop + null + currentfile + ct_Level2? + { + {cid_BYTE_COUNT()/SubFileDecode filter} + stopped + {pop pop pop} + if + } + if + /readstring load + exit + } + if + dup(Hex)eq + { + pop + currentfile + ct_Level2? + { + {null exch/ASCIIHexDecode filter/readstring} + stopped + {pop exch pop(>)exch/readhexstring} + if + } + {(>)exch/readhexstring} + ifelse + load + exit + } + if + /StartData/typecheck ct_raise + } + loop + cid_BYTE_COUNT ct_CID_STR_SIZE le + { + 2 copy cid_BYTE_COUNT string exch exec + pop + 1 array dup + 3 -1 roll + 0 exch put + } + { + cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi + dup array exch 2 sub 0 exch 1 exch + { + 2 copy + 5 index + ct_CID_STR_SIZE + string + 6 index exec + pop + put + pop + } + for + 2 index + cid_BYTE_COUNT ct_CID_STR_SIZE mod string + 3 index exec + pop + 1 index exch + 1 index length 1 sub + exch put + } + ifelse + cid_CIDFONT exch/GlyphData exch put + 2 index null eq + { + pop pop pop + } + { + pop/readstring load + 1 string exch + { + 3 copy exec + pop + dup length 0 eq + { + pop pop pop pop pop + true exit + } + if + 4 index + eq + { + pop pop pop pop + false exit + } + if + } + loop + pop + } + ifelse + }bind def + /StartData + { + mark + { + currentdict + dup/FDArray get 0 get/FontMatrix get + 0 get 0.001 eq + { + dup/CDevProc known not + { + /CDevProc 1183615869 internaldict/stdCDevProc 2 copy known + {get} + { + pop pop + {pop pop pop pop pop 0 -1000 7 index 2 div 880} + } + ifelse + def + } + if + } + { + /CDevProc + { + pop pop pop pop pop + 0 + 1 cid_temp/cid_CIDFONT get + /FDArray get 0 get + /FontMatrix get 0 get div + 7 index 2 div + 1 index 0.88 mul + }def + } + ifelse + /cid_temp 15 dict def + cid_temp + begin + /cid_CIDFONT exch def + 3 copy pop + dup/cid_BYTE_COUNT exch def 0 gt + { + ct_cidfont_stream_init + FDArray + { + /Private get + dup/SubrMapOffset known + { + begin + /Subrs SubrCount array def + Subrs + SubrMapOffset + SubrCount + SDBytes + ct_Level2? + { + currentdict dup/SubrMapOffset undef + dup/SubrCount undef + /SDBytes undef + } + if + end + /cid_SD_BYTES exch def + /cid_SUBR_COUNT exch def + /cid_SUBR_MAP_OFFSET exch def + /cid_SUBRS exch def + cid_SUBR_COUNT 0 gt + { + GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval + 0 cid_SD_BYTES ct_cvnsi + 0 1 cid_SUBR_COUNT 1 sub + { + exch 1 index + 1 add + cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add + GlyphData exch cid_SD_BYTES ct_GetInterval + 0 cid_SD_BYTES ct_cvnsi + cid_SUBRS 4 2 roll + GlyphData exch + 4 index + 1 index + sub + ct_GetInterval + dup length string copy put + } + for + pop + } + if + } + {pop} + ifelse + } + forall + } + if + cleartomark pop pop + end + CIDFontName currentdict/CIDFont defineresource pop + end end + } + stopped + {cleartomark/StartData ct_reraise} + if + }bind def + currentdict + end def + /ct_saveCIDInit + { + /CIDInit/ProcSet ct_resourcestatus + {true} + {/CIDInitC/ProcSet ct_resourcestatus} + ifelse + { + pop pop + /CIDInit/ProcSet findresource + ct_UseNativeCapability? + {pop null} + {/CIDInit ct_CIDInit/ProcSet defineresource pop} + ifelse + } + {/CIDInit ct_CIDInit/ProcSet defineresource pop null} + ifelse + ct_Vars exch/ct_oldCIDInit exch put + }bind def + /ct_restoreCIDInit + { + ct_Vars/ct_oldCIDInit get dup null ne + {/CIDInit exch/ProcSet defineresource pop} + {pop} + ifelse + }bind def + /ct_BuildCharSetUp + { + 1 index + begin + CIDFont + begin + Adobe_CoolType_Utility/ct_BuildCharDict get + begin + /ct_dfCharCode exch def + /ct_dfDict exch def + CIDFirstByte ct_dfCharCode add + dup CIDCount ge + {pop 0} + if + /cid exch def + { + GlyphDirectory cid 2 copy known + {get} + {pop pop nullstring} + ifelse + dup length FDBytes sub 0 gt + { + dup + FDBytes 0 ne + {0 FDBytes ct_cvnsi} + {pop 0} + ifelse + /fdIndex exch def + dup length FDBytes sub FDBytes exch getinterval + /charstring exch def + exit + } + { + pop + cid 0 eq + {/charstring nullstring def exit} + if + /cid 0 def + } + ifelse + } + loop + }def + /ct_SetCacheDevice + { + 0 0 moveto + dup stringwidth + 3 -1 roll + true charpath + pathbbox + 0 -1000 + 7 index 2 div 880 + setcachedevice2 + 0 0 moveto + }def + /ct_CloneSetCacheProc + { + 1 eq + { + stringwidth + pop -2 div -880 + 0 -1000 setcharwidth + moveto + } + { + usewidths? + { + currentfont/Widths get cid + 2 copy known + {get exch pop aload pop} + {pop pop stringwidth} + ifelse + } + {stringwidth} + ifelse + setcharwidth + 0 0 moveto + } + ifelse + }def + /ct_Type3ShowCharString + { + ct_FDDict fdIndex 2 copy known + {get} + { + currentglobal 3 1 roll + 1 index gcheck setglobal + ct_Type1FontTemplate dup maxlength dict copy + begin + FDArray fdIndex get + dup/FontMatrix 2 copy known + {get} + {pop pop ct_defaultFontMtx} + ifelse + /FontMatrix exch dup length array copy def + /Private get + /Private exch def + /Widths rootfont/Widths get def + /CharStrings 1 dict dup/.notdef + dup length string copy put def + currentdict + end + /ct_Type1Font exch definefont + dup 5 1 roll put + setglobal + } + ifelse + dup/CharStrings get 1 index/Encoding get + ct_dfCharCode get charstring put + rootfont/WMode 2 copy known + {get} + {pop pop 0} + ifelse + exch + 1000 scalefont setfont + ct_str1 0 ct_dfCharCode put + ct_str1 exch ct_dfSetCacheProc + ct_SyntheticBold + { + currentpoint + ct_str1 show + newpath + moveto + ct_str1 true charpath + ct_StrokeWidth setlinewidth + stroke + } + {ct_str1 show} + ifelse + }def + /ct_Type4ShowCharString + { + ct_dfDict ct_dfCharCode charstring + FDArray fdIndex get + dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not + {ct_1000Mtx matrix concatmatrix concat} + {pop} + ifelse + /Private get + Adobe_CoolType_Utility/ct_Level2? get not + { + ct_dfDict/Private + 3 -1 roll + {put} + 1183615869 internaldict/superexec get exec + } + if + 1183615869 internaldict + Adobe_CoolType_Utility/ct_Level2? get + {1 index} + {3 index/Private get mark 6 1 roll} + ifelse + dup/RunInt known + {/RunInt get} + {pop/CCRun} + ifelse + get exec + Adobe_CoolType_Utility/ct_Level2? get not + {cleartomark} + if + }bind def + /ct_BuildCharIncremental + { + { + Adobe_CoolType_Utility/ct_MakeOCF get begin + ct_BuildCharSetUp + ct_ShowCharString + } + stopped + {stop} + if + end + end + end + end + }bind def + /BaseFontNameStr(BF00)def + /ct_Type1FontTemplate 14 dict + begin + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0]def + /FontBBox [-250 -250 1250 1250]def + /Encoding ct_cHexEncoding def + /PaintType 0 def + currentdict + end def + /BaseFontTemplate 11 dict + begin + /FontMatrix [0.001 0 0 0.001 0 0]def + /FontBBox [-250 -250 1250 1250]def + /Encoding ct_cHexEncoding def + /BuildChar/ct_BuildCharIncremental load def + ct_Clone? + { + /FontType 3 def + /ct_ShowCharString/ct_Type3ShowCharString load def + /ct_dfSetCacheProc/ct_CloneSetCacheProc load def + /ct_SyntheticBold false def + /ct_StrokeWidth 1 def + } + { + /FontType 4 def + /Private 1 dict dup/lenIV 4 put def + /CharStrings 1 dict dup/.notdefput def + /PaintType 0 def + /ct_ShowCharString/ct_Type4ShowCharString load def + } + ifelse + /ct_str1 1 string def + currentdict + end def + /BaseFontDictSize BaseFontTemplate length 5 add def + /ct_matrixeq + { + true 0 1 5 + { + dup 4 index exch get exch 3 index exch get eq and + dup not + {exit} + if + } + for + exch pop exch pop + }bind def + /ct_makeocf + { + 15 dict + begin + exch/WMode exch def + exch/FontName exch def + /FontType 0 def + /FMapType 2 def + dup/FontMatrix known + {dup/FontMatrix get/FontMatrix exch def} + {/FontMatrix matrix def} + ifelse + /bfCount 1 index/CIDCount get 256 idiv 1 add + dup 256 gt{pop 256}if def + /Encoding + 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for + bfCount 1 255{2 copy bfCount put pop}for + def + /FDepVector bfCount dup 256 lt{1 add}if array def + BaseFontTemplate BaseFontDictSize dict copy + begin + /CIDFont exch def + CIDFont/FontBBox known + {CIDFont/FontBBox get/FontBBox exch def} + if + CIDFont/CDevProc known + {CIDFont/CDevProc get/CDevProc exch def} + if + currentdict + end + BaseFontNameStr 3(0)putinterval + 0 1 bfCount dup 256 eq{1 sub}if + { + FDepVector exch + 2 index BaseFontDictSize dict copy + begin + dup/CIDFirstByte exch 256 mul def + FontType 3 eq + {/ct_FDDict 2 dict def} + if + currentdict + end + 1 index 16 + BaseFontNameStr 2 2 getinterval cvrs pop + BaseFontNameStr exch definefont + put + } + for + ct_Clone? + {/Widths 1 index/CIDFont get/GlyphDirectory get length dict def} + if + FontName + currentdict + end + definefont + ct_Clone? + { + gsave + dup 1000 scalefont setfont + ct_BuildCharDict + begin + /usewidths? false def + currentfont/Widths get + begin + exch/CIDFont get/GlyphDirectory get + { + pop + dup charcode exch 1 index 0 2 index 256 idiv put + 1 index exch 1 exch 256 mod put + stringwidth 2 array astore def + } + forall + end + /usewidths? true def + end + grestore + } + {exch pop} + ifelse + }bind def + currentglobal true setglobal + /ct_ComposeFont + { + ct_UseNativeCapability? + { + 2 index/CMap ct_resourcestatus + {pop pop exch pop} + { + /CIDInit/ProcSet findresource + begin + 12 dict + begin + begincmap + /CMapName 3 index def + /CMapVersion 1.000 def + /CMapType 1 def + exch/WMode exch def + /CIDSystemInfo 3 dict dup + begin + /Registry(Adobe)def + /Ordering + CMapName ct_mkocfStr100 cvs + (Adobe-)search + { + pop pop + (-)search + { + dup length string copy + exch pop exch pop + } + {pop(Identity)} + ifelse + } + {pop (Identity)} + ifelse + def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000>0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } + ifelse + composefont + } + { + 3 2 roll pop + 0 get/CIDFont findresource + ct_makeocf + } + ifelse + }bind def + setglobal + /ct_MakeIdentity + { + ct_UseNativeCapability? + { + 1 index/CMap ct_resourcestatus + {pop pop} + { + /CIDInit/ProcSet findresource begin + 12 dict begin + begincmap + /CMapName 2 index def + /CMapVersion 1.000 def + /CMapType 1 def + /CIDSystemInfo 3 dict dup + begin + /Registry(Adobe)def + /Ordering + CMapName ct_mkocfStr100 cvs + (Adobe-)search + { + pop pop + (-)search + {dup length string copy exch pop exch pop} + {pop(Identity)} + ifelse + } + {pop(Identity)} + ifelse + def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000>0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } + ifelse + composefont + } + { + exch pop + 0 get/CIDFont findresource + ct_makeocf + } + ifelse + }bind def + currentdict readonly pop + end + end +%%EndResource +setglobal +%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 +%%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. +%%Version: 1.0 0 +userdict/ct_T42Dict 15 dict put +ct_T42Dict begin +/Is2015? +{ + version + cvi + 2015 + ge +}bind def +/AllocGlyphStorage +{ + Is2015? + { + pop + } + { + {string}forall + }ifelse +}bind def +/Type42DictBegin +{ +25 dict begin + /FontName exch def + /CharStrings 256 dict +begin + /.notdef 0 def + currentdict +end def + /Encoding exch def + /PaintType 0 def + /FontType 42 def + /FontMatrix[1 0 0 1 0 0]def + 4 array astore cvx/FontBBox exch def + /sfnts +}bind def +/Type42DictEnd +{ + currentdict dup/FontName get exch definefont end +ct_T42Dict exch +dup/FontName get exch put +}bind def +/RD{string currentfile exch readstring pop}executeonly def +/PrepFor2015 +{ +Is2015? +{ + /GlyphDirectory + 16 + dict def + sfnts 0 get + dup + 2 index + (glyx) + putinterval + 2 index + (locx) + putinterval + pop + pop +} +{ + pop + pop +}ifelse +}bind def +/AddT42Char +{ +Is2015? +{ + /GlyphDirectory get + begin + def + end + pop + pop +} +{ + /sfnts get + 4 index + get + 3 index + 2 index + putinterval + pop + pop + pop + pop +}ifelse +}bind def +/T0AddT42Mtx2 +{ +/CIDFont findresource/Metrics2 get begin def end +}bind def +end +%%EndResource +currentglobal true setglobal +%%BeginFile: MMFauxFont.prc +%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. +%%All Rights Reserved. +userdict /ct_EuroDict 10 dict put +ct_EuroDict begin +/ct_CopyFont +{ + { 1 index /FID ne {def} {pop pop} ifelse} forall +} def +/ct_GetGlyphOutline +{ + gsave + initmatrix newpath + exch findfont dup + length 1 add dict + begin + ct_CopyFont + /Encoding Encoding dup length array copy + dup + 4 -1 roll + 0 exch put + def + currentdict + end + /ct_EuroFont exch definefont + 1000 scalefont setfont + 0 0 moveto + [ + <00> stringwidth + <00> false charpath + pathbbox + [ + {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall + grestore + counttomark 8 add +} +def +/ct_MakeGlyphProc +{ + ] cvx + /ct_PSBuildGlyph cvx + ] cvx +} def +/ct_PSBuildGlyph +{ + gsave + 8 -1 roll pop + 7 1 roll + 6 -2 roll ct_FontMatrix transform 6 2 roll + 4 -2 roll ct_FontMatrix transform 4 2 roll + ct_FontMatrix transform + currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse + dup 9 1 roll + { + currentdict /StrokeWidth 2 copy known + { + get 2 div + 0 ct_FontMatrix dtransform pop + 5 1 roll + 4 -1 roll 4 index sub + 4 1 roll + 3 -1 roll 4 index sub + 3 1 roll + exch 4 index add exch + 4 index add + 5 -1 roll pop + } + { + pop pop + } + ifelse + } + if + setcachedevice + ct_FontMatrix concat + ct_PSPathOps begin + exec + end + { + currentdict /StrokeWidth 2 copy known + { get } + { pop pop 0 } + ifelse + setlinewidth stroke + } + { + fill + } + ifelse + grestore +} def +/ct_PSPathOps 4 dict dup begin + /m {moveto} def + /l {lineto} def + /c {curveto} def + /cp {closepath} def +end +def +/ct_matrix1000 [1000 0 0 1000 0 0] def +/ct_AddGlyphProc +{ + 2 index findfont dup length 4 add dict + begin + ct_CopyFont + /CharStrings CharStrings dup length 1 add dict copy + begin + 3 1 roll def + currentdict + end + def + /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def + /ct_PSBuildGlyph /ct_PSBuildGlyph load def + /ct_PSPathOps /ct_PSPathOps load def + currentdict + end + definefont pop +} +def +systemdict /languagelevel known +{ + /ct_AddGlyphToPrinterFont { + 2 copy + ct_GetGlyphOutline 3 add -1 roll restore + ct_MakeGlyphProc + ct_AddGlyphProc + } def +} +{ + /ct_AddGlyphToPrinterFont { + pop pop restore + Adobe_CTFauxDict /$$$FONTNAME get + /Euro + Adobe_CTFauxDict /$$$SUBSTITUTEBASE get + ct_EuroDict exch get + ct_AddGlyphProc + } def +} ifelse +/AdobeSansMM +{ +556 0 24 -19 541 703 + { + 541 628 m + 510 669 442 703 354 703 c + 201 703 117 607 101 444 c + 50 444 l + 25 372 l + 97 372 l + 97 301 l + 49 301 l + 24 229 l + 103 229 l + 124 67 209 -19 350 -19 c + 435 -19 501 25 509 32 c + 509 131 l + 492 105 417 60 343 60 c + 267 60 204 127 197 229 c + 406 229 l + 430 301 l + 191 301 l + 191 372 l + 455 372 l + 479 444 l + 194 444 l + 201 531 245 624 348 624 c + 433 624 484 583 509 534 c + cp + 556 0 m + } +ct_PSBuildGlyph +} def +/AdobeSerifMM +{ +500 0 10 -12 484 692 + { + 347 298 m + 171 298 l + 170 310 170 322 170 335 c + 170 362 l + 362 362 l + 374 403 l + 172 403 l + 184 580 244 642 308 642 c + 380 642 434 574 457 457 c + 481 462 l + 474 691 l + 449 691 l + 433 670 429 657 410 657 c + 394 657 360 692 299 692 c + 204 692 94 604 73 403 c + 22 403 l + 10 362 l + 70 362 l + 69 352 69 341 69 330 c + 69 319 69 308 70 298 c + 22 298 l + 10 257 l + 73 257 l + 97 57 216 -12 295 -12 c + 364 -12 427 25 484 123 c + 458 142 l + 425 101 384 37 316 37 c + 256 37 189 84 173 257 c + 335 257 l + cp + 500 0 m + } +ct_PSBuildGlyph +} def +end +%%EndFile +setglobal +Adobe_CoolType_Core begin /$None SetSubstituteStrategy end +%%BeginResource: procset Adobe_AGM_Image 1.0 0 +%%Version: 1.0 0 +%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. +systemdict/setpacking known +{ + currentpacking + true setpacking +}if +userdict/Adobe_AGM_Image 71 dict dup begin put +/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def +/nd{ + null def +}bind def +/AGMIMG_&image nd +/AGMIMG_&colorimage nd +/AGMIMG_&imagemask nd +/AGMIMG_mbuf()def +/AGMIMG_ybuf()def +/AGMIMG_kbuf()def +/AGMIMG_c 0 def +/AGMIMG_m 0 def +/AGMIMG_y 0 def +/AGMIMG_k 0 def +/AGMIMG_tmp nd +/AGMIMG_imagestring0 nd +/AGMIMG_imagestring1 nd +/AGMIMG_imagestring2 nd +/AGMIMG_imagestring3 nd +/AGMIMG_imagestring4 nd +/AGMIMG_imagestring5 nd +/AGMIMG_cnt nd +/AGMIMG_fsave nd +/AGMIMG_colorAry nd +/AGMIMG_override nd +/AGMIMG_name nd +/AGMIMG_maskSource nd +/AGMIMG_flushfilters nd +/invert_image_samples nd +/knockout_image_samples nd +/img nd +/sepimg nd +/devnimg nd +/idximg nd +/ds +{ + Adobe_AGM_Core begin + Adobe_AGM_Image begin + /AGMIMG_&image systemdict/image get def + /AGMIMG_&imagemask systemdict/imagemask get def + /colorimage where{ + pop + /AGMIMG_&colorimage/colorimage ldf + }if + end + end +}def +/ps +{ + Adobe_AGM_Image begin + /AGMIMG_ccimage_exists{/customcolorimage where + { + pop + /Adobe_AGM_OnHost_Seps where + { + pop false + }{ + /Adobe_AGM_InRip_Seps where + { + pop false + }{ + true + }ifelse + }ifelse + }{ + false + }ifelse + }bdf + level2{ + /invert_image_samples + { + Adobe_AGM_Image/AGMIMG_tmp Decode length ddf + /Decode[Decode 1 get Decode 0 get]def + }def + /knockout_image_samples + { + Operator/imagemask ne{ + /Decode[1 1]def + }if + }def + }{ + /invert_image_samples + { + {1 exch sub}currenttransfer addprocs settransfer + }def + /knockout_image_samples + { + {pop 1}currenttransfer addprocs settransfer + }def + }ifelse + /img/imageormask ldf + /sepimg/sep_imageormask ldf + /devnimg/devn_imageormask ldf + /idximg/indexed_imageormask ldf + /_ctype 7 def + currentdict{ + dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ + bind + }if + def + }forall +}def +/pt +{ + end +}def +/dt +{ +}def +/AGMIMG_flushfilters +{ + dup type/arraytype ne + {1 array astore}if + dup 0 get currentfile ne + {dup 0 get flushfile}if + { + dup type/filetype eq + { + dup status 1 index currentfile ne and + {closefile} + {pop} + ifelse + }{pop}ifelse + }forall +}def +/AGMIMG_init_common +{ + currentdict/T known{/ImageType/T ldf currentdict/T undef}if + currentdict/W known{/Width/W ldf currentdict/W undef}if + currentdict/H known{/Height/H ldf currentdict/H undef}if + currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if + currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if + currentdict/D known{/Decode/D ldf currentdict/D undef}if + currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if + currentdict/O known{ + /Operator/O load 1 eq{ + /imagemask + }{ + /O load 2 eq{ + /image + }{ + /colorimage + }ifelse + }ifelse + def + currentdict/O undef + }if + currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if + currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if + currentdict/I known{/Interpolate/I ldf currentdict/I undef}if + currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if + /DataSource load xcheck not{ + DataSource type/arraytype eq{ + DataSource 0 get type/filetype eq{ + /_Filters DataSource def + currentdict/MultipleDataSources known not{ + /DataSource DataSource dup length 1 sub get def + }if + }if + }if + currentdict/MultipleDataSources known not{ + /MultipleDataSources DataSource type/arraytype eq{ + DataSource length 1 gt + } + {false}ifelse def + }if + }if + /NComponents Decode length 2 div def + currentdict/SkipImageProc known not{/SkipImageProc{false}def}if +}bdf +/imageormask_sys +{ + begin + AGMIMG_init_common + save mark + level2{ + currentdict + Operator/imagemask eq{ + AGMIMG_&imagemask + }{ + use_mask{ + process_mask AGMIMG_&image + }{ + AGMIMG_&image + }ifelse + }ifelse + }{ + Width Height + Operator/imagemask eq{ + Decode 0 get 1 eq Decode 1 get 0 eq and + ImageMatrix/DataSource load + AGMIMG_&imagemask + }{ + BitsPerComponent ImageMatrix/DataSource load + AGMIMG_&image + }ifelse + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + cleartomark restore + end +}def +/overprint_plate +{ + currentoverprint{ + 0 get dup type/nametype eq{ + dup/DeviceGray eq{ + pop AGMCORE_black_plate not + }{ + /DeviceCMYK eq{ + AGMCORE_is_cmyk_sep not + }if + }ifelse + }{ + false exch + { + AGMOHS_sepink eq or + }forall + not + }ifelse + }{ + pop false + }ifelse +}def +/process_mask +{ + level3{ + dup begin + /ImageType 1 def + end + 4 dict begin + /DataDict exch def + /ImageType 3 def + /InterleaveType 3 def + /MaskDict 9 dict begin + /ImageType 1 def + /Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def + /Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def + /ImageMatrix[Width 0 0 Height neg 0 Height]def + /NComponents 1 def + /BitsPerComponent 1 def + /Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def + /DataSource Adobe_AGM_Core/AGMIMG_maskSource get def + currentdict end def + currentdict end + }if +}def +/use_mask +{ + dup/Mask known {dup/Mask get}{false}ifelse +}def +/imageormask +{ + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + } + { + save mark + level2 AGMCORE_host_sep not and{ + currentdict + Operator/imagemask eq DeviceN_PS2 not and{ + imagemask + }{ + AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{ + [/Separation/Black/DeviceGray{}]setcolorspace + /Decode[Decode 1 get Decode 0 get]def + }if + use_mask{ + process_mask image + }{ + DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and + { + Names convert_to_process not{ + 2 dict begin + /imageDict xdf + /names_index 0 def + gsave + imageDict write_image_file{ + Names{ + dup(None)ne{ + [/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace + Operator imageDict read_image_file + names_index 0 eq{true setoverprint}if + /names_index names_index 1 add def + }{ + pop + }ifelse + }forall + close_image_file + }if + grestore + end + }{ + Operator/imagemask eq{ + imagemask + }{ + image + }ifelse + }ifelse + }{ + Operator/imagemask eq{ + imagemask + }{ + image + }ifelse + }ifelse + }ifelse + }ifelse + }{ + Width Height + Operator/imagemask eq{ + Decode 0 get 1 eq Decode 1 get 0 eq and + ImageMatrix/DataSource load + /Adobe_AGM_OnHost_Seps where{ + pop imagemask + }{ + currentgray 1 ne{ + currentdict imageormask_sys + }{ + currentoverprint not{ + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentdict ignoreimagedata + }ifelse + }ifelse + }ifelse + }{ + BitsPerComponent ImageMatrix + MultipleDataSources{ + 0 1 NComponents 1 sub{ + DataSource exch get + }for + }{ + /DataSource load + }ifelse + Operator/colorimage eq{ + AGMCORE_host_sep{ + MultipleDataSources level2 or NComponents 4 eq and{ + AGMCORE_is_cmyk_sep{ + MultipleDataSources{ + /DataSource DataSource 0 get xcheck + { + [ + DataSource 0 get/exec cvx + DataSource 1 get/exec cvx + DataSource 2 get/exec cvx + DataSource 3 get/exec cvx + /AGMCORE_get_ink_data cvx + ]cvx + }{ + DataSource aload pop AGMCORE_get_ink_data + }ifelse def + }{ + /DataSource + Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul + /DataSource load + filter_cmyk 0()/SubFileDecode filter def + }ifelse + /Decode[Decode 0 get Decode 1 get]def + /MultipleDataSources false def + /NComponents 1 def + /Operator/image def + invert_image_samples + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentoverprint not Operator/imagemask eq and{ + 1 AGMCORE_&setgray + currentdict imageormask_sys + }{ + currentdict ignoreimagedata + }ifelse + }ifelse + }{ + MultipleDataSources NComponents AGMIMG_&colorimage + }ifelse + }{ + true NComponents colorimage + }ifelse + }{ + Operator/image eq{ + AGMCORE_host_sep{ + /DoImage true def + currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse + { + AGMCORE_black_plate not Operator/imagemask ne and{ + /DoImage false def + currentdict ignoreimagedata + }if + }if + 1 AGMCORE_&setgray + DoImage + {currentdict imageormask_sys}if + }{ + use_mask{ + process_mask image + }{ + image + }ifelse + }ifelse + }{ + Operator/knockout eq{ + pop pop pop pop pop + currentcolorspace overprint_plate not{ + knockout_unitsq + }if + }if + }ifelse + }ifelse + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end +}def +/sep_imageormask +{ + /sep_colorspace_dict AGMCORE_gget begin + CSA map_csa + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + }{ + save mark + AGMCORE_avoid_L2_sep_space{ + /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def + }if + AGMIMG_ccimage_exists + MappedCSA 0 get/DeviceCMYK eq and + currentdict/Components known and + Name()ne and + Name(All)ne and + Operator/image eq and + AGMCORE_producing_seps not and + level2 not and + { + Width Height BitsPerComponent ImageMatrix + [ + /DataSource load/exec cvx + { + 0 1 2 index length 1 sub{ + 1 index exch + 2 copy get 255 xor put + }for + }/exec cvx + ]cvx bind + MappedCSA 0 get/DeviceCMYK eq{ + Components aload pop + }{ + 0 0 0 Components aload pop 1 exch sub + }ifelse + Name findcmykcustomcolor + customcolorimage + }{ + AGMCORE_producing_seps not{ + level2{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{ + [/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt + /sep_tint AGMCORE_gget setcolor + }if + currentdict imageormask + }{ + currentdict + Operator/imagemask eq{ + imageormask + }{ + sep_imageormask_lev1 + }ifelse + }ifelse + }{ + AGMCORE_host_sep{ + Operator/knockout eq{ + currentdict/ImageMatrix get concat + knockout_unitsq + }{ + currentgray 1 ne{ + AGMCORE_is_cmyk_sep Name(All)ne and{ + level2{ + Name AGMCORE_IsSeparationAProcessColor + { + Operator/imagemask eq{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor + }if + }{ + invert_image_samples + }ifelse + }{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + [/Separation Name[/DeviceGray] + { + sep_colorspace_proc AGMCORE_get_ink_data + 1 exch sub + }bind + ]AGMCORE_&setcolorspace + /sep_tint AGMCORE_gget AGMCORE_&setcolor + }if + }ifelse + currentdict imageormask_sys + }{ + currentdict + Operator/imagemask eq{ + imageormask_sys + }{ + sep_image_lev1_sep + }ifelse + }ifelse + }{ + Operator/imagemask ne{ + invert_image_samples + }if + currentdict imageormask_sys + }ifelse + }{ + currentoverprint not Name(All)eq or Operator/imagemask eq and{ + currentdict imageormask_sys + }{ + currentoverprint not + { + gsave + knockout_unitsq + grestore + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ + currentcolorspace 0 get/Separation ne{ + [/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt + /sep_tint AGMCORE_gget setcolor + }if + }if + currentoverprint + MappedCSA 0 get/DeviceCMYK eq and + Name AGMCORE_IsSeparationAProcessColor not and + //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse + Name(All)ne and{ + imageormask_l2_overprint + }{ + currentdict imageormask + }ifelse + }ifelse + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end + end +}def +/colorSpaceElemCnt +{ + mark currentcolor counttomark dup 2 add 1 roll cleartomark +}bdf +/devn_sep_datasource +{ + 1 dict begin + /dataSource xdf + [ + 0 1 dataSource length 1 sub{ + dup currentdict/dataSource get/exch cvx/get cvx/exec cvx + /exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx + }for + ]cvx bind + end +}bdf +/devn_alt_datasource +{ + 11 dict begin + /convProc xdf + /origcolorSpaceElemCnt xdf + /origMultipleDataSources xdf + /origBitsPerComponent xdf + /origDecode xdf + /origDataSource xdf + /dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def + /DataSource origMultipleDataSources + { + [ + BitsPerComponent 8 idiv origDecode length 2 idiv mul string + 0 1 origDecode length 2 idiv 1 sub + { + dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch + origDataSource exch get 0()/SubFileDecode filter + BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx + }for + ]bind cvx + }{origDataSource}ifelse 0()/SubFileDecode filter def + [ + origcolorSpaceElemCnt string + 0 2 origDecode length 2 sub + { + dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div + 1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx + }for + /convProc load/exec cvx + origcolorSpaceElemCnt 1 sub -1 0 + { + /dup cvx 2/add cvx/index cvx + 3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx + }for + ]bind cvx 0()/SubFileDecode filter + end +}bdf +/devn_imageormask +{ + /devicen_colorspace_dict AGMCORE_gget begin + CSA map_csa + 2 dict begin + dup + /srcDataStrs[3 -1 roll begin + AGMIMG_init_common + currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse + { + Width Decode length 2 div mul cvi + { + dup 65535 gt{1 add 2 div cvi}{exit}ifelse + }loop + string + }repeat + end]def + /dstDataStr srcDataStrs 0 get length string def + begin + AGMIMG_init_common + SkipImageProc{ + currentdict consumeimagedata + }{ + save mark + AGMCORE_producing_seps not{ + level3 not{ + Operator/imagemask ne{ + /DataSource[[ + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def + /MultipleDataSources true def + /Decode colorSpaceElemCnt[exch{0 1}repeat]def + }if + }if + currentdict imageormask + }{ + AGMCORE_host_sep{ + Names convert_to_process{ + CSA get_csa_by_name 0 get/DeviceCMYK eq{ + /DataSource + Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + 4/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource + filter_cmyk 0()/SubFileDecode filter def + /MultipleDataSources false def + /Decode[1 0]def + /DeviceGray setcolorspace + currentdict imageormask_sys + }{ + AGMCORE_report_unsupported_color_space + AGMCORE_black_plate{ + /DataSource + DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse + CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get + devn_alt_datasource + /MultipleDataSources false def + /Decode colorSpaceElemCnt[exch{0 1}repeat]def + currentdict imageormask_sys + }{ + gsave + knockout_unitsq + grestore + currentdict consumeimagedata + }ifelse + }ifelse + } + { + /devicen_colorspace_dict AGMCORE_gget/names_index known{ + Operator/imagemask ne{ + MultipleDataSources{ + /DataSource[DataSource devn_sep_datasource/exec cvx]cvx def + /MultipleDataSources false def + }{ + /DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def + }ifelse + invert_image_samples + }if + currentdict imageormask_sys + }{ + currentoverprint not Operator/imagemask eq and{ + currentdict imageormask_sys + }{ + currentoverprint not + { + gsave + knockout_unitsq + grestore + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + currentdict imageormask + }ifelse + }ifelse + cleartomark restore + }ifelse + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end + end + end +}def +/imageormask_l2_overprint +{ + currentdict + currentcmykcolor add add add 0 eq{ + currentdict consumeimagedata + }{ + level3{ + currentcmykcolor + /AGMIMG_k xdf + /AGMIMG_y xdf + /AGMIMG_m xdf + /AGMIMG_c xdf + Operator/imagemask eq{ + [/DeviceN[ + AGMIMG_c 0 ne{/Cyan}if + AGMIMG_m 0 ne{/Magenta}if + AGMIMG_y 0 ne{/Yellow}if + AGMIMG_k 0 ne{/Black}if + ]/DeviceCMYK{}]setcolorspace + AGMIMG_c 0 ne{AGMIMG_c}if + AGMIMG_m 0 ne{AGMIMG_m}if + AGMIMG_y 0 ne{AGMIMG_y}if + AGMIMG_k 0 ne{AGMIMG_k}if + setcolor + }{ + /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def + [/Indexed + [ + /DeviceN[ + AGMIMG_c 0 ne{/Cyan}if + AGMIMG_m 0 ne{/Magenta}if + AGMIMG_y 0 ne{/Yellow}if + AGMIMG_k 0 ne{/Black}if + ] + /DeviceCMYK{ + AGMIMG_k 0 eq{0}if + AGMIMG_y 0 eq{0 exch}if + AGMIMG_m 0 eq{0 3 1 roll}if + AGMIMG_c 0 eq{0 4 1 roll}if + } + ] + 255 + { + 255 div + mark exch + dup dup dup + AGMIMG_k 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_y 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_m 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + AGMIMG_c 0 ne{ + /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop + counttomark 1 roll + }{ + pop + }ifelse + counttomark 1 add -1 roll pop + } + ]setcolorspace + }ifelse + imageormask_sys + }{ + write_image_file{ + currentcmykcolor + 0 ne{ + [/Separation/Black/DeviceGray{}]setcolorspace + gsave + /Black + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Yellow/DeviceGray{}]setcolorspace + gsave + /Yellow + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Magenta/DeviceGray{}]setcolorspace + gsave + /Magenta + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + 0 ne{ + [/Separation/Cyan/DeviceGray{}]setcolorspace + gsave + /Cyan + [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx] + cvx modify_halftone_xfer + Operator currentdict read_image_file + grestore + }if + close_image_file + }{ + imageormask + }ifelse + }ifelse + }ifelse +}def +/indexed_imageormask +{ + begin + AGMIMG_init_common + save mark + currentdict + AGMCORE_host_sep{ + Operator/knockout eq{ + /indexed_colorspace_dict AGMCORE_gget dup/CSA known{ + /CSA get get_csa_by_name + }{ + /Names get + }ifelse + overprint_plate not{ + knockout_unitsq + }if + }{ + Indexed_DeviceN{ + /devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{ + indexed_image_lev2_sep + }{ + currentoverprint not{ + knockout_unitsq + }if + currentdict consumeimagedata + }ifelse + }{ + AGMCORE_is_cmyk_sep{ + Operator/imagemask eq{ + imageormask_sys + }{ + level2{ + indexed_image_lev2_sep + }{ + indexed_image_lev1_sep + }ifelse + }ifelse + }{ + currentoverprint not{ + knockout_unitsq + }if + currentdict consumeimagedata + }ifelse + }ifelse + }ifelse + }{ + level2{ + Indexed_DeviceN{ + /indexed_colorspace_dict AGMCORE_gget begin + }{ + /indexed_colorspace_dict AGMCORE_gget dup null ne + { + begin + currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse + get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and + AGMCORE_in_rip_sep and{ + [/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup] + setcolorspace + }if + end + } + {pop}ifelse + }ifelse + imageormask + Indexed_DeviceN{ + end + }if + }{ + Operator/imagemask eq{ + imageormask + }{ + indexed_imageormask_lev1 + }ifelse + }ifelse + }ifelse + cleartomark restore + currentdict/_Filters known{_Filters AGMIMG_flushfilters}if + end +}def +/indexed_image_lev2_sep +{ + /indexed_colorspace_dict AGMCORE_gget begin + begin + Indexed_DeviceN not{ + currentcolorspace + dup 1/DeviceGray put + dup 3 + currentcolorspace 2 get 1 add string + 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub + { + dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put + }for + put setcolorspace + }if + currentdict + Operator/imagemask eq{ + AGMIMG_&imagemask + }{ + use_mask{ + process_mask AGMIMG_&image + }{ + AGMIMG_&image + }ifelse + }ifelse + end end +}def + /OPIimage + { + dup type/dicttype ne{ + 10 dict begin + /DataSource xdf + /ImageMatrix xdf + /BitsPerComponent xdf + /Height xdf + /Width xdf + /ImageType 1 def + /Decode[0 1 def] + currentdict + end + }if + dup begin + /NComponents 1 cdndf + /MultipleDataSources false cdndf + /SkipImageProc{false}cdndf + /Decode[ + 0 + currentcolorspace 0 get/Indexed eq{ + 2 BitsPerComponent exp 1 sub + }{ + 1 + }ifelse + ]cdndf + /Operator/image cdndf + end + /sep_colorspace_dict AGMCORE_gget null eq{ + imageormask + }{ + gsave + dup begin invert_image_samples end + sep_imageormask + grestore + }ifelse + }def +/cachemask_level2 +{ + 3 dict begin + /LZWEncode filter/WriteFilter xdf + /readBuffer 256 string def + /ReadFilter + currentfile + 0(%EndMask)/SubFileDecode filter + /ASCII85Decode filter + /RunLengthDecode filter + def + { + ReadFilter readBuffer readstring exch + WriteFilter exch writestring + not{exit}if + }loop + WriteFilter closefile + end +}def +/spot_alias +{ + /mapto_sep_imageormask + { + dup type/dicttype ne{ + 12 dict begin + /ImageType 1 def + /DataSource xdf + /ImageMatrix xdf + /BitsPerComponent xdf + /Height xdf + /Width xdf + /MultipleDataSources false def + }{ + begin + }ifelse + /Decode[/customcolor_tint AGMCORE_gget 0]def + /Operator/image def + /SkipImageProc{false}def + currentdict + end + sep_imageormask + }bdf + /customcolorimage + { + Adobe_AGM_Image/AGMIMG_colorAry xddf + /customcolor_tint AGMCORE_gget + << + /Name AGMIMG_colorAry 4 get + /CSA[/DeviceCMYK] + /TintMethod/Subtractive + /TintProc null + /MappedCSA null + /NComponents 4 + /Components[AGMIMG_colorAry aload pop pop] + >> + setsepcolorspace + mapto_sep_imageormask + }ndf + Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put + /customcolorimage + { + Adobe_AGM_Image/AGMIMG_override false put + current_spot_alias{dup 4 get map_alias}{false}ifelse + { + false set_spot_alias + /customcolor_tint AGMCORE_gget exch setsepcolorspace + pop + mapto_sep_imageormask + true set_spot_alias + }{ + //Adobe_AGM_Image/AGMIMG_&customcolorimage get exec + }ifelse + }bdf +}def +/snap_to_device +{ + 6 dict begin + matrix currentmatrix + dup 0 get 0 eq 1 index 3 get 0 eq and + 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop + { + 1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def + 0 0 transform + AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch + AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch + itransform/AGMIMG_llY exch def/AGMIMG_llX exch def + 1 1 transform + AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch + AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch + itransform/AGMIMG_urY exch def/AGMIMG_urX exch def + [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat + }{ + }ifelse + end +}def +level2 not{ + /colorbuf + { + 0 1 2 index length 1 sub{ + dup 2 index exch get + 255 exch sub + 2 index + 3 1 roll + put + }for + }def + /tint_image_to_color + { + begin + Width Height BitsPerComponent ImageMatrix + /DataSource load + end + Adobe_AGM_Image begin + /AGMIMG_mbuf 0 string def + /AGMIMG_ybuf 0 string def + /AGMIMG_kbuf 0 string def + { + colorbuf dup length AGMIMG_mbuf length ne + { + dup length dup dup + /AGMIMG_mbuf exch string def + /AGMIMG_ybuf exch string def + /AGMIMG_kbuf exch string def + }if + dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop + } + addprocs + {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage + end + }def + /sep_imageormask_lev1 + { + begin + MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ + { + 255 mul round cvi GrayLookup exch get + }currenttransfer addprocs settransfer + currentdict imageormask + }{ + /sep_colorspace_dict AGMCORE_gget/Components known{ + MappedCSA 0 get/DeviceCMYK eq{ + Components aload pop + }{ + 0 0 0 Components aload pop 1 exch sub + }ifelse + Adobe_AGM_Image/AGMIMG_k xddf + Adobe_AGM_Image/AGMIMG_y xddf + Adobe_AGM_Image/AGMIMG_m xddf + Adobe_AGM_Image/AGMIMG_c xddf + AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ + {AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer + currentdict imageormask + }{ + currentcolortransfer + {AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll + {AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }ifelse + }{ + MappedCSA 0 get/DeviceGray eq{ + {255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer + currentdict imageormask + }{ + MappedCSA 0 get/DeviceCMYK eq{ + currentcolortransfer + {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }{ + currentcolortransfer + {pop 1}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll + {255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll + setcolortransfer + currentdict tint_image_to_color + }ifelse + }ifelse + }ifelse + }ifelse + end + }def + /sep_image_lev1_sep + { + begin + /sep_colorspace_dict AGMCORE_gget/Components known{ + Components aload pop + Adobe_AGM_Image/AGMIMG_k xddf + Adobe_AGM_Image/AGMIMG_y xddf + Adobe_AGM_Image/AGMIMG_m xddf + Adobe_AGM_Image/AGMIMG_c xddf + {AGMIMG_c mul 1 exch sub} + {AGMIMG_m mul 1 exch sub} + {AGMIMG_y mul 1 exch sub} + {AGMIMG_k mul 1 exch sub} + }{ + {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} + {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} + }ifelse + AGMCORE_get_ink_data currenttransfer addprocs settransfer + currentdict imageormask_sys + end + }def + /indexed_imageormask_lev1 + { + /indexed_colorspace_dict AGMCORE_gget begin + begin + currentdict + MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ + {HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer + imageormask + }{ + MappedCSA 0 get/DeviceGray eq{ + {HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer + imageormask + }{ + MappedCSA 0 get/DeviceCMYK eq{ + currentcolortransfer + {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll + setcolortransfer + tint_image_to_color + }{ + currentcolortransfer + {pop 1}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll + {3 mul HiVal mul round cvi Lookup exch get HiVal div}exch addprocs 4 1 roll + setcolortransfer + tint_image_to_color + }ifelse + }ifelse + }ifelse + end end + }def + /indexed_image_lev1_sep + { + /indexed_colorspace_dict AGMCORE_gget begin + begin + {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} + {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} + AGMCORE_get_ink_data currenttransfer addprocs settransfer + currentdict imageormask_sys + end end + }def +}if +end +systemdict/setpacking known +{setpacking}if +%%EndResource +currentdict Adobe_AGM_Utils eq {end} if +%%EndProlog +%%BeginSetup +Adobe_AGM_Utils begin +2 2010 Adobe_AGM_Core/ds gx +Adobe_CoolType_Core/ds get exec +Adobe_AGM_Image/ds gx +[/NamespacePush pdfmark_5 +[/_objdef {Doc_Metadata} /type /stream /OBJ pdfmark_5 +[{Doc_Metadata} 1281 (% &end XMP packet& %) ReadBypdfmark_5_string + + + + + + + test03 + + + + + TeX output 2011.04.08:1517 + + + + + Donald Story (Complimentary Copy) 4662 2009-10-23 13:17:17 + + + + + + + + + + + + + + + + + + + + + + + + +% &end XMP packet& % + +[{Doc_Metadata} 2 dict begin /Type /Metadata def /Subtype /XML def currentdict end /PUT pdfmark_5 +[/Document 1 dict begin /Metadata {Doc_Metadata} def currentdict end /BDC pdfmark_5 +[/NamespacePop pdfmark_5 +currentdict Adobe_AGM_Utils eq {end} if +%%EndSetup +%%Page: 1 1 +%%EndPageComments +%%BeginPageSetup +Adobe_AGM_Utils begin +Adobe_AGM_Core/ps gx +Adobe_AGM_Core/capture_mysetup gx +Adobe_AGM_Utils/capture_cpd gx +Adobe_CoolType_Core/ps get exec +Adobe_AGM_Image/ps gx +%%EndPageSetup +1 -1 scale 0 -194.951 translate +pgsv +[1 0 0 1 0 0 ]ct +gsave +np +gsave +-7.62939e-6 0 mo +-7.62939e-6 194.951 li +256.793 194.951 li +256.793 0 li +cp +clp +false sop +/0 +<< +/Name (Black) +/0 +[/DeviceCMYK] /CSA add_res +/CSA /0 get_csa_by_name +/MappedCSA /0 /CSA get_res +/TintMethod /Subtractive +/TintProc null +/NComponents 4 +/Components [ 0 0 0 1 ] +>> +/CSD add_res +1 /0 /CSD get_res sepcs +1 sep +%ADOBeginSubsetFont: GLAAAA+CMR10 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /GLAAAA+CMR10 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1994 Blue Sky Research and Y&Y, Inc. http://www.YandY.com) def +/Weight (Medium) def +/ItalicAngle 0 def +/BaseFontName (CMR10) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 47 /slash put +dup 48 /zero put +dup 49 /one put +dup 51 /three put +dup 53 /five put +dup 65 /A put +dup 67 /C put +dup 73 /I put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 97 /a put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 111 /o put +dup 123 /endash put +def +/UniqueID 5000793 def +/FontBBox {-40 -250 1009 969} def +end +systemdict begin +dup /Private +13 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-22 -0 683 705 431 448 666 677] def +/OtherBlues [-206 -194] def +/BlueScale 0.04379 def +/StdHW [31] def +/StdVW [69] def +/StemSnapH [22 31] def +/StemSnapV [69 89] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +23 dict dup begin +/slash <1C60D8A8C9B7A73DB56225352A24C6E389DE2B55CA06CAB1D904D74F +E21B6520E910DE6837DBFFB95567192F781E541A03B8446689265DEAE7140ED2 +3D1C3943714CDFC12315> |- +/zero <1C60D8A8C9B7A73D3B2D32309B1F5D5A32FC3614834F8BC61B6EB92C1 +2484BD76628737DA40CF9DA1C97CCDAFB1D1B732C642F74A7C41B7D3AC6DAF8D +1E760692B6EBD2417EF1893A4AA0B1CF049D4C54D830CEC073A9153D451FAD42 +892B0930AEE4FE18588336BFDAD60D8A4F4CFFED76F103FB9BBD8A33EFBA3F18 +232B88D88FE54E17260FA3E2CC29DEC0CB72B88DC816FF5> |- +/one <1C60D8A8C9B7A73DC579B9CE13A4EA8C203AFC890ABD6F58341B006CF1 +BDD8FED3A7238E01F751FEAC75885229C293891E5636AD630D9C884528B6FEF0 +0728A740ED77D054B4743ECA5E3947520FEF6B23D548765D11> |- +/three <1C60D8A8C9B7A73D3B2B97DEB4C7BDB68E0D63865C8BF294429AD1BA +AE59A25299F9306A9E28AA5C0C0AF9F97F56096DB0FD0EC440ACCE834B0BA539 +2FD94D026768A961AA5D1A88FAE30F2B2033E77AFAB55B0B9C8092CD226DD9EF +EEAAF5CD5AE79D6DDEC4C37DC43DE3B85DD2A2EC4DC0C9F349D5E8F9F615782E +DC8C53805553FD3C0007C1818BF3D99AB659A079ED36132BBDC613CA63D7A0FE +429706DBC6BA998CE56A89C002758EF37F90A390F83B3DFE49D312FA66FDF2F1 +6212D1503559B35FC2DB8BD5A49535> |- +/five <1C60D8A8C9B7A73D3B2B97F19D54A2E00E7DDA8E72064220CB7581D13 +CEDF071F346430E40993A6297E3A2A6D6093205222D977AC7F7B65CC82B221D9 +B18ADEA5D4AF0261ABF060D3E283C7B3B5EB39FF499721FD51203AE59E3BEA25 +7DFD3E472FEF67221488EC8D1F355E2FAD057CA44A8B4BAD6C6C719C164907CB +F9A6CC770DB0C7E58A37D2385E23F576BCFF94FFBFD8ADD4C5E6C32CD83ACEB7 +7472D00FE1A4DC66393A99AC6BBD252B04C98B710149EA42B66ACE89D4FC4393 +F3A09165DF477ABCB0E8A8DB21E4278CA219EBCC9B067F92619913BDBD1EF3C9 +A> |- +/A <1C60D8A8C9B08A9501CDAE1251A61DF6E2312CA41635F6CE1D00B63E171C +70F84D42F62A21A6DD37D84C279E3FAE908D39B730ACD671ED9E277ACFE833A1 +1F48F076C9803DC08258033731BCBCE19DF3B81C1C298B382A15FAC94387A992 +AD9631716A7ED4F711137D6C851AE1C8DCBBFBCF7274E882226E58958CE6283A +197E7FAE3A2D0F6C24FA411BECFB36A10FF2A923EA89ABEFAD5AB23D600F> |- +/C <1C60D8A8C9B08A9454CA4C75C5C983901A105955FD02AB95A1C2D2A205D6 +C9A19566388580DAF81E45849DB37660797B67B5A88B6906602915C5F5C9B0EC +D18BF9F52BC4BC58CA3DC88745B8BAABAD3D92E461BFB415E7240305CDDA1D0D +B5D35FEBC75FFD4C053E78B6CA772ACEB0C2FF98C08B672F492F305E0C5F3841 +918729B4AEB78A65C2A83364408240D8D653DA56F4DCB028D3D78F3C2D6BC7> |- +/I <1C60D8A8C9B08A9591900960B3FA4612DFF926AB21A530E1912F33677612 +AC06B324D812E42049FF4946BE5E0FFA24FA0C62F2839FF2110EEC7EE0A42476 +46E6F699D4C8BECE1825B3A661611E4D55F40F2E64FACB836D4D0C9780F60650 +FBF10E0D42> |- +/L <1C60D8A8C9B08A9504870DC577BFF1117CB147078FC0444648398262998D +8061E386D366188391878ADBE16C10A3B1BC6A93F56BD64AE45F8370470F419D +A43CBACE3D7B1152502CD0CF1468D72D3CB197A29E71D336CDA7D6BAA426EC1B +681825BDDC37329099DC579F155C> |- +/M <1C60D8A8C9B08A94284A0D047609A407E661A852E250B140B4157477FB2A +AE2E22210B2D780B692B0718211E5BD86C3DCF8087849BEE2B9F6D1D8621E40C +8FBE892AC1B23002BF18819E26C6741335DF8DA8AC82506D7051C0505D48DDFA +17EE84A06E07C05EBAC6174D600BACE071866247BE6C83F4CF28F6D6EE6A6CF8 +A788C4FFFDBDCA978C2B0B201753D21CB7AF0542C690ECE8E7EDBE1B1FB29939 +734E35E0ECCA8BA7FAEB58AC205A8A82A94C960A65> |- +/N <1C60D8A8C9B08A9501CDAE1251A61DF6E23FBE9059A2A88492E84D61402E +80BD80B5057FF8914FA4679EB3900C60B246DA77BF837041B1C053FCD543E3D1 +D259FCE953A74E40366D604A99F9233772AC97F872D505329B1446640ABD99E4 +AC723C39DD6EA376A043CE3633F04D9BC6DEFE2E1A831DBB9C16F90A966DFA0F +3802BB1EB0AA3DAEB0E864B9D3CC3E14AE1E9219B48660289CF348B4E280> |- +/O <1C60D8A8C9B08A946182837629000F56F09862ED5AA400F2B4EB929FCD0B +6F40CAF45238A67BE496742823610F15AF19832E8EC09C64557C48DB0BC41E07 +C1B98081893CB2216BAE4CCECC72A02E2F6B8D0FE8B2E6548D00AAA585F02486 +772A4FC1258C2982A5ECEC> |- +/P <1C60D8A8C9B08A94478101EE5603CAF9EA65868978F157B7D9DB71203FAD +46B85DF1A1E477012038D20B3756C0124AD7E2F6ACCB98150AB793091E3E7A8F +3C0AE6FC8D7A5031BB678671889D46F3A15BD495F1AB5B7C8F63325E15B44523 +174D09593A38714FEB5177883F725186FE6BF7095A24CD9EDEFA3551580A0E2B +0B49AC2002> |- +/S <1C60D8A8C9B08A95C5897169EED99899F86A6DCF3CD291B001131D3BCB45 +BF71748507542417352D5B30F63C60EB90DCF55005F88E95175B21D3219CD9E9 +2E89E417B177D285600845553F66626D2225552D23A7697637BDCEEECAEA18AB +42A896E96FF5B3536CC368A5F7504B6C75D962A4B5F9534F79AC78DC99848461 +42257A40DE257430C92806EBA73FF7D93DF0A6C207299E2D17F4071F9096D016 +163F4D3EC1889ADA266D3682F2D99904573A5022A10E61069737F2D55F919F95 +A33DB6DD2667321E4727855B58DBF4B1E5A294928E6CEABFBD34F296C1B758> |- +/T <1C60D8A8C9B08A9454CA4C75C5C97DCE7AB32777FAAECD12647866E7CB3F +CCDC541E37F2225E520DEDE695980D4012AD5B972BDABC7E7E5410E71AC63692 +4E778B3131B6C4D1E76F8C4592AC311A2107F53DC1850538C9E487E6D5DBDFE8 +027D7126BA9ED8B24E7379B57E474ACD298BF6B3700CC970D80111DD98EFC872 +C24D0DA3C75DDDFD177C6D15> |- +/U <1C60D8A8C9B08A9501CDAE1251A6E3AF1199B24D30F25809B39A0DD6474A +CF1BFDB89F5985BBB0F2E5FE7296314FDA462BECDBDEA31B3750001975D37A8B +F31F224CAB5093B8997B856DAE5F9007E1497BEED45CA8AC033A65F773653762 +77BFCDF39A2D8F1BC8E5626BEEEF5D670E87E32F25C0530E88A4E2B9AD6D8333 +3A6C173F8B22714E74A224AD610C2B1EAB> |- +/a <1C60D8A8C9B7A73DCB03313BCF7AD8C8EE234E5372D46A65E92A78F4B7E0 +2ECC58F71EE6C027AD4D56C5E4DE1AF1031295DC17C0E7AC8D8358634F9A19B0 +2A110E5539C10136C68E0D2CBEA6658A501D9D73323861F8C29EB92F9080ACC3 +E236C5F14389534682EC2925F59CD4A215569A7BD7B9F7827A30BA75EB840535 +B2A2C8F92AD166CE93D277314A4C690C47DB847F73BFE1049631CDDB9124FD76 +2753AA8DB187C216AFB74F76299B3C51610D74CF31321BBFEB5CFCA7D213C896 +D1B8E57EFC05695F2F73> |- +/e <1C60D8A8C9B08A95B1F07368C45D8D2AF4BC97E4CB216B20786BB8409E5C +B0892E60E7F0AD9AC8433678C58AAD59736BF9700A3AEB0B5352F4A898A5EEFB +C72A64BFB45B917D9879BD0577DAB96A0E86BECAB5E8A8A051E5E40886D5A00C +EC53E0A3265FC74195574846689BF9F38086985C2DD3223390D51155F707CE86 +59EC1C65A75BE9A0BA862DB1A00FF6A01FCED7E6> |- +/f <1C60D8A8C9B08A956BA65798425CE9B0A78F07A04AF2F8524751F181F94C +EF756ACD6AB92BD09462A05FB08A9160A0AB5267B62445F916DEFC1DAF3F1FB4 +B3761F71CBE3290960500C788D04CB45BB0A2825753AA6E46495F35A08389AAA +C80F35ADADFB7ACE340FEC03C9E5F9A50A8AD731E7A553A32F387574697F9CAB +2E100B6DD6E3525398F6> |- +/g <1C60D8A8C9B7A73DB58EA28807584EB19BC6EA1448A12312E623B90358A1 +63CFC67672A34CC74B0AEAADF24229DF1CCAA1488AE3E348FE2ACD572EA487EC +9D77FBB0710AB421B03DD5B8AE5519B5C269E9648E819E7ECE806EEF16A6618D +07D9AAB350E57F26F5259E8FCF9E5C2D96BBEAD16502F9E7819E854042DDB2BC +674C39681CC2E5224219582BC7B59BBAEF869C9DF91CA7770A97BAD53C3C3A99 +175BA8F0A5744B5969D3BC15831A95918F7C707E41F5D87B8DB2D57378BC9C29 +7DAE69E4BF438246E63F565B22D86CBE28DEF748262FB9FF82A88935451D6280 +A28F1AD964E6E476D5779321E42D3A86BE41122F1BED36C3DC47E1E01C225345 +98D0431873197ABE1C8EC03B4011E4B26D249635BDBABB8E5B69BE07AFA65F88 +EAF6> |- +/o <1C60D8A8C9B7A73DCEB07E09D16841D605E4F67059E6B258F546B80703E4 +CDAF20027B900118209D5372F965F2045D50C02A29110A048C891DEBA3210CDF +C5CDE2309C0CDE0E4855E9F6D8954C4C68826A14AD2E4C6227A036D85D304D6A +96FEAA92DEC3CD1B9F4AD57B5F1EBAB070FE911461A7D5B958F5> |- +/endash <1C60D8A8C9B7A73DB9B60A0DBA4B5FB3A045D6B65F12EE5E3DC48D3 +43D8E> |- +/.notdef <1C60D8A8C9B08A959E2F69652E8B8F> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLJ+CMR10 /GLAAAA+CMR10 findfont ct_VMDictPut +/YNDRLJ+CMR10*1 +[47{/.notdef}rp /slash /zero /one /.notdef /three /.notdef /five +11{/.notdef}rp /A /.notdef /C 5{/.notdef}rp /I 2{/.notdef}rp /L +/M /N /O /P 2{/.notdef}rp /S /T /U +11{/.notdef}rp /a 3{/.notdef}rp /e /f /g 7{/.notdef}rp /o +11{/.notdef}rp /endash 132{/.notdef}rp] +YNDRLJ+CMR10 nf +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-31.697 -36.8879 mo +(MAC1105/T3{Page5of10{SOLUTIONS) +[9.13578 7.19498 7.193 4.9813 4.9813 4.9813 4.98129 4.98131 7.19299 92.4629 8.30183 6.50756 +4.98131 4.98129 7.74393 8.30185 4.98129 6.36908 4.98129 8.30182 195.931 5.53922 7.75089 6.22662 +7.47195 7.19296 3.59644 7.75098 7.47192 0 ]xsh +%ADOBeginSubsetFont: GISAAA+CMBX10 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /GISAAA+CMBX10 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1994 Blue Sky Research and Y&Y, Inc. http://www.YandY.com) def +/Weight (Bold) def +/ItalicAngle 0 def +/BaseFontName (CMBX10) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 46 /period put +dup 56 /eight put +def +/UniqueID 5000768 def +/FontBBox {-301 -250 1164 946} def +end +systemdict begin +dup /Private +14 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-11 -0 686 697 444 453 655 676] def +/OtherBlues [-201 -194] def +/BlueScale 0.04379 def +/StdHW [47] def +/StdVW [114] def +/StemSnapH [40 47] def +/StemSnapV [114 142] def +/ForceBold true def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +3 dict dup begin +/period <1C60D8A8C9B08A9560D4C2F3A74D92838E83B7DC14B89478B799496 +0CFDC6D2144A34A20CA36052335682902BE7739DD> |- +/eight <1C60D8A8C9B7FCB6A4EC6CCC71FFBC41969F86A86636A65E5BD14FD4 +EBD93FCE205F86ECC615335CAFE8E2240019DB970894F9979E3FDF252D8A9472 +1B680E23D2DF204A99891D5AD0E347695938A6FCE4923A098978EC0AC2A3894C +8A94767FEBA61293F9C489BAC7A89726BFA765D56F2D198E99D500D81046ACE1 +5301FD9FB36D2F2E4EAA017CCF306EAEC8E157B40FDE6DC2FA713180A587E730 +6AD0870F441697503D> |- +/.notdef <1C60D8A8C9B08A95899606B6B060A7> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLK+CMBX10 /GISAAA+CMBX10 findfont ct_VMDictPut +/YNDRLK+CMBX10*1 +[46{/.notdef}rp /period 9{/.notdef}rp /eight 199{/.notdef}rp] +YNDRLK+CMBX10 nf +YNDRLK+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +-25.9685 -7.00012 mo +(8.) +[5.72846 0 ]xsh +249.382 99.488 mo +253.706 97.944 li +249.382 96.4 li +251.112 97.944 li +f +gsave +253.705 187.944 mo +1.70499 187.944 li +1.70499 7.94397 li +253.705 7.94397 li +cp +clp +.797 lw +0 lc +0 lj +10 ml +[] 0 dsh +false sadj +1.70499 97.944 mo +251.111 97.944 li +@ +grestore +.399 lw +0 lc +0 lj +10 ml +[] 0 dsh +false sadj +127.705 101.929 mo +127.705 93.959 li +@ +155.705 101.929 mo +155.705 93.959 li +@ +183.705 101.929 mo +183.705 93.959 li +@ +211.705 101.929 mo +211.705 93.959 li +@ +239.705 101.929 mo +239.705 93.959 li +@ +127.705 101.929 mo +127.705 93.959 li +@ +99.705 101.929 mo +99.705 93.959 li +@ +71.705 101.929 mo +71.705 93.959 li +@ +43.705 101.929 mo +43.705 93.959 li +@ +15.705 101.929 mo +15.705 93.959 li +@ +129.25 12.268 mo +127.706 7.94403 li +126.162 12.268 li +127.706 10.5391 li +f +.797 lw +127.705 187.944 mo +127.705 10.538 li +@ +.399 lw +123.72 97.944 mo +131.69 97.944 li +@ +123.72 77.944 mo +131.69 77.944 li +@ +123.72 57.944 mo +131.69 57.944 li +@ +123.72 37.944 mo +131.69 37.944 li +@ +123.72 17.944 mo +131.69 17.944 li +@ +123.72 97.944 mo +131.69 97.944 li +@ +123.72 117.944 mo +131.69 117.944 li +@ +123.72 137.944 mo +131.69 137.944 li +@ +123.72 157.944 mo +131.69 157.944 li +@ +123.72 177.944 mo +131.69 177.944 li +@ +%ADOBeginSubsetFont: GLAAAA+CMR10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLJ+CMR10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/two <1C60D8A8C9B7A73DC50B0411757B441481CCF7EF812EEB9B3F6A07BD51 +606BCA866C4BD24CA34E86B9CA5A529B664F3EEDB6B4AF8A2B994DB57B49473E +162231CB943675FE63E9B92B8AEBB62FB22456EC4173C66EF6C2F34FFEC22ACA +E77FFFAAD70F3754CADC0D2CF63CB6D286D930AEA5A613E5AB9CB004BEAEBADD +D070EDAF4FF25FDB6421F540D58D2C7A3FC40290CBCF831BE1B89B7F> |- +/four <1C60D8A8C9B7A73DC579B9C1587087D4749982A674065FCDD01CF53F5 +4AF89DAF22339F0A467CE8D8CC25949B03A9DEFE86592098644AED5891ABD8D0 +71237FB9B66EF7648D767508B0BB1075A0AC676C770BFE6D0E818B53FD7884E4 +D8E6A983234A6E833EF72FF7FE587> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLJ+CMR10 /Encoding get +dup 50 /two put +dup 52 /four put +pop +%ADOEndSubsetFont +/YNDRLJ+CMR10*1 +[47{/.notdef}rp /slash /zero /one /two /three /four /five +11{/.notdef}rp /A /.notdef /C 5{/.notdef}rp /I 2{/.notdef}rp /L +/M /N /O /P 2{/.notdef}rp /S /T /U +11{/.notdef}rp /a 3{/.notdef}rp /e /f /g 7{/.notdef}rp /o +11{/.notdef}rp /endash 132{/.notdef}rp] +YNDRLJ+CMR10 nf +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +113.758 81.1542 mo +(1)sh +113.758 61.1542 mo +(2)sh +113.758 41.1543 mo +(3)sh +113.758 21.1544 mo +(4)sh +%ADOBeginSubsetFont: BUZAAA+CMSY10 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /BUZAAA+CMSY10 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1996 Y&Y, Inc. All Right Reserved. http://www.YandY.com) def +/Weight (Medium) def +/ItalicAngle -14.035 def +/BaseFontName (CMSY10) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 161 /minus put +def +/UniqueID 5096651 def +/FontBBox {-29 -960 1116 775} def +end +systemdict begin +dup /Private +13 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-24 -0 683 705] def +/OtherBlues [-135 -124] def +/BlueScale 0.04379 def +/StdHW [40] def +/StdVW [40] def +/StemSnapH [40 56] def +/StemSnapV [40 56] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +2 dict dup begin +/minus <1C60D8A8C9B08A946182837629008DF7702985522C1BEB4D11AB8A6B +5589D8B615C840A4D8FD35DE7CD09D4C55DA8FE732830DDE> |- +/.notdef <1C60D8A8C9B08A959E2F69652E8B8F> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLL+CMSY10 /BUZAAA+CMSY10 findfont ct_VMDictPut +/YNDRLL+CMSY10*1 +[161{/.notdef}rp /minus 94{/.notdef}rp] +YNDRLL+CMSY10 nf +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +106.009 120.739 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +113.758 120.739 mo +(1)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +106.009 140.738 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +113.758 140.738 mo +(2)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +106.009 160.738 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +113.758 160.738 mo +(3)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +106.009 180.738 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +113.758 180.738 mo +(4)sh +153.215 113.33 mo +(1234) +[27.9999 27.9999 27.9999 0 ]xsh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +93.3403 113.33 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +101.089 113.33 mo +(1)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +65.3404 113.33 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +73.0894 113.33 mo +(2)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +37.3406 113.33 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +45.0895 113.33 mo +(3)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +9.34069 113.33 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +17.0896 113.33 mo +(4)sh +.797 lw +1 lc +[0 2 ] 1 dsh +true sadj +15.705 178.944 mo +15.705 16.944 li +43.705 178.944 mo +43.705 16.944 li +71.705 178.944 mo +71.705 16.944 li +99.705 178.944 mo +99.705 16.944 li +127.705 178.944 mo +127.705 16.944 li +155.705 178.944 mo +155.705 16.944 li +183.705 178.944 mo +183.705 16.944 li +211.705 178.944 mo +211.705 16.944 li +239.705 178.944 mo +239.705 16.944 li +@ +[0 2.8 ] 1.4 dsh +14.305 177.944 mo +241.105 177.944 li +14.305 157.944 mo +241.105 157.944 li +14.305 137.944 mo +241.105 137.944 li +14.305 117.944 mo +241.105 117.944 li +14.305 97.944 mo +241.105 97.944 li +14.305 77.944 mo +241.105 77.944 li +14.305 57.944 mo +241.105 57.944 li +14.305 37.944 mo +241.105 37.944 li +14.305 17.944 mo +241.105 17.944 li +@ +gsave +253.705 187.944 mo +1.70499 187.944 li +1.70499 7.94397 li +253.705 7.94397 li +cp +clp +0 lc +[] 0 dsh +false sadj +1.70499 -2737.06 mo +4.24998 -2552.98 li +6.79598 -2376.98 li +9.34098 -2208.89 li +13.759 -1924.66 18.654 -1640.43 24.614 -1356.22 cv +27.16 -1238.41 li +29.705 -1127.06 li +34.562 -922.47 39.996 -717.87 47.523 -513.361 cv +50.069 -447.207 li +52.614 -385.893 li +55.159 -329.236 li +57.705 -277.057 li +61.675 -200.65 66.029 -124.124 72.978 -47.9209 cv +75.523 -22.0378 li +78.069 .810059 li +80.614 20.802 li +83.159 38.1201 li +85.705 52.9441 li +88.25 65.4531 li +90.796 75.8291 li +93.341 84.251 li +95.887 90.9001 li +98.432 95.957 li +100.978 99.6001 li +103.523 102.012 li +106.069 103.372 li +108.614 103.861 li +115.605 104.102 121.972 97.1501 128.978 98.03 cv +131.523 98.7891 li +134.069 100.48 li +136.614 103.282 li +139.159 107.377 li +141.705 112.944 li +144.25 120.164 li +146.796 129.217 li +149.341 140.284 li +151.887 153.545 li +154.432 169.18 li +156.978 187.369 li +159.523 208.293 li +162.069 232.132 li +164.614 259.067 li +167.159 289.277 li +177.002 416.085 182.398 543.453 187.523 670.524 cv +190.069 738.33 li +192.614 811.215 li +195.159 889.359 li +197.705 972.942 li +206.34 1268.27 212.532 1563.68 218.069 1859.07 cv +220.614 1999.72 li +223.159 2147.62 li +232.552 2709.84 239.689 3272.1 246.069 3834.36 cv +248.614 4064.6 li +251.159 4304.06 li +253.705 4552.94 li +@ +grestore +%ADOBeginSubsetFont: GISAAA+CMBX10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLK+CMBX10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/A <1C60D8A8C9B08A941DDBC3AF1C109AC61AF06DEF14497758E2577FC09808 +E2F83FED36FAC5C5DF9845F9151204EBE19A62A093C0C714296A8AEB5EA72983 +7304C560208E23A9B00E450B7895C64B840FF7B8D2624ED826E8D6D1CB5BC276 +3958AE415A241BD617EA928FD9818043D58C39BCDA5256A3F17DFF2FADD0CDFE +4A5999053732F0E5CE29974C519106> |- +/W <1C60D8A8C9B08A949EE89938EFD2B089915D4CA87E50351E8DD3F3914A85 +384965AB9720D1BDB02951199DD63BE938B296E11B8132C78ABED307E15E2C96 +04E0EEA5C8FB1D25F45078482232C4120E0C6D7ECC100B9CF59823239764E960 +AC203F05154297337EBEC8D426CABE71C6D1BABE3D2EE87EB4EC26DC5A175D2E +1776DC7CB846E1C76A588A844BC3111554540D100610F9152C35EB0670475763 +7F97762997D01BB6BF9BF94F9DBF981A5DB94B101F849599A265> |- +/a <1C60D8A8C9B08A95C60527548E754D765DB4EDA6BA0D2CC6D8A620394D95 +5731400D0093175DD4FDCB6F936DAB2E93BD9C1B54BF99F619E92F88F8093B57 +6575F38778E5971C238BB03705C8902A6FCFED1FF202619A2D8A4C3FD818942E +E7E0400EE37C1268C755A54355454E010823DC11303C9CDCFFF1370DF47DDE8E +0505D81ACB493683AAFD9A5B8B94F66FF9ECA66884B26F31C72D900D51753830 +4DA83D95E97AC104F2FDC53254E575E01E9C7E8025E9> |- +/e <1C60D8A8C9B08A95D1DE8AA71D3914AC9DDC5BFDDE55301EE17DAE184B08 +E53C36FBF9A44FDF3309DBE08895DBFECCF103737D7326528346FD01CD1D9FC3 +874638E8C50ADE3B494897353EB3188B512405DD1BA5DA59E8C179230F7C8D15 +AFCEA2228DAC03C77D614B36A41126CE831B41CDF160A67B175BB36C52353A72 +5460F4256C> |- +/k <1C60D8A8C9B08A95F1118A977C6242CC6F5E327BF4A2BCE6E631EAC27F33 +5285F637895192724CE2C53641A392411149B8A3F127ECD7DEB11923D35A35EC +238223B6B1C9CF9675A0C83B3A0C95C18823DF1B6F368BBFEEE7185E77AE9040 +378C34B27A11D9EE3C9721E2EAFF82B925C0F3ABE698646F0C4A57CEC100EA29 +86134B063D8450710541B66D42FC62B89A6AB4B6D6C05FC0E5F8EF9F1253768A +DA78BF283C77228ACE6FD83E9384> |- +/o <1C60D8A8C9B7FCB6A15C803B3B972EE31F5A721ABF9B8490D1BCABFAF507 +3D6D0835AA64493F9EC5B8BAE86BFF5C8028599ED438B3807899BF98EB3DF2EE +9BBE5DC52FDB77ACA45EA052A40521B13F529CBBBB8B40F192297C658BE1CF97 +9B5618AA4355B6A77C9FC09641> |- +/r <1C60D8A8C9B08A95A5BEE1199161ADD44E1E8B27A5C75D09130CF9546F37 +4B2A22381A06BD734F2C4BF093B03F9AF2D0D4C8BE8AA6899632B1BDCEA5F8FA +27D0647BB27FC7927912A6761C3F8A51172D73B92082F06EFA277243DBD96EE1 +6421DB7B86390678EAD31E9D8E521BD186BAE7A8A68851384DC5E4933D7D1C5E +E5A527356EDB77> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLK+CMBX10 /Encoding get +dup 65 /A put +dup 87 /W put +dup 97 /a put +dup 101 /e put +dup 107 /k put +dup 111 /o put +dup 114 /r put +pop +%ADOEndSubsetFont +/YNDRLK+CMBX10*1 +[46{/.notdef}rp /period 9{/.notdef}rp /eight 8{/.notdef}rp /A 21{/.notdef}rp /W +9{/.notdef}rp /a 3{/.notdef}rp /e 5{/.notdef}rp /k 3{/.notdef}rp /o +2{/.notdef}rp /r 141{/.notdef}rp] +YNDRLK+CMBX10 nf +YNDRLK+CMBX10*1 [9.9626 0 0 -9.9626 0 0 ]msf +324.775 14.8624 mo +(WorkArea) +[10.8911 5.72845 4.72226 9.86591 8.65753 4.72226 5.25021 0 ]xsh +%ADOBeginSubsetFont: BUZAAA+CMSY10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLL+CMSY10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/bullet <1C60D8A8C9B7A73D8D0B3FCDAA7E46FB68E7B1A6E412E25369E4ABB +A70D277941C6A488EED866AD61E359C443EB0FEA5> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLL+CMSY10 /Encoding get +dup 178 /bullet put +pop +%ADOEndSubsetFont +/YNDRLL+CMSY10*1 +[161{/.notdef}rp /minus 16{/.notdef}rp /bullet 77{/.notdef}rp] +YNDRLL+CMSY10 nf +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +283.593 34.7875 mo +(\262)sh +%ADOBeginSubsetFont: GLAAAA+CMR10 AddGlyphs +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +systemdict begin +YNDRLJ+CMR10 dup +/Private get dup rcheck +{begin true}{pop false}ifelse exch +/CharStrings get begin +systemdict /gcheck known {currentglobal currentdict gcheck setglobal} if +/parenleft <1C60D8A8C9B08A958B2129D6E9761120E2D623F206A8BB61D8ED +90A20EE239C62172B553BFF416342D6CD99C95C515CA225C40039DBAF08CE4F0 +55B08F39C15D29C99EF3EDD066CCCEF8932365A3BB1620FA5F0BCE8AF21A5BDE +C0FFD55FA45F247FC811007CB408F0DCDD3AE01E3246> |- +/parenright <1C60D8A8C9B08A958B2129D6E9761120E2D623F206A8A207F03 +DEA8F466C0D4F860EDF515D421F89285FC2D8EC76F5E903EDE1B5CFFAEC5DEA9 +22C7FC4A51953A99A5FB1F96793348D816F60492670058F4DEA6D328AB20FBAD +B3C1B57A79D8CCD13A3C6D068BAD5F09F347ED0C895> |- +/hyphen <1C60D8A8C9B08A959E2F69652E8B76AC2AC5B4F1FA8662A86AEED57 +846929C2FBC07360B> |- +/colon <1C60D8A8C9B08A95708109816759149241680C741B6923EBD56E6248 +E5269499A7D548A5AC3ECB516C4A5048666940A11AD8CB54F4BA847274447EEB +614F54B956BBCFCAD8E88A403FBD4464DA283ACB> |- +/semicolon <1C60D8A8C9B08A9570810981675918D0BCF1CD202F5F8524F1CF +461D4270459E44DB560BC854C3F48DFD92347C27A6AAF0E2B1A04AFEB82D8D46 +6FB78A9BF2E74CE09AE4A8F352791B5C7110FA6307B2916ECC9F5904CC094CEE +59D67B4016AFD5BCFCA64E9EC736BD726D1A09B76CECE761EBE5219FDE764D2A +9C6D289DBA39E76263> |- +/equal <1C60D8A8C9B08A946182837629008D945C50B3BD77B79680F3B07BDA +6301D2521ADF665EADEA779B8650AC6CDB556621631497A3BE00C67036F6EB06 +05A36A2C0EE306396247E4A79F8EFAE500D78B59605F041F11> |- +/b <1C60D8A8C9B08A95C5897169EED96641DA8B10CA087E6B7A5588052BABB7 +BC0836B12A49068694BF7254A2B820A876E020738250AC32ED44C3A7F2C5F700 +C2D03E307AFB7135F6415FEEB6D856569E9D5429B4DD3F524606607A7502F4FA +00BE0184FC677554B2B6367E60A281A4837A2231515AF09B33399B7D5C3D2E8F +3A2971F2933C4A4CAAA727A80DBDC9692BD6B38D543D422C14068650D2C61B6B +E587855459543E451B14A31F96D9B341DFF415> |- +/d <1C60D8A8C9B08A95C5897169EED96D33CB6A9013DDE3D04C2845E595598F +3E2E6D79295DF7CC9B6C00D2CF2AC2502697856E5474C945441376692CB09ED9 +25CE9D4F710C7DE089B5E658450CEECC611DD1F25787624443E710373775DB0D +7A6478B3FD4F82DF4FC109429D4EADCED1BD77A35BF25A1C1E584B0EB23CE621 +6847A21EE88B35D72221C7F9F0705E61C9F9C0A224456A04D3E81DE0BD98422F +FA8C7335713899937F5FFEC7771BB8FDAEE53DE3E6> |- +/h <1C60D8A8C9B08A95C5897169EED9664BED359D179BDDBB0B44F78A354068 +F188259C421AB0565D2C93368C7FE6E0A9F40BB196D1F23D06A9B4099431512B +C136412B8071F881A48FA8A97D03ACD06EBB8221F2FCB171D9A905549A8F7881 +2735FA48F2EC00ACCEB309920B412B3F60D0173EF224E4CB3F5C1DAD9CC6147F +9ADED8EC6C9533B7B1AABCF5D1E9B7F36A2D4B8D2B26EAE8EA> |- +/i <1C60D8A8C9B08A9570810981675968AD25F24D2B3EAE33A4AEDADBE9B65D +A53E9F2E54B16133284CA9914BED3880C793207FBDC7926300AD07E6E54407B5 +1EA082FB5EE3816A6A23A8296A947037E4E873086619D7E86B5A60AFA576E554 +D14C9B74D403098ADE85F71880A3E75D7FC1> |- +/k <1C60D8A8C9B08A95D222871B45C8170346D4B3692EE324314ECB68C750E8 +0C39C0E118E6175CCD69769E2118B02E8AEF864A1ADB8D0BF5A5FFDD4A9B9B6C +C867F43FFF5A7BBEB959851C5A4053DF1F3B8EBF64DEEC6B682D7055139D4103 +B0A63AD1D8193F253FA365D16CC3EC1AC7C7AEA533CCF6F8272FF6B8CD1FC7B4 +0DE006133FBB2B23E8E1776C461B4D8ABE09C8DE32B25BAD44EC36CACD378C29 +9496103B1CB809290EFAF69E7582E8754F6B25D7A0FD> |- +/l <1C60D8A8C9B08A9570810981675968AD25F317189905083B97CD6CD1B880 +05B79B666989E13C0F8D0889AD0162C7E87274D188EBBD1A911FDD0B6E360AA1 +C515725198B9106B157680FC> |- +/n <1C60D8A8C9B08A95C5897169EED9664BED359D179BD38846B55E34D4CAA6 +E85E9CF3F20D5FF6B35F1C9AAE2A542B7B24E087B6004A4C7219997095CC0DD0 +7A15DB83B5FEAD13F209441FFD364AD3DBF6E16129F3599BACA005A523490ABC +41E4DF320ACE384037EE1D352E3FAD8A9E2CECBD75A999F7B655F4FFBFAC6FFF +84029A8DF710DBB0D7CD4C1D20367E79BC4E3121199FA9593C876B29EA793F10 +2A1E36BE8056D0377A> |- +/p <1C60D8A8C9B08A95C5897169EED91609D9E4D5F91353B4B61FEC4EAC5FAD +7B5032144CF9ADF0F974C4F1789F7935ECC14F06F084A964A5CA17285CA0C9EC +1B8F57A0E66AEAF75BA11AE734E6416585ED4DB12A3372EA2BA1BABC0DE7BE87 +584CD6EA8819CE99CB18F04E8ECD619D7E02CDE60A0AA18597DE62AF13ABCC5A +5F1D59EBFBBEF560144EF0DCE1B387B4BC40F158468D6A4DE477659B50190482 +6F081FC4942E5187D9F03F6D1BD471F55D6300> |- +/r <1C60D8A8C9B08A9584DCB847BA986212E50A0E258C2648145E7BCFAC2BA8 +6C36E84B654FABD35F6BE558D4B54676EA44C57F6EF668BC4866822048422FD6 +D8B608EB2C1C67EC3EE3CEBDD94E9A9214F99F9DA8EE2F6900EB47053AC763EE +DABCA0360701D8CB383B9ECCD7B848D18CFB88761A167471DE407F7BED4BC50B +779C4D57BF133C3E4777AA4605171C6D> |- +/s <1C60D8A8C9B08A9586D4F7B21AA9B0967A13D9D7A42FE5E3505E2F3EE7CA +FF99F258F00E5A08E889C3CC5D8ACF7164CD2AC0013AEF91C534D4ACEB36DB05 +CE0E820904C7EB6E6797C2D5FB5E96476FD3694427C3F770022BFE939EC57571 +FAC1F965E0A7F32B36C86522DA3AFB3A309E4B5D72F0E56F1BEB5C7254CECC22 +9B1219F95DA80187F2FFAF15E03AF5B396BE650B53989F1A64B4AA9655D1019B +496166D38FC8961ACDA2D0B1533422796A114C02DCAA98A8558155EE2C970442 +944A032E8A6A4004C15A48F9176AE45E44068C23BC> |- +/t <1C60D8A8C9B08A958B2129D6E9766AD6B3247B9CBDFB0724765D43ED23A7 +B2BC7B24077C209594776C48799589E3DF7269407A6893D4C106057122D99E3F +649ACAFBE1812EEAA6C4DCDDD716BEB7694626BFFCAE715C15EF0FD8CE9F6FE4 +E96B03> |- +/u <1C60D8A8C9B08A95C5897169EED96D33CB6A8CCD6F539BADC574F30FA019 +2FAAA0351E8C93175F4B6BE4D2DCA8A13E4F01BEC5788441B5C71C1247369B6B +73137454B1C207EA4F43D533FE87512BAD8DD4F3DBBECD9A7A1CE3F33A4D3F31 +6952FDB339B4B6A937009D6EC9821D8553981B7D8AABC3E750369071> |- +/v <1C60D8A8C9B08A95D222871B45C81C126204E8A3F3EFC2EBF937B1E5F2B8 +737EDCCFF78DB8693FA0E7B559CFAC0A233112105FC1A8807ADD3013D4AE86C4 +38318F1223CADD606642DF7E9A8EE9BE743E975DA759D856D52F7E927FE33606 +3979ED38AB2E1EA4CB4F371A1EB04E6C5B864C9DB5271435AB2DE7D9DE15A6B1 +D9E3FD555F015DADE467> |- +systemdict /gcheck known {setglobal} if end {end} if +end +YNDRLJ+CMR10 /Encoding get +dup 40 /parenleft put +dup 41 /parenright put +dup 45 /hyphen put +dup 58 /colon put +dup 59 /semicolon put +dup 61 /equal put +dup 98 /b put +dup 100 /d put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 110 /n put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +pop +%ADOEndSubsetFont +/YNDRLJ+CMR10*1 +[40{/.notdef}rp /parenleft /parenright 3{/.notdef}rp /hyphen /.notdef /slash /zero +/one /two /three /four /five 4{/.notdef}rp /colon /semicolon +/.notdef /equal 3{/.notdef}rp /A /.notdef /C 5{/.notdef}rp /I +2{/.notdef}rp /L /M /N /O /P 2{/.notdef}rp /S +/T /U 11{/.notdef}rp /a /b /.notdef /d /e +/f /g /h /i /.notdef /k /l /.notdef +/n /o /p /.notdef /r /s /t /u +/v 4{/.notdef}rp /endash 132{/.notdef}rp] +YNDRLJ+CMR10 nf +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +293.556 34.7875 mo +(Theend-behaviorislike) +[7.19299 5.53922 7.24979 4.4234 5.53918 5.53922 3.31747 5.81616 4.4234 5.53918 4.70435 5.26025 +2.76959 4.98129 6.73172 2.76962 6.75162 2.76959 2.76962 4.98328 0 ]xsh +%ADOBeginSubsetFont: WRBBAA+CMMI10 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /WRBBAA+CMMI10 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1996 Blue Sky Research and Y&Y, Inc. (978) 371-3286) def +/Weight (Medium) def +/ItalicAngle -14.04 def +/BaseFontName (CMMI10) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 120 /x put +dup 121 /y put +def +/UniqueID 5087385 def +/FontBBox {-32 -250 1048 750} def +end +systemdict begin +dup /Private +12 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-22 -0 683 705 431 442 453 466] def +/OtherBlues [-205 -194] def +/BlueScale 0.04379 def +/StdHW [31] def +/StdVW [72] def +/StemSnapH [25 31] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +3 dict dup begin +/x <1C60D8A8C9B08A95C3B1459DC8650F9F96183FC46268F5BDA744B05C84F8 +C7E5FE6BFCA9D4C8BD3488080E8FC96F34EA177DCAE190D27F37102D2F45514A +ECF6E4A3B2E6F401810D0AF13E4BDFDB8118476E04C9DD93F8884F46C9ABEE13 +C8E7992449902F6BC3D518B2A70293976C8BCE67ED913D975C52E884BF7F46CE +8DF8170D79262260A6CB5A6A088C0A964E0271DA63944ABA9C96D1AA58CB590F +97DC9C8372606676C2CA18B1A9303EBF11B510FAB8A33E9B530D274E48DD09EE +8829EC16181BBC16C4E81343ACB5386F22A9C0CA2C23959102E833> |- +/y <1C60D8A8C9B08A95A3A690DEE11C2ACFF7516D4A7CDA884FB3B130648C63 +2F41B68B5E071E6BAD692658125A4CE9A4427A55054BF5DABFF855AF9D186215 +1F50AD5D2EE36E064C9718B8694EF83525324184D7DD07A10B9FD203C707D849 +3E926469CD1C36E94D5785557A2D95B556774E51CEFBAE2CC8AB735FFF293AFE +FA32B8D1FD5C52EC860AA6EC20816B24BD1EB69FE8581708322D6F09A08B3182 +91EF57EAE554A00C60D585B786E53371A6D3FB2D8729C3F2C51DB65ABF8CA421 +EEB103AED2CB924D829D66429CF6664CDEAFEEC4AD07C95E7FE8BCAB5D2A1AD6 +731779D5> |- +/.notdef <1C60D8A8C9B08A959E2F69652E8B8F> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLM+CMMI10 /WRBBAA+CMMI10 findfont ct_VMDictPut +/YNDRLM+CMMI10*1 +[120{/.notdef}rp /x /y 134{/.notdef}rp] +YNDRLM+CMMI10 nf +YNDRLM+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +399.866 34.7875 mo +(y)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +407.875 34.7875 mo +(=)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +418.391 34.7875 mo +(\241)sh +YNDRLM+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +426.14 34.7875 mo +(x)sh +%ADOBeginSubsetFont: KEDBAA+CMR7 Initial +%ADOt1write: (1.0.24) +%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. +13 dict dup begin +/FontType 1 def +/FontName /KEDBAA+CMR7 def +/FontInfo 8 dict dup begin +/Notice (Copyright (c) 1988 - 1992 Blue Sky Research and Y&Y, Inc. http://www.YandY.com) def +/Weight (Medium) def +/ItalicAngle 0 def +/BaseFontName (CMR7) def +/WasEmbedded true def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 51 /three put +def +/UniqueID 5000790 def +/FontBBox {-286 -250 1122 967} def +end +systemdict begin +dup /Private +13 dict dup begin +/|- {def} def +/| {put} def +/BlueValues [-20 -0 683 703 431 446 664 674] def +/OtherBlues [-205 -194] def +/BlueScale 0.04379 def +/StdHW [36] def +/StdVW [79] def +/StemSnapH [28 36] def +/StemSnapV [79 95] def +/password 5839 def +/MinFeature {16 16} def +/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869 +systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup +/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def +/Subrs 5 array +dup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> | +dup 1 <1C60D8A8C9C3D06D9E> | +dup 2 <1C60D8A8C9C202D79A> | +dup 3 <1C60D8A849> | +dup 4 <1C60D8A8CC3674F41144B13B77> | +def +put +dup /CharStrings +2 dict dup begin +/three <1C60D8A8C9B08A95C25148D4A67F69EFB9DDFA5ECA5AE37566D87066 +172F8CABE2B2CB84CA762EB5E603C8A9A699CCCFA6A0578E3DA76E6C9E7B5A84 +45F01D818A380DD4AC46AFDB5422B8800FEF2E8AFDA86EDD8199C34D64992E4F +43992CF1D54B07E3F575480A9A0B868375A4E2A9893BE0AEBB713690AB6C5B93 +E6D8D619357F90F56F58A8525CC0A1BD91DA9365507B440F549B60D4E7E5CBB3 +769D4C82F061F9E20A25AD23418551374D804A6B25C8CE003D> |- +/.notdef <1C60D8A8C9B08A958AA685092D4752> |- +end put +end +dup /FontName get exch definefont pop +end +%ADOEndSubsetFont +/YNDRLN+CMR7 /KEDBAA+CMR7 findfont ct_VMDictPut +/YNDRLN+CMR7*1 +[51{/.notdef}rp /three 204{/.notdef}rp] +YNDRLN+CMR7 nf +YNDRLN+CMR7*1 [6.9738 0 0 -6.9738 0 0 ]msf +431.835 30.6743 mo +(3)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +283.593 54.713 mo +(\262)sh +YNDRLM+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +293.556 54.713 mo +(x)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +299.25 54.713 mo +(-int:) +[3.31747 2.76959 5.26224 3.87555 0 ]xsh +YNDRLM+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +325.685 54.713 mo +(x)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +337.496 54.713 mo +(=0\(even\);) +[13.868 10.3123 3.87552 4.4234 4.98328 4.4234 5.53922 3.87552 0 ]xsh +YNDRLM+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +397.897 54.713 mo +(x)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +409.708 54.713 mo +(=)sh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +423.574 54.713 mo +(\241)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +431.323 54.713 mo +(1)sh +293.557 66.6682 mo +(\(odd\)) +[3.87552 5.25827 5.53922 5.53918 0 ]xsh +YNDRLL+CMSY10*1 [9.9626 0 0 -9.9626 0 0 ]msf +283.594 86.5933 mo +(\262)sh +YNDRLM+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +293.557 86.5933 mo +(y)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +298.799 86.5933 mo +(-int:) +[3.31747 2.76959 5.26224 3.87555 0 ]xsh +YNDRLM+CMMI10*1 [9.9626 0 0 -9.9626 0 0 ]msf +321.623 86.5933 mo +(y)sh +YNDRLJ+CMR10*1 [9.9626 0 0 -9.9626 0 0 ]msf +329.971 86.5933 mo +(=0\(passesthroughori-) +[10.8572 8.50607 3.87552 5.53922 4.98129 3.92523 3.92523 4.4234 7.45001 3.87552 5.53922 3.9053 +4.98129 5.53922 4.98129 9.06396 4.98132 3.90533 2.76959 0 ]xsh +293.557 98.5485 mo +(gin\)) +[4.98129 2.76962 5.53918 0 ]xsh +grestore +grestore +pgrs +%%PageTrailer +[ +[/CSA [/0 ]] +[/CSD [/0 ]] +] del_res +/YNDRLM+CMMI10*1 uf +/YNDRLM+CMMI10 uf +/WRBBAA+CMMI10 uf +/YNDRLN+CMR7*1 uf +/YNDRLN+CMR7 uf +/KEDBAA+CMR7 uf +/YNDRLJ+CMR10*1 uf +/YNDRLJ+CMR10 uf +/GLAAAA+CMR10 uf +/YNDRLL+CMSY10*1 uf +/YNDRLL+CMSY10 uf +/BUZAAA+CMSY10 uf +/YNDRLK+CMBX10*1 uf +/YNDRLK+CMBX10 uf +/GISAAA+CMBX10 uf +Adobe_AGM_Image/pt gx +Adobe_CoolType_Core/pt get exec +Adobe_AGM_Core/restore_mysetup gx +Adobe_AGM_Core/pt gx +currentdict Adobe_AGM_Utils eq {end} if +%%Trailer +Adobe_AGM_Utils begin +[/EMC pdfmark_5 +currentdict Adobe_AGM_Utils eq {end} if +Adobe_AGM_Image/dt get exec +Adobe_CoolType_Core/dt get exec +Adobe_AGM_Core/dt get exec +%%Pages: 1 +%%DocumentNeededResources: +%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 +%%+ procset Adobe_CoolType_Utility_T42 1.0 0 +%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 +%%+ procset Adobe_CoolType_Core 2.31 0 +%%+ procset Adobe_AGM_Core 2.0 0 +%%+ procset Adobe_AGM_Utils 1.0 0 +%%DocumentNeededFeatures: +%%DocumentSuppliedFeatures: +%%DocumentCustomColors: +%%CMYKCustomColor: +%%RGBCustomColor: +%%EOF diff --git a/macros/latex/contrib/eqexam/examples/graph.pdf b/macros/latex/contrib/eqexam/examples/graph.pdf new file mode 100644 index 0000000000..7b5e858908 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/graph.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/hw.cfg b/macros/latex/contrib/eqexam/examples/hw.cfg new file mode 100644 index 0000000000..57511627ea --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/hw.cfg @@ -0,0 +1,12 @@ +\renewcommand\maketitledesign +{% + \makebox[\textwidth]{\normalsize + \shortstack[l]{\strut\underbar{\websubject}\\\@date}\hfill + \shortstack[l]{\underbar{\webtitle}\\\strut}\hfill + \shortstack[l]{\strut\underbar{Due \theduedate}\\\webauthor}}% +} +\rhead{\webauthor} +\def\exrtnlabelformat{$\square$} +\def\exrtnlabelformatwp{} +\def\eq@sqslrtnlabel{} +\everymath{\displaystyle} diff --git a/macros/latex/contrib/eqexam/examples/hw.cfg.txt b/macros/latex/contrib/eqexam/examples/hw.cfg.txt new file mode 100644 index 0000000000..57511627ea --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/hw.cfg.txt @@ -0,0 +1,12 @@ +\renewcommand\maketitledesign +{% + \makebox[\textwidth]{\normalsize + \shortstack[l]{\strut\underbar{\websubject}\\\@date}\hfill + \shortstack[l]{\underbar{\webtitle}\\\strut}\hfill + \shortstack[l]{\strut\underbar{Due \theduedate}\\\webauthor}}% +} +\rhead{\webauthor} +\def\exrtnlabelformat{$\square$} +\def\exrtnlabelformatwp{} +\def\eq@sqslrtnlabel{} +\everymath{\displaystyle} diff --git a/macros/latex/contrib/eqexam/examples/hw01.pdf b/macros/latex/contrib/eqexam/examples/hw01.pdf new file mode 100644 index 0000000000..4ec713065b Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/hw01.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/hw01.tex b/macros/latex/contrib/eqexam/examples/hw01.tex new file mode 100644 index 0000000000..c9489aa2d3 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/hw01.tex @@ -0,0 +1,166 @@ +\documentclass[12pt]{article} +\usepackage[fleqn]{amsmath} + +% This set of parameters are used to distribute the assignment to the class (in paper form) +% and for posting on the class web site (for those who missed the class). +% With the pdf option the information contained in the keys below are placed +% in the document info of the PDF document. If you don't have the AcroTeX Bundle +% installed, remove the pdf option. +\usepackage[pdf,forpaper,cfg=hw,nopoints,nosolutions]{eqexam} + +% Note: When using a PDF option like pdf, you need to specify a driver +% that is passed to hyperref, web.sty etc. For example, +% \usepackage[pdf,pdftex,forpaper,cfg=hw,nopoints,nosolutions]{eqexam} + +% This set of parameters are used to publish the solutions on the class web site, if +% desired. +% \usepackage[pdf,forpaper,cfg=hw,pointsonleft,answerkey]{eqexam} + +% Try compiling the file with vspacewithsolns +% % \usepackage[pdf,forpaper,cfg=hw,pointsonleft,vspacewithsolns]{eqexam} + +% Note the use of the myconfigi parameter. This then inputs eqexami.cfg, there I +% have placed some definitions specific to a homework assignment. + +\subject[AC2]{Advanced Calculus II} +\title[HW1]{HW \#1} +\author{Dr.\ D. P. Story} +\date{Spring 2005} +\duedate{01/28/05} +\keywords{Homework due \theduedate} + +\solAtEndFormatting{\eqequesitemsep{3pt}} + + +\begin{document} + +\maketitle + +\begin{exam}{HW} + +\ifanswerkey +\begin{instructions}[Solutions] +Below, please find a set of solutions to this assignment. +\end{instructions} +\else +\begin{instructions}[] +Assignments should be neatly-written, well-organized and concise. +If you miss a class and need to get an assignment, see +\[ + \text{\url{http://www.math.uakron.edu/~dpstory/}} +\] +All class assignments and other announcements will be posted on +this web site. +\end{instructions} +\fi + +\begin{eqComments}[]\S4.3, page 155, in the text\end{eqComments} + +\begin{problem}[4] +Problem 15. Use the definition to prove $f(x) = x^2$ is convex on +$\mathbb{R}$. +\begin{solution} +Let $[c,d]$ be any interval and let $t\in[0,1]$, we need to prove +\begin{equation} + f\bigl( (1-t)c + td \bigr) \le (1-t) f(c) + tf(d)\label{eq0} +\end{equation} +or, +\begin{equation} + \bigl( ( 1-t )c + td \bigr)^2 \le (1-t) c^2 + t d^2\label{eq2} +\end{equation} +We show that the right-side minus the left-side in \eqref{eq2} is nonnegative. Indeed, +\begin{align*} + (1-t) c^2 + &t d^2 - \left( ( 1-t )c + td \right)^2 \\& + = (1-t) c^2 + t d^2 - \left( ( 1-t )^2 c^2 + 2t(1-t)cd + t^2d^2 \right)\\& + = (1-t)[1-(1-t)]c^2 - 2t(1-t)cd + t(1-t)d^2\\& + = t(1-t)c^2 - 2t(1-t)cd + t(1-t)d^2\\& + = t(1-t)( c - d )^2 \ge 0 +\end{align*} +From the first and last lines we have $(1-t) c^2 + t d^2 - \left( ( 1-t )c + td \right)^2\ge0$. This is equivalent +to the desired inequality~\eqref{eq2}. \eqfititin{$\square$} + +\medskip\noindent\textit{Alternate Solution}: +We apply the \textbf{Cauchy-Schwartz Inequality}, page.~16, to the expression on the left side of line~\eqref{eq2}. +For convenience, I paraphrase the \textbf{Cauchy-Schwartz Inequality}: +\[ + \left(\sum_{k=1}^n a_k b_k \right)^2 \le \left(\sum_{k=1}^n a_k^2 \right) \left(\sum_{k=1}^n b_k^2 \right) +\] +Applying this inequality, with $a_1 = \sqrt{1-t}$, $b_1 = +\sqrt{1-t}\,c$, $a_2 = \sqrt{t}$, $b_2 = \sqrt{t}\,d$ (here, +$n=2$, two terms), we obtain, +\begin{align*} +(1-t)^2 c^2 + t^2 d^2 & + \le \left( (\sqrt{1-t})^2 + (\sqrt{t})^2\right)\left((\sqrt{1-t}\,c)^2 + (\sqrt{t}\,d)^2\right)\\& + = (1-t)c^2 + td^2 +\end{align*} +Thus, +\[ + (1-t)^2 c^2 + t^2 d^2 \le (1-t)c^2 + td^2 +\] +which is line~\eqref{eq2}, what we wanted to prove. +\end{solution} +\end{problem} + +\begin{problem}[3] +Problem 18. Prove the sum of two convex functions is convex. +\begin{solution} +Seems simple enough. Suppose $f$ and $g$ be convex on $I$. Let $[\,c,d\,]\subseteq$ and let $t\in[\,0,1\,]$. Then +\begin{align*} + (f+g)\bigl( (1-t) c + td \bigr) & + = f\bigl( (1-t) c + td \bigr) + g\bigl( (1-t) c + td \bigr)\\& + \le (1-t) f(c) + tf(d) + (1-t) g(c) + tg(d)\\& + = (1-t) (f+g)(c) + t(f+g)(d) +\end{align*} +Thus, $(f+g)\bigl( (1-t) c + td \bigr) \le (1-t) (f+g)(c) + t(f+g)(d)$, which is what we wanted to prove. +\end{solution} +\end{problem} + +\begin{problem}[2] +Problem 20. Give an example of a function that is convex and unbounded on $(0,1)$. +\begin{solution} +Let $ f(x) = 1/x $, $ x \in (0,1) $. This function is clearly unbounded and since $ f''(x) = 1/x^3\ge 0$ on $(0,1)$, +it is convex on $(0,1)$. +\end{solution} +\end{problem} + +\begin{problem}[4] +Problem 21. Define +\[ + f(x) = \begin{cases} + 2, & x = -1;\\ + x^2, & -1 < x < 2;\\ + 5, & x = 2 + \end{cases} +\] +Show $f$ is convex on $[\,-1,2\,]$ but not continuous on $[\,-1,2\,]$. +\begin{solution} +Define $g(x) = x^2$, $x\in[\,-1,2\,]$. Then $g$ is twice differentiable on $[\,-1,2\,]$ and $ g''(x) = 2\ge 0$, hence, +$g$ is convex on $[\,-1,2\,]$. Note that $ g(x) \le f(x) $ for all $x\in[\,-1,2\,]$. + +Let $[\,c,d\,]\subseteq [\,-1,2\,]$, we need to show, $\forall t \in [\,0,1\,]$, +$$ + f\bigl( (1-t)c + td \bigr) \le (1-t) f(c) + tf(d) +$$ +This inequality is \emph{always true} for $t=0$ and $t=1$, so it suffices to assume +$t\in(0,1)$, this implies $(1-t)c \ne -1$ and $ td \ne 2$, hence, $(1-t)c + td\in(-1,2)$ . Thus, +$$ + f\bigl( (1-t)c + td \bigr) = g\bigl( (1-t)c + td \bigr)) \le (1-t) g(c) + tg(d) = (1-t) f(c) + tf(d) +$$ +As the assertion about the discontinuity of $f$ (at its endpoints) is obvious, this completes the proof. +\end{solution} +\end{problem} + +\begin{problem}[3] +Problem 23. Suppose $f$ is convex on $\mathbb R$, prove $f$ is continuous on $\mathbb R$. +\begin{solution} +This is an application of \textbf{Theorem~4.28}. Let $x\in\mathbb R$, enclose $x$ in a open +interval $(a,b)$, where $a$, $b\in\mathbb R$. Then $f$ is convex on $(a,b)$, since it is convex +on $\mathbb R$, so by \textbf{Theorem~4.28}, $f$ is continuous on $(a,b)$. Since $f$ is continuous +on $(a,b)$, it is, in particular, continuous at $x\in(a,b)$. + +We have shown that for any $x\in\mathbb R$, $f$ is continuous at +$x$, this means that $f$ is continuous on $\mathbb R$. +\end{solution} +\end{problem} +\end{exam} +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/hw02.pdf b/macros/latex/contrib/eqexam/examples/hw02.pdf new file mode 100644 index 0000000000..cb3309e7f9 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/hw02.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/hw02.tex b/macros/latex/contrib/eqexam/examples/hw02.tex new file mode 100644 index 0000000000..0f03398bef --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/hw02.tex @@ -0,0 +1,143 @@ +\documentclass{article} +\usepackage[fleqn]{amsmath} +\usepackage[pdf,forpaper,cfg=hw,nopoints,useforms, +% Try compiling this file under one of these options: +% nosolutions, +% answerkey, + vspacewithsolns, +]{eqexam} + +\subject[CA]{College Algebra} +\title[HW2]{HW \#2} +\author{Dr.\ D. P. Story} +\date{Spring 2011} +\duedate{03/05/11} +\keywords{Homework due \theduedate} + +% Make the end of solution label blank +\def\exrtnlabelformat{} +\def\exrtnlabelformatwp{} +\solAtEndFormatting{\eqequesitemsep{3pt}} + + +\begin{document} + +\maketitle + +\begin{exam}{HW} + +\begin{instructions}[] +In preparation for the quiz on Thursday, solve each of these short +problems in the space provided before looking at their solutions at the +end of the document. +\[ + \text{\url{http://faculty.nwfsc.edu/web/math/storyd}} +\] +All class assignments and other announcements will be posted on +this web site. +\end{instructions} + +\begin{problem*}[4ea] +Let $P(-4,2)$ and $Q(2,-3)$ be two points in the plane. +\begin{parts} +\item Find the distance $d(P,Q)$ between $P$ and $Q$. +\begin{solution}[1in] +We use the distance formula +\[ + d(P,Q)=\sqrt{(2+4)^2+(-3-2)^2}=\sqrt{61} +\] +to obtained the required answer. +\end{solution} + +\item Find the midpoint $M$ between $P$ and $Q$. +\begin{solution}[\sameVspace] +We use the midpoint formula +\[ + M=\left(\frac{-4+2}{2},\frac{2+(-3)}{2}\right)=\left(-1,-\dfrac{1}{2}\right) +\] +to obtained the required answer. +\end{solution} +\end{parts} +\end{problem*} + +\begin{problem*}[3ea] +Complete each of the two sentences below with correct entries. +\begin{parts} + \item The function $ g(x) = | x+2 | $ can be graphed from the library + function $ f(x) = |x| $ by shifting it \fillin[u]{.25in}{2} units + \fillin[u]{1.25in}{horizontally} (horizontally/vertically) \fillin[u]{.75in}{left} (left/right/up/down). +% Make the solution label blank. +\ifkeyalt +\begin{solution}[] +% We want this to be shown at the end of the file, but not if the author changes the option +% to answerkey + The function $ g(x) = | x+2 | $ can be graphed from the library + function $ f(x) = |x| $ by shifting it \fillin[u]{.25in}{2} units + \fillin[u]{1.25in}{horizontally} (horizontally/vertically) \fillin[u]{.75in}{left} + (left/\penalty0right/\penalty0up/\penalty0down). % Note: \penalty0 is inserted to help TeX break the line after the forward slash / +\end{solution} +\fi + \item The function $ g(x) = 5 - x^2 $ can be graphed from the library + function $ f(x) = x^2 $ by first reflecting it with respect to the + \fillin[u]{.25in}{$x$} axis, then shifting it \fillin[u]{.25in}{5} units + \fillin[u]{1.25in}{vertically} (horizontally/vertically) \fillin[u]{.75in}{upward} (left/right/up/down). +\ifkeyalt +\begin{solution}[] +% We want this to be shown at the end of the file, but not if the author changes the option +% to answerkey. + The function $ g(x) = 5 - x^2 $ can be graphed from the library function + $ f(x) = x^2 $ by first reflecting it with respect to the + \fillin[u]{.25in}{$x$} axis, then shifting it \fillin[u]{.25in}{5} units + \fillin[u]{1.25in}{vertically} (horizontally/vertically) + \fillin[u]{.75in}{upward} (left/right/up/down). +\end{solution} +\fi +\end{parts} +\end{problem*} + +\begin{problem}[5] +The circle $ x^2 + y^2 = 25 $ passes through +the point $P(3,4)$. Let $\ell$ be the line passing though the origin and +the point $P$. Find the equation of the line perpendicular to line $\ell$ and passing +through point $P$. +\begin{solution}[1in] +The slope of the line perpendicular to $\ell$ is $ m = -\tfrac{3}{4} $, the line +must pass through $(3,4)$; thus, the line is $ y-4 = -\tfrac{3}{4}(x-3) \implies +y = -\tfrac{3}{4} x + \tfrac{25}{4} $. Thus, +\[ + \text{Ans:}\quad\boxed{ y = -\tfrac{3}{4} x + \tfrac{25}{4} } +\] +This is the equation of the line tangent to the circle at $P(3,4)$. +\end{solution} +\end{problem} + +\begin{problem}[3] +If the slope the a line is negative, then the line is + \begin{answers}{4} + \bChoices + \Ans0 increasing\eAns + \Ans1 decreasing\eAns + \Ans0 constant\eAns + \Ans0 none of these\eAns + \eChoices + \end{answers} + +% The \texttt{answers} and \texttt{manswers} environments can now +% be copied and pasted into the solutions environment as well. +% +\ifkeyalt +\begin{solution}[.25in] +If the slope the a line is negative, then the line is + \begin{answers}{4} + \bChoices + \Ans0 increasing\eAns + \Ans1 decreasing\eAns + \Ans0 constant\eAns + \Ans0 none of these\eAns + \eChoices + \end{answers} +\end{solution} +\fi +\end{problem} +\end{exam} +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/hw03.pdf b/macros/latex/contrib/eqexam/examples/hw03.pdf new file mode 100644 index 0000000000..a7f3a9a97a Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/hw03.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/hw03.tex b/macros/latex/contrib/eqexam/examples/hw03.tex new file mode 100644 index 0000000000..f699c0f9c3 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/hw03.tex @@ -0,0 +1,72 @@ +% hw.cfg.txt, hw03.tex attached +\documentclass{article} +\usepackage[fleqn]{amsmath} +\usepackage[pdf,forcolorpaper,cfg=hw,nopoints,useforms, +% Try compiling this file under one of these options: + nosolutions, +% answerkey, +% vspacewithsolns, +]{eqexam} + +\subject[GOV]{Government} +\title[HW3]{HW \#3} +\author{Dr.\ D. P. Story} +\date{Spring 2011} +\duedate{03/07/11} +\keywords{Homework due \theduedate} + +\forceNoColor +\useFillerLines +\vspacewithkeyOn + +%\useFillerDefault +%\fillTypeHRule +%\fillTypeDefault +%\fillTypeDashLine + +\fillTypeDots + +%\eqWriteLineColor{red} +\eqWLSpacing{14pt} + +\solAtEndFormatting{\eqequesitemsep{3pt}} + + +\begin{document} + +\maketitle + +\begin{exam}{HW} + +\begin{instructions}[] +Solve each problem, use your best effort. +\end{instructions} + +\begin{problem} +Write a short essay on how you would improve things. +\begin{solution}[2in] +I have no thoughts that I would care to share in this public forum. +\end{solution} +\end{problem} + +\fillTypeDefault + +\begin{problem*} +Write a short paragraph on each of the following topics. +\begin{parts} + \item The state of the economy. +\begin{solution}[1in] +Not good. +\end{solution} + +\fillTypeDashLine + + \item The state of politics. +\begin{solution}[3in] +Divisive. +\end{solution} +\end{parts} +\end{problem*} + +\end{exam} +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/markqs.pdf b/macros/latex/contrib/eqexam/examples/markqs.pdf new file mode 100644 index 0000000000..6c20924a70 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/markqs.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/markqs.tex b/macros/latex/contrib/eqexam/examples/markqs.tex new file mode 100644 index 0000000000..5f0b7e47b4 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/markqs.tex @@ -0,0 +1,177 @@ +\documentclass{article} +\usepackage[forpaper,pointsonleft,totalsonright, + nosolutions +]{eqexam}[2012/05/16] + + +\university +{% + NORTHWEST FLORIDA STATE COLLEGE\\ + Department of Mathematics% +} +\email{storyd@nwfsc.edu} + +\examNum{1}\numVersions{1}\forVersion{a} +\subject[DM]{Demoing Marks} +\longTitleText + {Test~\nExam} +\endlongTitleText +\shortTitleText + {T\nExam} +\endshortTitleText +\title[\sExam]{\Exam} +\author{Dr.\ D. P. Story} +\date{Spring, 2012} +\duedate{2012/04/24} +\keywords{Demonstrating various markers} + +\begin{document} + +\maketitle + +\begin{exam}{Test\nExam} + +\begin{instructions}\relax\parindent0pt\parskip6pt +Solve each without error. Passing is 100\%. + +We summarize the information in the test. (Compile three times.) + +Section I: \markStartFor{SectionI}--\markEndFor{SectionI}, this section +has \markNumQsFor{SectionI} problems. + +Section II: \markStartFor{SectionII}--\markEndFor{SectionII}, this section +has \markNumQsFor{SectionII} problems. + +Section III: \markStartFor{SectionIII}--\markEndFor{SectionIII}, this section +has \markNumQsFor{SectionIII} problems. + +Section IV: \markStartFor{SectionIV}--\markEndFor{SectionIV}, this section +has \markNumQsFor{SectionIV} problems. +\end{instructions} + +\calcQsBtwnMarkers[SectionII]{SectionI} + +\begin{problem}[5] +Problem from Section I +\end{problem} + +\begin{problem}[5] +Problem from Section I +\end{problem} + +\begin{problem}[5] +Problem from Section I +\end{problem} + +\begin{problem}[5] +Problem from Section I +\end{problem} + +\begin{problem}[5] +Problem from Section I +\end{problem} + +\begin{problem}[5] +Problem from Section I +\end{problem} + +\begin{problem}[5] +Problem from Section I +\end{problem} + +\calcQsBtwnMarkers[SectionIII]{SectionII} + +\begin{problem}[5] +Problem from Section II +\end{problem} + +\begin{problem}[5] +Problem from Section II +\end{problem} + +\begin{problem}[5] +Problem from Section II +\end{problem} + +\begin{problem}[5] +Problem from Section II +\end{problem} + +\calcQsBtwnMarkers[SectionIV]{SectionIII} + +\begin{eqComments}[Section III.] +You can separate the sections of the test with an header, like this one. +\end{eqComments} + +\begin{problem}[5] +Problem from Section III +\end{problem} + +\begin{problem}[5] +Problem from Section III +\end{problem} + +\begin{problem}[5] +Problem from Section III +\end{problem} + +\begin{problem}[5] +Problem from Section III +\end{problem} + +\begin{problem}[5] +Problem from Section III +\end{problem} + +\begin{problem}[5] +Problem from Section III +\end{problem} + +\calcQsBtwnMarkers[EndExam]{SectionIV} + +\promoteNewPage + +\begin{eqComments}[Section IV.] +You can separate the sections of the test with an header, like this one. +\end{eqComments} +\begin{problem}[5] +Problem from Section IV +\end{problem} + +\begin{problem}[5] +Problem from Section IV +\end{problem} + +\begin{problem}[5] +Problem from Section IV +\end{problem} + +\begin{problem}[5] +Problem from Section IV +\end{problem} + +\begin{problem}[5] +Problem from Section IV +\end{problem} + +\calcQsBtwnMarkers{EndExam} + +\end{exam} + +\parindent0pt \parskip6pt + +We summarize the information in the test. (Compile three times.) + +Section I: \markStartFor{SectionI}--\markEndFor{SectionI}, this section +has \markNumQsFor{SectionI} problems. + +Section II: \markStartFor{SectionII}--\markEndFor{SectionII}, this section +has \markNumQsFor{SectionII} problems. + +Section III: \markStartFor{SectionIII}--\markEndFor{SectionIII}, this section +has \markNumQsFor{SectionIII} problems. + +Section IV: \markStartFor{SectionIV}--\markEndFor{SectionIV}, this section +has \markNumQsFor{SectionIV} problems. + +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/quiz.cfg b/macros/latex/contrib/eqexam/examples/quiz.cfg new file mode 100644 index 0000000000..bc9a15aed6 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/quiz.cfg @@ -0,0 +1,7 @@ +\renewcommand\maketitledesign +{% + \makebox[\textwidth]{\normalsize + \shortstack[l]{\strut\websubject\\\webauthor, \@date}\hfill + \shortstack[l]{\webtitle\\\strut}\hfill + \shortstack[l]{\strut\eq@ExamName\\\eq@SID}}% +} diff --git a/macros/latex/contrib/eqexam/examples/quiz.cfg.txt b/macros/latex/contrib/eqexam/examples/quiz.cfg.txt new file mode 100644 index 0000000000..bc9a15aed6 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/quiz.cfg.txt @@ -0,0 +1,7 @@ +\renewcommand\maketitledesign +{% + \makebox[\textwidth]{\normalsize + \shortstack[l]{\strut\websubject\\\webauthor, \@date}\hfill + \shortstack[l]{\webtitle\\\strut}\hfill + \shortstack[l]{\strut\eq@ExamName\\\eq@SID}}% +} diff --git a/macros/latex/contrib/eqexam/examples/quiz01.tex b/macros/latex/contrib/eqexam/examples/quiz01.tex new file mode 100644 index 0000000000..176fa86392 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/quiz01.tex @@ -0,0 +1,126 @@ +\documentclass{article} +\usepackage[fleqn]{amsmath} +\usepackage[pdf,cfg=quiz,forpaper,pointsonleft, +% compile with exactly one of the following three +% nosolutions +% answerkey + vspacewithsolns +]{eqexam} + +\examNum{1}\numVersions{2}\forVersion{a} +\longTitleText + {Quiz~\nExam--003} + {Quiz~\nExam--007} +\endlongTitleText +\shortTitleText + {Q{\nExam}s3} + {Q{\nExam}s7} +\endshortTitleText + +\title[\sExam]{\bfseries\Exam} +\author{D. P. Story} +\subject[C1]{Calculus I} +\date{Spring \the\year} +\keywords{Test~\nExam, Section \ifAB{003}{007}} +\email{dpstory@uakron.edu} + +\vspacewithkeyOn +\solAtEndFormatting{\eqequesitemsep{3pt}} +\everymath{\displaystyle} + +\begin{document} + +\maketitle + +\begin{exam}{Part1} + +\begin{instructions}[Instructions:] +Solve each of the following problems without error. \textit{Show all +details.} Box in your $\boxed{\text{answers}}$. Use good notation, you +\emph{will} be marked off for bad notation. \textbf{Note:} The value of a +limit can be a number, the symbol $+\infty$, the symbol $-\infty$, or may +be labeled DNE (for ``does not exist''). +\end{instructions} + +\begin{problem}[4] +Compute $ \vA{\lim_{x\to-1}\frac{4x^2+x}{x}}\vB{\lim_{x\to2}\frac{1-3x}{x+1}}$ +\begin{solution}[2in] +As discussed in class, this is a ``Skill Level 0'' limit problem: +\[ +\begin{verA} +\lim_{x\to-1}\frac{4x^2+x}{x} + = \frac{4(-1)^2+(-1)}{-1} + = \boxed{-3} +\end{verA} +\begin{verB} + \lim_{x\to2}\frac{1-3x}{x+1} + \lim_{x\to2}\frac{1-3(2)}{2+1} + = \boxed{-\frac{5}{3}} +\end{verB} +\] +\ifkeyalt\adjDisplayBelow\fi +\end{solution} +\end{problem} + +\begin{problem}[3] +Define the function $ f(x) = \begin{cases} 2x^3 - 1 & x < -2\\ 2- x^2 & x +\ge -2\end{cases}$. Compute $\lim_{x\to\vA{-2^-}\vB{-2^+}} f(x) $, show the +details of your reasoning. + +\begin{solution}[2in] +We use standard techniques: +\begin{verA} +\begin{alignat*}{2} + \lim_{x\to-2^-} f(x) & + = \lim_{x\to-2^-} (2x^3-1) &&\qquad\text{since $ x < -2$}\\& + = 2(-2)^3 - 1&&\qquad\text{now a skill level 0 problem}\\& + = \boxed{-17} +\end{alignat*} +\end{verA} +\begin{verB} +\begin{alignat*}{2} + \lim_{x\to-2^+} f(x) & + = \lim_{x\to-2^+} (2- x^2) &&\qquad\text{since $ x < -2$}\\& + = 2 - (-2)^2&&\qquad\text{now a skill level 0 problem}\\& + = \boxed{-2} +\end{alignat*} +\end{verB} +\ifkeyalt\adjDisplayBelow\fi +\end{solution} +\end{problem} + +\begin{problem}[3] +Compute $\vA{\lim_{x\to2} \frac{1-x}{(x-2)^2}} + \vB{\lim_{x\to3} \frac{x-2}{(3-x)^2}}$ + +\begin{solution}[1in] +\begin{verA} +Notice the denominator goes to zero, but the numerator does not; +this indicates a vertical asymptote usually. Because the +denominator is squared, it's always positive. When $x$ is +``close'' to $2$, $1 - x < 0$, that is, when $x$ is ``close'' to +$2$ the numerator is \emph{negative}. The ratio of the numerator and +denominator is \emph{negative} when $x$ is ``close'' to $2$. Thus, we +conclude, +\[ + \boxed{\lim_{x\to2} \frac{1-x}{(x-2)^2} = -\infty} +\] +\end{verA} +\begin{verB} +Notice the denominator goes to zero, but the numerator does not; +this indicates a vertical asymptote usually. Because the +denominator is squared, it's always positive. When $x$ is +``close'' to $3$, $x - 2 > 0$, that is, when $x$ is ``close'' to +$3$ the numerator is \emph{positive}. The ratio of the numerator and +denominator is \emph{positive} when $x$ is ``close'' to $3$. Thus, we +conclude, +\[ + \boxed{\lim_{x\to3} \frac{x-2}{(3-x)^2} = +\infty} +\] +\end{verB} +\ifkeyalt\adjDisplayBelow\fi +\end{solution} +\end{problem} + +\end{exam} +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/quiz02.pdf b/macros/latex/contrib/eqexam/examples/quiz02.pdf new file mode 100644 index 0000000000..c06a4e1c32 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/quiz02.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/quiz02.tex b/macros/latex/contrib/eqexam/examples/quiz02.tex new file mode 100644 index 0000000000..091d20304f --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/quiz02.tex @@ -0,0 +1,146 @@ +\documentclass{article} +\usepackage[fleqn]{amsmath} +\usepackage[pdf,cfg=quiz,forpaper,pointsonleft, +% compile with exactly one of the following three + nosolutions +% answerkey +% vspacewithsolns +]{eqexam} + +\examNum{2}\numVersions{2}\forVersion{a} +\longTitleText + {Quiz~\nExam--003} + {Quiz~\nExam--007} +\endlongTitleText +\shortTitleText + {Q{\nExam}s3} + {Q{\nExam}s7} +\endshortTitleText + + +\title[\sExam]{\bfseries\Exam} +\author{D. P. Story} +\subject[C1]{Calculus I} +\date{Spring \the\year} +\keywords{Test~\nExam, Section \vA{003}\vB{007}} +\email{dpstory@uakron.edu} + +\vspacewithkeyOn +\solAtEndFormatting{\eqequesitemsep{3pt}} +\everymath{\displaystyle} + +\begin{document} + +\maketitle + +\begin{exam}{qz02} + +\begin{instructions}[Global Instructions:] +Solve each of the following problems without error. \textit{Show all details.} Box in your +$\boxed{\text{answers.}}$ Use good notation, you \emph{will} be marked off for bad notation. +\end{instructions} + +\begin{problem}[3] +Identify all numbers $x$ at which the function $ f(x) = \frac{x+2}{\sqrt{\vA{x-1}\vB{2-x}}} $ is continuous. + +\begin{solution}[.75in] +We require $ \vA{x - 1}\vB{2-x} >0 $ or $ \vA{x > 1}\vB{x<2} $. In +interval notation, the set of all numbers at which $f$ is continuous is +$\boxed{\vA{( 1, \infty )}\vB{(-\infty, 2)} }$. +\end{solution} +\end{problem} + +\begin{problem}[3] +Given $ f(x) = \begin{cases} + 3x^2 - 2x & x < -1 \\ + 6x^2 + x \vB{+1} & x \ge -1 +\end{cases}$. Is this function (a) continuous at $ x = -1 $;, (b)~discontinuous with a removable discontinuity +at $ x = -1 $; or (c)~discontinuous with a jump discontinuity at $ x = -1 $? Justify your response. + +\begin{solution}[2in] +Look at the left and right limits: +\begin{align*} + \lim_{x\to-1^-}f(x) &= \lim_{x\to-1^-} 3x^2 - 2x = 5\\ + \lim_{x\to-1^+}f(x) &= \lim_{x\to-1^+} 6x^2 + x \vB{+1} = \vA{5}\vB{6} \vA{=}\vB{\neq} f(-1) +\end{align*} +Thus, $\lim_{x\to-1^-}f(x) \vA{=}\vB{\neq} +\lim_{x\to-1^+}f(x)\vA{=f(-1)}$. The two sided limit \vA{exists}\vB{does +not exist}\vA{ and $\lim_{x\to-1}f(x)=f(-1)$}. This function \vA{is}\vB{is +not} continuous at $x=-1$, \vB{it has a jump discontinuity, since +$\lim_{x\to-1^-}f(x) \neq \lim_{x\to-1^+}f(x)$}; as a result, the answer +is \vA{(a)}\vB{(c)}. +\end{solution} +\end{problem} + +\begin{problem}[4] +Define the function $ f(x) = 3x^2 - 2x $. Use one of the formulas: +\[ + m = \lim_{x\to a} \frac{f(x) - f(a)}{x-a}\quad\text{or}\quad + m = \lim_{h\to 0} \frac{f(a+h) - f(a)}{h} +\] +Then the slope of the line tangent to the graph of $f$ at the point $ +\vA{( 1, 1 )}\vB{(-1,5)} $. + +\renameSolnAfterTo{} +\begin{solution}[2in]\ifkeyalt We make the following calculations:\fi +\begin{multicols}{2} +\noindent\textbf{Calculations} +\begin{verA} +\begin{alignat*}{2} + m &= \lim_{x\to1} \frac{f(x)-f(1)}{x-1}\\& + = \lim_{x\to1} 3x+1&&\quad\text{from side calc}\\& + = \boxed4 +\end{alignat*} +\end{verA} +\begin{verB} +\begin{alignat*}{2} + m &= \lim_{x\to-1} \frac{f(x)-f(-1)}{x+1}\\& + = \lim_{x\to-1} 3x-5&&\quad\text{from side calc}\\& + = \boxed{-8} +\end{alignat*} +\end{verB} + +\columnbreak +\noindent\textbf{Side Calculations} +\begin{verA} +\begin{align*} + f(x)-f(1) &= 3x^2 - 2x - 1\\& + = (x-1)(3x+1) +\intertext{thus, the difference quotient is} + \frac{f(x)-f(1)}{x-1} &= 3x+1 +\end{align*} +\end{verA} +\begin{verB} +\begin{align*} + f(x)-f(-1) &= 3x^2 - 2x - 5\\& + = (x+1)(3x-5) +\intertext{thus, the difference quotient is} + \frac{f(x)-f(-1)}{x+1} &= 3x-5 +\end{align*} +\end{verB} + + +\vfill +\vspace*{\sameVspace} +\vfill +\end{multicols} +\end{solution} +\begin{workarea}{\sameVspace}\parindent0pt\bfseries +\begin{multicols}{2} +\textbf{Calculations} + +\vfil\vspace*{\sameVspace}\vfil + + +\columnbreak +\textbf{Side Calculations} + +\vfil\vspace*{1.9in}\vfil + +\end{multicols} +\end{workarea} + +\end{problem} + +\end{exam} +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/selectversion_tst.tex b/macros/latex/contrib/eqexam/examples/selectversion_tst.tex new file mode 100644 index 0000000000..9c43ce6e79 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/selectversion_tst.tex @@ -0,0 +1,221 @@ +\documentclass{article} +\usepackage[fleqn]{amsmath} +% +% Try these various options. +% +\usepackage[pointsonleft,nototals,forpaper,useforms, +% Select exactly one of the next three options +% nosolutions, +% answerkey, + vspacewithsolns, + obeylocalversions, % try this in combination with +]{eqexam} + +\university +{% + NORTHWEST FLORIDA STATE COLLEGE\\ + Department of Mathematics +} +\email{storyd@nwfsc.edu} + +\examNum{1}\numVersions{5}\forVersion{e} +\subject[CA]{College Algebra} +\longTitleText + {Test~{\nExam} A} + {Test~{\nExam} B} + {Test~{\nExam} C} + {Test~{\nExam} D} + {Test~{\nExam} E} +\endlongTitleText +\shortTitleText + {T\nExam-A} + {T\nExam-B} + {T\nExam-C} + {T\nExam-D} + {T\nExam-E} +\endshortTitleText +\title[\sExam]{\Exam} +\author{Dr.\ D. P. Story} +\date{\thisterm, \the\year} +\duedate{09/30/09} +\keywords{MAC 1105, Exam \nExam, {\thisterm} semester, \theduedate, at NWFSC} + +\newcommand{\cs}[1]{\texttt{\char`\\#1}} +\solAtEndFormatting{\eqequesitemsep{3pt}} +\turnContAnnotOn + + +\begin{document} + +\maketitle + +\begin{exam}{T1} + +\begin{eqComments}[Instructions:] +This file was used to test the revised definitions of +\cs{longTitleText} \cs{shortTitleText}, and \cs{selectVersion}. This +file has 5 versions, \verb!\numVersions{5}!; however, not every +problem has this number of versions, some have 2, other have 3 or 4. +When you specify a value of \cs{forVersion}, and each problem has a +\cs{selectVersion}, \textsf{eqexam} will perform modular arithmetic +on the number of available versions of a problem, in this way each +problem will be properly posed; consequently, when we say +\verb!\forVersion{e}!, we get version B for the first problem, +version A for 2(a), and so on. Try compiling with other values for +\cs{forVersion} (a--e). + +Try compiling the document with the with the \texttt{vspacewithsolns} option +\begin{verbatim} + \usepackage[vspacewithsolns.pointsonleft,nototals,forpaper,useforms]{eqexam} +\end{verbatim} +The solutions appear at the end of the document, note the solutions +match to the version selected for the question. This required a +little trick with the solutions file, and requires the exerquiz +package dated 2009/10/05 or later, if one of the pdf options is +used (\texttt{pdf}, \texttt{links}, \texttt{online}, +\texttt{email}). + +After you have exhausted yourself, try using the \texttt{obeylocalversions} option, +for this to work correctly, you need to comment out the \cs{forVersion} specification +in the preamble. Go through the file and select one of the versions, by specifying +the first argument of the \cs{selectVersion} command. + +Another feature, apropos to the \texttt{obeylocalversions} option is the optional +argument of \cs{longTitleText} and \cs{shortTitleText}. If you say +\cs{longTitleText[b]}, the second title is selected for display in the document; +similarly, for \cs{shortTitleText}. The optional argument can also be used +when \texttt{obeylocalversions}, and the version is set by \cs{forVersion}. +\end{eqComments} + +\selectVersion{}{3} +\begin{problem}[5] +\verb!\selectVersion{}{3}! This problem is version \vA{A}\vB{B}\vC{C} of 3. + +\begin{solution} +The first problem, version \vA{A}\vB{B}\vC{C} of 3. +\end{solution} +\end{problem} + +\begin{problem*}[2ea] +Multi-part question. + \begin{parts} +\selectVersion{}{4} + \item \verb!\selectVersion{}{4}! This is problem, version \vA{A}\vB{B}\vC{C}\vD{D} of 4. +\begin{solution} +This is version \vA{A}\vB{B}\vC{C}\vD{D} + +The answer is: +\begin{verA} +This is version A +\end{verA} +\begin{verB} +This is version B +\end{verB} +\begin{verC} +This is version C +\end{verC} +\begin{verD} +This is version D +\end{verD} +\end{solution} + +\selectVersion{}{3} + \item \verb!\selectVersion{}{3}! This is a problem, version \vA{A}\vB{B}\vC{C} of 3. +\begin{verA} +This is A +\end{verA} +\begin{verB} +This is version B +\end{verB} +\begin{verE} +This is version E +\end{verE} + +\begin{solution} +This is version \vA{A}\vB{B}\vC{C}\vD{D} + +The answer is: +\begin{verA} +This is version A +\end{verA} +\begin{verB} +This is version B +\end{verB} +\begin{verC} +This is version C +\end{verC} +\begin{verD} +This is version D +\end{verD} +\end{solution} + +\pushProblem +\begin{eqComments} +We insert a new page command so we can see the shortened titles on the next page +to verify that the new system of title management is working correctly. +\end{eqComments} +\emitMessageNearBottom*[.5\textheight]{% + \vfill\hfill\textbf{Problem~{\eqeCurrProb} continues on next page}} +\popProblem + +\selectVersion{}{5} + \item \verb!\selectVersion{}{5}! This is a problem, version \vA{A}\vB{B}\vC{C}\vD{D}\vE{E} of 5. + +\begin{verB} +This is version B +\end{verB} +\begin{verE} +This is version E +\end{verE} + +\begin{solution} +This is version \vA{A}\vB{B}\vC{C}\vD{D}\vE{E} + +The answer is: +\begin{verB} +This is version B +\end{verB} +\begin{verE} +This is version E +\end{verE} +\end{solution} + +\selectVersion{}{4} + \item \verb!\selectVersion{}{4}! This is a problem, version \vA{A}\vB{B}\vC{C}\vD{D} of 4. +\begin{verA} +This is A +\end{verA} +\begin{verB} +This is version B +\end{verB} +\begin{verE} +This is version E +\end{verE} +\begin{solution} +This is version \vA{A}\vB{B}\vC{C}\vD{D}\vE{E}. + +The answer is: +\begin{verA} +This is version A +\end{verA} +\begin{verB} +This is version B +\end{verB} +\begin{verC} +This is version C +\end{verC} +\begin{verD} +This is version D +\end{verD} +\begin{verE} +This is version E +\end{verE} +\end{solution} + +\end{parts} +\end{problem*} + + +\end{exam} + +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/test01.tex b/macros/latex/contrib/eqexam/examples/test01.tex new file mode 100644 index 0000000000..102b7b61e0 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/test01.tex @@ -0,0 +1,448 @@ +\documentclass[12pt]{article} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage[% +% online, % try commenting out this option to get a paper document +% nosolutions, +% answerkey, + vspacewithsolns, + forcolorpaper, + pointsonleft,totalsonright,noparttotals, + coverpage,coverpagesumry=bypages + ]{eqexam} + +\title[T1]{Test 1} +\author{D. P. Story} +\subject[C1]{Calculus I} +\date{Spring \the\year} +\keywords{Test~1, Section 001} + +\university +{% + THE UNIVERSITY OF AKRON\\ + Theoretical and Applied Mathematics +} +\email{dpstory@uakron.edu} + +\solAtEndFormatting{\eqequesitemsep{3pt}} +\turnContAnnotOn + +\optsFillIn{\BC{0.847 0.847 0.847}} +\optsMlTextField{\BC{0.847 0.847 0.847}} +\eqExamName[\Ff\FfRequired\BC{0.847 0.847 0.847}]{2.25in} +\eqSID[\Ff\FfRequired\BC{0.847 0.847 0.847}]{2.25in} +\cpSetSumryWidth{.55\textwidth-1em} + +\hfuzz = .7pt + +\vspacewithkeyOn + +\begin{document} +\maketitle + + +\begin{exam}[Part I.]{Part1} + +\begin{instructions}[Part I.] +Solve each of the problems without error. If you make an error, +points will be subtracted from your total score. +\end{instructions} + +\begin{problem}[5] +This is an example of a objective question, the student fills in +his/her response in the space below. + +\begin{solution}[.5in] +The solution to the question. This solution will not appear when +the option \texttt{nosolutions} is specified. It will appear +immediately after the question with the \texttt{solutionsafter} +option, and appear at the end of the document if a solutions +option is not specified. +\end{solution} +\end{problem} + + +\begin{problem}[5] +An example of a fill-in question: +It is well known that \fillin{1in}{Newton} and +\fillin{1in}{Leibniz} are jointly credited as the founders of +modern calculus. + +\begin{solution} +It is well known that \underbar{Newton} and \underbar{Leibniz} are +jointly credited as the founders of modern calculus. + +\medskip\noindent\textbf{Notes.} Here the optional argument for +the \texttt{solution} environment is not specified, this implies +that no room should be left for the student to answer, seems +reasonable since this is a fill-in. +\end{solution} +\end{problem} + +\begin{problem*}[2ea] +\textit{True} or \textit{False}. No justification needed. + +% Comment out this next line to see the effect. +\fillinWidth\defaultTFwidth + +\begin{parts} + + \item[h] \TF{T} If triangles have $4$ sides, then all monkeys + are green. Now is the time for all good men to come to the aid + of their country. + +\begin{solution} + This is the solution, let's hope it's correct, or I would be + embarrassed to no end. Now is the time for all good men to + come to the aid of their country. + + \medskip\noindent\textbf{Notes.} This \texttt{\string\item} + has an optional argument `\texttt{[h]}', so the + solution will not appear at the end of the document when there + is no solutions option, but will appear when + \texttt{solutionsafter} is specified. The + \texttt{nohiddensolutions} option can override this feature. +\end{solution} + + \item[H] \TF{T} $1+1=3$ iff $\sqrt2$ is a rational number. Now + is the time for all good men to come to the aid of their + country. + +\begin{solution} + \textbf{Notes.} This \texttt{\string\item} has an optional + argument `\texttt{[H]}', so the solution will not appear at + the end of the document when there is no solutions option, nor + does it appear when \texttt{solutionsafter} is specified. The + \texttt{noHiddensolutions} option can override this feature. +\end{solution} + + \item[h] \TF{F} $(\forall x)(\exists y)(xy>1)$\hskip1em($x$, + $y$~real numbers). Now is the time for all good men to come to + the aid of their country. +\begin{solution} +This is a tough solution. +\end{solution} + + \item[h] \TF{F} $(\forall x)(\exists y)(\forall z)(z(x+y)>0)$, + \hskip1em($x$,~$y$, and~$z$ real numbers). +\begin{solution} +This is a tough solution. +\end{solution} + +\end{parts} +\end{problem*} + +\begin{problem*}[\auto] +Here is an example of a auto calculate problem. It takes the +optional argument `\texttt{[\string\auto]}'. You specify the +points associated with each part using the \texttt{\string\PTs} +command. + +\begin{parts} + +\item \PTs{10} This a hard one! + +\begin{solution}[.75in] +This is a tough solution. +\end{solution} + +\item \PTs{5} This one is ``half'' as hard. + +\begin{solution}[\sameVspace] +This solution is easy. +\end{solution} + +\end{parts} +\end{problem*} + +%\newpage + + +\begin{problem*}[\auto] \sqForms +Select the correct answer for each of the following multiple +choice. There is only one correct answer. +\begin{parts}[2] + + \item\PTs{6} In what year did Columbus sail the ocean blue? + \begin{answers}{2} % specify tabular any with 6 columns + \bChoices + \Ans0 1490\eAns + \Ans0 1491\eAns + \Ans1 1492\eAns + \Ans0 1493\eAns + \eChoices + \end{answers} +\begin{solution} + Yes, Columbus sailed the ocean blue in 1492. +\end{solution} +&% + \item\PTs{4} In what year did Columbus sail the ocean blue? + \begin{answers}{1} % specify a list environment. + \bChoices + \Ans0 1490\eAns + \Ans0 1491\eAns + \Ans1 1492\eAns + \Ans0 1493\eAns + \eChoices + \end{answers} +\begin{solution} + Yes, Columbus sailed the ocean blue in 1492. +\end{solution} +\end{parts} +\end{problem*} + + +\begin{problem}[5] +Which of the following best describes Augustin Cauchy? + +\sqForms % change this multiple choice to a forms style. + +%\begin{multicols}{2} + +% use two columns + +\begin{answers}{1} % an argument of 1 means list style +\bChoices + \Ans0 He developed the Calculus while his University was closed + for the plague.\eAns % Newton + + \Ans0 Given credit for first using the functional notation + $f(x)$.\eAns % Euler + + \Ans0 He created the ``bell-shaped curve'' and first used the + method of least squares.\eAns % Gauss + + \Ans1 He first formulated a precise definition of the limit + and continuity of a function.\eAns % Cauchy + + \Ans0 Gave a rigorous definition of the definite integral---an + integral that now bears his name.\eAns % Riemann + + \Ans0 His notation for the derivative and the integral is used + even to this day.\eAns % Leibnitz +\eChoices + +\end{answers} + +%\end{multicols} + +\begin{solution} +This is a solution to a problem question. +\end{solution} + +\end{problem} + +\begin{problem}[5] +Which of the following are primary colors? + \begin{manswers}{6} % specify tabular any with 6 columns + \bChoices + \Ans1 Blue\eAns + \Ans0 Green\eAns + \Ans1 Yellow\eAns + \Ans0 Orange\eAns + \Ans1 Red\eAns + \eChoices + \end{manswers} +\begin{solution} + Yes, Columbus sailed the ocean blue in 1492. +\end{solution} +\end{problem} + +% We remove this problem if the online option is taken. +\ifeqeonline\else +\begin{problem}[3] +This is a question. Work \OnBackOfPage, and be quick about it! +\begin{solution}[1in] +This is the solution, let's hope it's correct, or I would be +embarrassed to no end. +\end{solution} +% +% This example illustrates the use of the work area. Place the +% \texttt{workarea} environment just below the \texttt{solution} environment, it's +% parameter must be the same as the one specified by \texttt{solution}. The material +% in the \texttt{workarea} environment will lay on top the vertical space generated above, +% when the \texttt{nosoutions} option is specified; otherwise, it does nothing. +% +\begin{workarea}[.5\linewidth]{1in} +Peter piper picked a peck of pickled peppers, how many pecks of pickled +peppers did Peter Piper pick? +% +\vfill\hfill\setlength{\fboxsep}{6pt}\fbox{Answer: \fillin[b]{1in}{17}} +\end{workarea} +\end{problem} +\fi + +% The previous solution works well for paper publications, however, when the online +% or email option is taken, a text field is created for the student to type into, +% the graphics and text are superimposed on top this text field, so the student +% types over these elements, not a good solution in this case. +% +% The next example illustrates a work around. It works for both paper and for online +% documents. + +\begin{problem}[5] +This is a question worth $5$ points. + +\begin{splitsolution} +\begin{panel}\relax +\includegraphics[scale=.2]{fig1} +\end{panel} +\begin{solution}[1in] +This a really good solution. I hope this solution is correct or I will be total +embarrassed to no end. Even if it is wrong, maybe the students will appreciate +my tremendous effort. You can see from the figure that the solution is obvious. +What is less obvious is why this works! +\end{solution} +\end{splitsolution} +\end{problem} + +% Here is the same layout, but without the computation of the figure width and height +% Here I set the width to 1in and the depth to 1.25in. + +\begin{problem}[7] +This is a question worth $7$ points. + +\begin{splitsolution}[1.25in] +\begin{panel}\relax +\includegraphics[scale=.2]{fig1} +\end{panel} +\begin{solution} +This a really good solution. I hope this solution is correct or I will be total +embarrassed to no end. Even if it is wrong, maybe the students will appreciate +my tremendous effort. You can see from the figure that the solution is obvious. +What is less obvious is why this works! +\end{solution} +\end{splitsolution} +\end{problem} + + +% This example illustrates multiple part a question + +\begin{problem*}[10ea] +Answer each of the following questions. +\begin{parts} +\item This is a question. + +%\sbox{\eqpanelbox}{\includegraphics[scale=.2]{fig1}} + +%\previewtrue + +\begin{splitsolution} +\begin{panel}[r] +\includegraphics[scale=.2]{fig1} +\end{panel} +\begin{solution} +This a really good solution. I hope this solution is correct or I will be total +embarrassed to no end. Even if it is wrong, maybe the students will appreciate +my tremendous effort. You can see from the figure that the solution is obvious. +What is less obvious is why this works! +\end{solution} +\end{splitsolution} + +\item This is a question. +\begin{solution}[.75in] +Now is the time for all good men to come to the aid of their country. +Now is the time for all good men to come to the aid of their country. +Now is the time for all good men to come to the aid of their country. +\end{solution} +\end{parts} +\end{problem*} + +% The next problem falls at the bottom of the the page, so I'll increment +% \nbaselineskip from 6\baselineskip, the default, to 7\baselineskip. +% This is enough to move the problem to the next page. + +\nbaselineskip{7} + +% This example illustrates multiple part a question using the multicol package + +\begin{problem*}[12] +Solve each of the following. Work \OnBackOfPage. +\begin{multicols}{2} + + + +\begin{parts} +\item This is a question. Be sure you don't make any error, I'm watching. + +\begin{solution}[1in] +This is the solution. +\end{solution} + +\item This is a question. +\begin{solution}[\sameVspace] +This is the solution. +\end{solution} + +\item This is a question. +\begin{solution}[\sameVspace] +This is the solution. +\end{solution} + +\item This is a question. +\begin{solution}[\sameVspace] +This is the solution. +\end{solution} +\end{parts} +\end{multicols} +\end{problem*} + +\end{exam} + +\begin{exam}[Part II.]{Part2} + +\begin{instructions}[Part II.] +The following is a short review of previously mastered material. +\end{instructions} + +\begin{problem}[5] +This is a question. +\begin{solution}[.5in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[7] +This is a question. +\begin{solution}[.5in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[8] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[5] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[10] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[5] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[10] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} +\end{exam} + +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/test02.pdf b/macros/latex/contrib/eqexam/examples/test02.pdf new file mode 100644 index 0000000000..2a4c84b5d8 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/test02.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/test02.tex b/macros/latex/contrib/eqexam/examples/test02.tex new file mode 100644 index 0000000000..c8dec50985 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/test02.tex @@ -0,0 +1,370 @@ +\documentclass[10pt]{article} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage[vspacewithsolns, +% coverpage,coverpagesumry=byparts, + pointsonboth,totalsonright,forpaper]{eqexam} + +\title[T2]{Test 2} +\author{D. P. Story} +\subject[C1]{Calculus I} +\date{Spring \the\year} +\keywords{Test~2, Section 001} + +\university +{% + THE UNIVERSITY OF AKRON\\ + Theoretical and Applied Mathematics +} +\email{dpstory@uakron.edu} + +\solAtEndFormatting{\eqequesitemsep{3pt}} + + +\begin{document} + +\maketitle + +\begin{exam}[Part I.]{Part1} + +\begin{instructions}[Part I.] +Solve each of the problems without error. If you make an error, +points will be subtracted from your total score. +\end{instructions} + + +\begin{problem}[5] +This is an example of a objective question, the student fills in his/her response +in the space below. + +\begin{solution}[.5in] +The solution to the question. This solution will not appear when +the option \texttt{nosolutions} is specified. It will appear +immediately after the question with the \texttt{solutionsafter} +option, and appear at the end of the document if a solutions +option is not specified. +\end{solution} +\end{problem} + + +\begin{problem}[5] +An example of a fill-in question: +It is well known that \fillin{1in}{Newton} and +\fillin{1in}{Leibniz} are jointly credited as the founders of +modern calculus. + +\begin{solution} +It is well known that \underbar{Newton} and \underbar{Leibniz} are +jointly credited as the founders of modern calculus. + +\medskip\noindent\textbf{Notes.} Here the optional argument for +the \texttt{solution} environment is not specified, this implies +that no room should be left for the student to answer, seems +reasonable since this is a fill-in. +\end{solution} +\end{problem} + +\begin{problem*}[3ea] +\textit{True} or \textit{False}. No justification needed. + +% Comment out this next line to see the effect. +\fillinWidth\defaultTFwidth + +\begin{parts} + + \item[h] \TF{T} If triangles have $4$ sides, then all monkeys + are green. Now is the time for all good men to come to the aid + of their country. + +\begin{solution} + This is the solution, let's hope it's correct, or I would be embarrassed to no end. + Now is the time for all good men to come to the aid + of their country. + + \medskip\noindent\textbf{Notes.} This \texttt{\string\item} + has an optional argument `\texttt{[h]}', so the + solution will not appear at the end of the document when there + is no solutions option, but will appear when + \texttt{solutionsafter} is specified. The + \texttt{nohiddensolutions} option can override this feature. +\end{solution} + + \item[H] \TF{T} $1+1=3$ iff $\sqrt2$ is a rational number. Now is the time for all good men to come to the aid + of their country. + +\begin{solution} + \textbf{Notes.} This \texttt{\string\item} has an optional argument `\texttt{[H]}', so + the solution will not appear at the end of the document when there is no solutions option, nor does + it appear when \texttt{solutionsafter} is specified. The + \texttt{noHiddensolutions} option can override this feature. +\end{solution} + + \item[h] \TF{F} $(\forall x)(\exists y)(xy>1)$\hskip1em($x$, $y$~real numbers). Now is the time for all good men to come to the aid + of their country. + + \item[h] \TF{F} $(\forall x)(\exists y)(\forall z)(z(x+y)>0)$, + \hskip1em($x$,~$y$, and~$z$ real numbers). + +%\end{exam} +%\end{document} + + + + +\end{parts} +\end{problem*} + + + +\begin{problem*}[\auto] +Here is an example of a auto calculate problem. It takes the optional +argument `\texttt{[\string\auto]}'. You specify the points associated with each part +using the \texttt{\string\PTs} command. + +\begin{parts} + +\item \PTs{10} This a hard one! + +\begin{solution}[1in] +This is a tough solution. +\end{solution} + +\item \PTs{5} This one is ``half'' as hard. + +\begin{solution}[1in] +This solution is easy. +\end{solution} + +\end{parts} +\end{problem*} + +\begin{problem*}[\auto]\sqForms +Select the correct answer for each of the following multiple choice. There is +only one correct answer. +\begin{parts} + \item\PTs{5} In what year did Columbus sail the ocean blue? + \begin{answers}{6} % specify 6 columns for a tabular environment + \Ans0 1490 &\Ans0 1491 &\Ans1 1492 &\Ans0 1493 + \end{answers} +\begin{solution} +Yes, Columbus sailed the ocean blue in 1492. +\end{solution} + + \item\PTs{6} In what year did Columbus sail the ocean blue? + \begin{answers}{1} % specify a list environment. + \Ans0 1490 + \Ans0 1491 + \Ans1 1492 + \Ans0 1493 + \end{answers} +\begin{solution} +Yes, Columbus sailed the ocean blue in 1492. +\end{solution} + +\end{parts} +\end{problem*} + + +\begin{problem}[5] +Which of the following best describes Augustin Cauchy? + +\sqForms % change this multiple choice to a forms style. + +\begin{multicols}{2} + +% use two columns + +\begin{answers}{1} % an argument of 1 means list style + +\Ans0 He developed the Calculus while his University was closed +for the plague. % Newton +\Ans0 Given credit for first using the functional notation +$f(x)$. % Euler +\Ans0 He created the ``bell-shaped curve'' and first used the +method of least squares. % Gauss + +\Ans1 He first formulated a precise definition of the limit +and continuity of a function. % Cauchy +\Ans0 Gave a rigorous definition of the definite integral---an +integral that now bears his name. % Riemann +\Ans0 His notation for the derivative and the integral is used +even to this day. % Leibniz + +\end{answers} +\end{multicols} + + +\begin{solution} +This is a solution to a problem question. +\end{solution} + +\end{problem} + +\begin{problem}[3] +This is a question. Work \OnBackOfPage, and be quick about it! + +\begin{solution}[1in] +This is the solution, let's hope it's correct, or I would be embarrassed to no end. +\end{solution} +% +% This example illustrates the use of the work area. Place the +% \texttt{workarea} environment just below the \texttt{solution} environment, it's +% parameter must be the same as the one specified by \texttt{solution}. The material +% in the \texttt{workarea} environment will lay on top the vertical space generated above, +% when the \texttt{nosoutions} option is specified; otherwise, it does nothing. +% +\begin{workarea}[.5\linewidth]{1in} +Peter piper picked a peck of pickled peppers, how many pecks of pickled +peppers did Peter Piper pick? +% +\vfill\hfill\setlength{\fboxsep}{6pt}\fbox{Answer: \fillin[b]{1in}{17}} +\end{workarea} +\end{problem} + +\begin{problem}[7] +This is a question. Now is the time for all good men to come to +the aid of their country. Peter Piper picked a peck of pickled +peppers. Use the figure below. + + +\begin{solution}[1in] +This a really good solution. I hope this solution is correct or I will be +embarrassed to no end. Even if it is wrong, maybe the students will appreciate +my effort. You can see from the figure that the solution is obvious. +(You could also use commands from a figure wrapping package as well.) +\end{solution} +\begin{workarea}[\linewidth]{1in} +\hfill\includegraphics[scale=.2]{fig1} +\end{workarea} +\end{problem} + +% The previous solution works well for paper publications, however, when the online +% or email option is taken, a text field is created for the student to type into, +% the graphics and text are superimposed on top this text field, so the student +% types over these elements, not a good solution in this case. +% +% The next example illustrates a work around. It works for both paper and for online +% documents. + +\begin{problem}[5] +This is a question worth $5$ points. + +\begin{solution}[1.5in] +This a really good solution. I hope this solution is correct or I will be total +embarrassed to no end. Even if it is wrong, maybe the students will appreciate +my tremendous effort. You can see from the figure that the solution is obvious. +\end{solution} +\end{problem} + +% This example illustrates multiple part a question + +\begin{problem*}[10ea] +Answer each of the following questions. +\begin{parts} +\item This is a question. +\begin{solution}[1in] +Now is the time for all good men to come to the aid of their country. +Now is the time for all good men to come to the aid of their country. +Now is the time for all good men to come to the aid of their country. +\end{solution} +\item This is a question. +\begin{solution}[1in] +Now is the time for all good men to come to the aid of their country. +Now is the time for all good men to come to the aid of their country. +Now is the time for all good men to come to the aid of their country. +\end{solution} +\end{parts} +\end{problem*} + +% This example illustrates multiple part a question using the multicol package + +\begin{problem*}[12] +Solve each of the following. Work \OnBackOfPage +\begin{multicols}{2} + +\def\solnsp{1in} + +\begin{parts} +\item This is a question. Be sure you don't make any error, I'm watching. + +\begin{solution}[\solnsp] +This is the solution. +\end{solution} + +\item This is a question. +\begin{solution}[\solnsp] +This is the solution. +\end{solution} + +\item This is a question. +\begin{solution}[\solnsp] +This is the solution. +\end{solution} + +\item This is a question. +\begin{solution}[\solnsp] +This is the solution. +\end{solution} +\end{parts} +\end{multicols} +\end{problem*} + +\end{exam} + +\begin{exam}[Part II.]{Part2} + +\begin{instructions}[Part II.] +The following is a short review of previously mastered material. +\end{instructions} + +\begin{problem}[5] +This is a question. +\begin{solution}[.5in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[7] +This is a question. +\begin{solution}[.5in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[8] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[5] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[10] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[5] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} + +\begin{problem}[10] +This is a question. +\begin{solution}[1in] +This is the solution to answer all questions. +\end{solution} +\end{problem} +\end{exam} + +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/test03.pdf b/macros/latex/contrib/eqexam/examples/test03.pdf new file mode 100644 index 0000000000..74f5c5b3d8 Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/test03.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/test03.tex b/macros/latex/contrib/eqexam/examples/test03.tex new file mode 100644 index 0000000000..717c41a4f8 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/test03.tex @@ -0,0 +1,581 @@ +\documentclass{article} +\usepackage[fleqn]{amsmath} +\usepackage[pointsonleft,nototals, + forcolorpaper,useforms, +% choose to compile with exactly one of the next 4 options +%------------------- + nosolutions, % compile with no solutions to get the exam document +% answerkey, % get answer key +% vspacewithsolns,% put solutions at end of document +% solutionsonly, % compile with vspacewithsolns several times, then compile with solutionsonly +%------------------- +% coverpage,coverpagesumry=bypages + showgrayletters]{eqexam} +\usepackage{graphicx} + +\forceNoColor +\vspacewithkeyOn + +\university +{% + NORTHWEST FLORIDA STATE COLLEGE\\ + Department of Mathematics +} +\email{storyd@nwfsc.edu} + +\examSIDLabel{Class: MAC 1105, \vA{12:30 pm, L-134}\vB{12:30 am, L-105}} +\coverpageSubjectFmt{\bfseries\LARGE} +\coverpageTitleFmt{\bfseries\LARGE} +\examNum{3}\numVersions{2}\forVersion{a} +\subject[MAC1105]{College Algebra} +\longTitleText + {Test~\nExam} + {Test~\nExam} +\endlongTitleText +\shortTitleText + {T\nExam} + {T\nExam} +\endshortTitleText +\altTitle{\vA{12:30 pm, L-134}\vB{12:30 pm, L-105}} +\title[\sExam]{\Exam} +\author{Dr.\ D. P. Story} +\date{\thisterm, \the\year} +\duedate{04/05/11} +\keywords{MAC 1105, Exam \nExam, {\thisterm} semester, \theduedate, at NWFSC} +\renewcommand{\fillInFormatDefault}{} +\DoNotFitItIn +\eqpartsitemsep{3pt} +\solAtEndFormatting{\eqequesitemsep{3pt}} + + +\everymath{\displaystyle} +%\renameSolnAfterTo{} +%\resetSolnAfterToDefault + + +\eqCommentsColor{gray} +\eqCommentsColorBody{gray} +\newcommand{\cs}[1]{\texttt{\char`\\#1}} +\def\qt#1{&&\qquad\text{#1}} + + +\encloseProblemsWith{theseproblems} + +\begin{document} + +\maketitle + + +\begin{exam}{Test\nExam} + +\ifsolutionsonly\NoPoints +\begin{instructions}[Solutions:] +The solutions to the test. +\end{instructions} +\else +\begin{instructions}[Instructions:] +This exam has {\nQuesInExam} questions distributed over {\nPagesOnExam} pages. +Solve each of the problem and box in your final $\boxed{\text{answer}}$, where applicable. +\end{instructions} +\fi + +\begin{theseproblems} + +\renameSolnAfterTo{} + +\begin{problem*}[2ea]\label{shortAns} +Answer each of the following, none of the problems shown below requires any +calculations. Respond to True/False questions with \texttt{T} (for True) or \texttt{F} (for +False). +\begin{parts} + \item When viewing the graph of a function, we may use the + \fillin[u]{1.5in}{Horizontal Line} Test to determine if it is a + one-to-one function. +\begin{solution}[]\ifvspacewithsolns +When viewing the graph of a function, we may use the +\fillin[u]{1.5in}{Horizontal Line} Test to determine if it is a +one-to-one function.\fi +\end{solution} + + \item \TF{F} (\texttt{T} or \texttt{F}) The graph of the function $ f(x) = + 2-4x-3x^2$ is a parabola that opens up. +\begin{solution}[]\ifvspacewithsolns +\TF{F} (\texttt{T} or \texttt{F}) The graph of the function $ f(x) = +2-4x-3x^2$ is a parabola that opens up.\fi +\end{solution} + + \item \TF{F} (\texttt{T} or \texttt{F}) For a quadratic function of the form + $f(x)=ax^2+bx+c$, if $a>0$, then the function has a \emph{maximum + value}. +\begin{solution}[]\ifvspacewithsolns +\TF{F} (\texttt{T} or \texttt{F}) For a quadratic function of the form + $f(x)=ax^2+bx+c$, if $a>0$, then the function has a \emph{maximum + value}.\fi +\end{solution} + +\pushProblem + +\begin{eqComments}[Comments:] +Questions like the three above (fill-in and True/False) often have no +solution; hence, normally, the \texttt{solution} environment is not used. When +using the \texttt{vspacewithsolns} or the \texttt{solutionsonly} options +you would like the ``answers'' to appear on the solutions pages. To +rectify this, we simply copy and past the item into a solutions +environment, like so, in the case of the last question above. +\begin{verbatim} +\begin{solution}[]\ifvspacewithsolns +\TF{F} (\texttt{T} or \texttt{F}) For a quadratic function of the form + $f(x)=ax^2+bx+c$, if $a>0$, then the function has a \emph{maximum + value}.\fi +\end{solution} +\end{verbatim} +The optional argument is empty (important). We don't want the student or instructor to +see this solution when the document is compiled using the \texttt{answerkey} +option, so we wrap this solution in a conditional +\verb~\ifvspacewithsolns...\fi~ This switch will be true if either the +options \texttt{vspacewithsolns} or \texttt{solutionsonly} options are +taken +\end{eqComments} + +\popProblem + + \item\label{whichRatFunc} Which rational function below has a horizontal asymptote of + $y=-2$, and has vertical asymptotes of $x=1$ (odd) and $ x=2 $ (even)? + \begin{answers}{3}\rowsep{6pt} + \bChoices[label=whichRat] + \Ans0 $ y = \frac{(x+2) (1-2x)}{(1-x)(x-2)^2} $\eAns + \Ans0 $ y = \frac{(x+2)^2 (2x-1)}{(x-1)(x-2)^2} $\eAns + \Ans1 $ y = \frac{(x+2)^2 (1-2x)}{(x-1)(x-2)^2} $\eAns + \Ans0 $ y = \frac{(x+2)^2 (2x-1)}{(x-1)^2(x-2)} $\eAns + \Ans0 $ y = \frac{(x+2) (1-2x)^2}{(x-1)^2(x-2)} $\eAns + \Ans0 none of these\eAns + \eChoices + \end{answers} +\begin{solution}[]\ifvspacewithsolns +We can access the ``answers'' to a multiple choice question in several +ways: +\begin{itemize} +\item The correct alternative is part~\useSavedAlts{whichRat}, +\useSavedAns{whichRat}. +\begin{verbatim} +The correct alternative is part~\useSavedAlts{whichRat}, +\useSavedAns{whichRat}. +\end{verbatim} +The command \verb!\useSavedAlts{whichRat}! expands to the letter alternative of the +correct response, \useSavedAlts{whichRat}, in this case. Similarly, +\verb!\useSavedAns{whichRat}! expands to the correct answer, here, the +correct answer is \useSavedAns{whichRat}. + +\item The correct answer is \useSavedAltsAns{whichRat}. +\begin{verbatim} +The correct answer is \useSavedAltsAns{whichRat}. +\end{verbatim} +The command \verb!\useSavedAltsAns{whichRat}! expands to the correct +letter followed by the correct answer. +\item You can now copy and paste the \texttt{answers} (or \texttt{manswers}) + environment into the \texttt{solutions} environment, like so. + +\item[] Which rational function below has a horizontal asymptote of + $y=-2$, and has vertical asymptotes of $x=1$ (odd) and $ x=2 $ (even)? + \begin{answers}{3}\rowsep{6pt} + \bChoices[label=whichRat] + \Ans0 $ y = \frac{(x+2) (1-2x)}{(1-x)(x-2)^2} $\eAns + \Ans0 $ y = \frac{(x+2)^2 (2x-1)}{(x-1)(x-2)^2} $\eAns + \Ans1 $ y = \frac{(x+2)^2 (1-2x)}{(x-1)(x-2)^2} $\eAns + \Ans0 $ y = \frac{(x+2)^2 (2x-1)}{(x-1)^2(x-2)} $\eAns + \Ans0 $ y = \frac{(x+2) (1-2x)^2}{(x-1)^2(x-2)} $\eAns + \Ans0 none of these\eAns + \eChoices + \end{answers} +\end{itemize}\fi +\end{solution} + +\pushProblem +\begin{eqComments}[Comments:] +Multiple choice and multiple selection questions were an especially +difficult problem to solve; the \texttt{answers} and \texttt{manswers} +environments are undefined outside of an \texttt{exam} environment so one +cannot simply copy and paste the choices into the \texttt{solution} environment. + +To resolve this issue, I added a key-value pair to the \cs{bChoices} command, +the key is \texttt{label}. The source code for the above question reads +\verb!\bChoices[label=whichRat]! The value of the label key is used to +build a series of macros that record the labels and text for the choices +that are marked correct by \cs{Ans1}. The information gathered by these +macros are accessible through \cs{useSavedAlts}, \cs{useSavedAns}, +\cs{useSavedAltsAns}, and \cs{useSavedNumAns}, as described in the \textsf{eqexam} +manual. See the solutions pages to see the answers to these multiple +choice questions and details on the use of these commands. +\end{eqComments} +\popProblem + + \item How many times can a quadratic equation cross the $x$-axis? + Check as many of the alternatives that are possibly correct for a + quadratic function. + \begin{manswers}{4} + \bChoices[label=nCrossings] + \Ans1 0\eAns + \Ans1 2\eAns + \Ans1 3\eAns + \Ans0 4\eAns + \Ans0 5\eAns + \Ans0 6\eAns + \Ans0 infinitely many\eAns + \Ans0 none of these\eAns + \eChoices + \end{manswers} +\begin{solution}[]\ifvspacewithsolns +Here is how these same macros expand for multiple selection problems. +\begin{itemize} +\item The correct alternatives are parts~\useSavedAlts{nCrossings}. +\begin{verbatim} +The correct alternatives are parts~\useSavedAlts{nCrossings}. +\end{verbatim} +\item The correct answers are \useSavedAns{nCrossings}. +\begin{verbatim} +The correct answers are \useSavedAns{nCrossings}. +\end{verbatim} +\item The correct responses are \useSavedAltsAns{nCrossings}. +\begin{verbatim} +The correct responses are \useSavedAltsAns{nCrossings}. +\end{verbatim} +\item[] End each case, the command expands to a comma-delimited list of correct +answers. +\end{itemize} +You can also access the answers individually, for example the second +correct response is part~\useSavedAlts[2]{nCrossings}, the answer for +part~\useSavedAlts[2]{nCrossings} is \useSavedAns[2]{nCrossings}. Or, +we can say, \useSavedAltsAns[2]{nCrossings} to get a combined listing of +the second correct response. +\begin{verbatim} +You can also access the answers individually, for example the second +correct response is part~\useSavedAlts[2]{nCrossings}, the answer for +part~\useSavedAlts[2]{nCrossings} is \useSavedAns[2]{nCrossings}. Or, +we can say, \useSavedAltsAns[2]{nCrossings} to get a combined listing of +the second correct response. +\end{verbatim} +\fi +\end{solution} +\end{parts} +\end{problem*} + +\begin{eqComments}[Comments:] +The above question is a multiple selection question. The student must +select all the correct choices. See the solutions pages to see the answers +to these multiple choice questions and details on the use of these +commands. +\end{eqComments} + +\begin{problem}[5] +Which rational function below has a horizontal asymptote of + $y=-2$, and has vertical asymptotes of $x=1$ (odd) and $ x=2 $ (even)? + \begin{answers}{3}\rowsep{6pt} + \bChoices[label=whichRat1] + \Ans0 $ y = \frac{(x+2) (1-2x)}{(1-x)(x-2)^2} $\eAns + \Ans0 $ y = \frac{(x+2)^2 (2x-1)}{(x-1)(x-2)^2} $\eAns + \Ans1 $ y = \frac{(x+2)^2 (1-2x)}{(x-1)(x-2)^2} $\eAns + \Ans0 $ y = \frac{(x+2)^2 (2x-1)}{(x-1)^2(x-2)} $\eAns + \Ans0 $ y = \frac{(x+2) (1-2x)^2}{(x-1)^2(x-2)} $\eAns + \Ans0 none of these\eAns + \eChoices + \end{answers} +\begin{solution}[]\ifvspacewithsolns +We can access the ``answers'' to a multiple choice question in several +ways: +\begin{itemize} +\item The correct alternative is part~\useSavedAlts{whichRat1}, +\useSavedAns{whichRat1}. +\begin{verbatim} +The correct alternative is part~\useSavedAlts{whichRat1}, +\useSavedAns{whichRat1}. +\end{verbatim} +The command \verb!\useSavedAlts{whichRat1}! expands to the letter alternative of the +correct response, \useSavedAlts{whichRat1}, in this case. Similarly, +\verb!\useSavedAns{whichRat1}! expands to the correct answer, here, the +correct answer is \useSavedAns{whichRat1}. + +\item The correct answer is \useSavedAltsAns{whichRat1}. +\begin{verbatim} +The correct answer is \useSavedAltsAns{whichRat1}. +\end{verbatim} +The command \verb!\useSavedAltsAns{whichRat1}! expands to the correct +letter followed by the correct answer. +\end{itemize}\fi +\end{solution} +\end{problem} + +\begin{eqComments}[Comments:] +This is the same question as Problem~\ref{shortAns} (\ref{whichRatFunc}), +but this one is a stand alone question. The lettering of the label can +change depending on the options you take, so, if you compile this document +without the \texttt{useforms} options, the choices listed in~\ref{shortAns} (\ref{whichRatFunc}) +will be numbers, (A), (B),\dots, and the choices of this question will be +letters, (a), (b),\dots. Check the solutions page, the references should +change to reflect the change in options, let's hope. +\end{eqComments} + +\resetSolnAfterToDefault + +\begin{problem*}[\auto] +Let $f(x) = 4x+3$ and $ g(x) = 2x^2 - 5 $. Compute each of the following, +simplify were appropriate. +\begin{multicols}{2} +\begin{parts} +\item \PTs{2} $ (fg)(-2) = \fillin[boxed,boxsize=LARGE,align=l]{1in}{-15} $ + +\begin{solution}[.65in] +We have \[ (fg)(-2)=f(-2)g(-2)=(-5)(3)=\boxed{-15}\] +\end{solution} + +\item \PTs{2} $\left(\frac{g}{f}\right)(x)= \fillin[boxed,boxsize=LARGE]{\ifNoSolutions{1in}{}}{\frac{2x^2-5}{4x+3}} $ + +\begin{solution}[\sameVspace] +$ \left(\frac{g}{f}\right)(x)=\frac{g(x)}{f(x)}=\boxed{\frac{2x^2 - 5}{4x+3}}$ +\end{solution} + +\item \PTs{2} $ (f\circ f )(x) = \fillin[boxed,boxsize=LARGE]{\ifNoSolutions{1in}{}}{16x+15} $ + +\begin{solution}[\sameVspace] +Composing, $(f\circ f )(x)=f(f(x))=f(4x+3)=4(4x+3)+3=\boxed{16x+15}$ +\end{solution} + +\item \PTs{4} $ (f\circ g )(x) = \fillin[boxed,boxsize=LARGE]{1in}{8x^2-17} $ + +\begin{solution}[\sameVspace] +Composing, $(f\circ g )(x)=f(g(x))=f(2x^2 - 5)=4(2x^2 -5)+3=\boxed{8x^2-17}$ +\end{solution} +\end{parts} +\end{multicols} +\end{problem*} + +\begin{eqComments}[Comments:] +Nothing new about the above problem, each has a solution, no special +attention is needed. In some of the answer boxes, \cs{ifNoSolutions} is +used to set the width then \texttt{nosolutions} is in effect, and to et the box to +its natural width otherwise. +\end{eqComments} + + +\begingroup + +\setlength{\columnsep}{30pt} + +\begin{multicols}{2} +\begin{problem}[5] +Use the \textbf{vertex formula} to find the $x$-coordinate, $h$, and the +$y$-coordinate, $k$, of the quadratic function $ f(x) = 2x^2 - 8x + 5 $. +\begin{equation*} + \fillin[boxed,boxsize=LARGE,align=l,boxpretext={h=}]{1in}{2}\quad + \fillin[boxed,boxsize=LARGE,align=l,boxpretext={k=}]{1in}{-3} +\end{equation*} +\begin{solution}[.5in] +We use the vertex formula, $ h = -b/(2a) = - (-8)/4 = 2 $, and +so $h=f(2) = 8 - 16 + 5 = -3$. +\end{solution} +\end{problem} + +\columnbreak + +\begin{problem}[] % +\PTs{3}\addtocounter{eqpointvalue}{3} The function $ f(x) = x^2 - x + 1 $ has a +\fillin[u]{.75in}{minimum} (max/min) at $x = \fillin[u]{.5in}{1/2}$. +\begin{solution}[\sameVspace] +We use the vertex formula, $ h = -b/(2a) = - (-1)/2 = +1/2 $. A \textbf{minimum} occurs since the leading coefficient is +positive, which means the parabola opens up, the vertex is a minimum. +\end{solution} +\end{problem} +\end{multicols} + +\endgroup + +\begin{eqComments}[Comments:] +I include this problem in this file, because it is a construct that +appeared in a test of mine. I wanted to conserve vertical space so I put +to problems into two column format. The problem is the points appear to +the left. So, for the problem on the left, the points appear as usual, for +the problem on the right, the points appear in-line, I had to explicitly +increment the points counter, like so +\verb~\addtocounter{eqpointvalue}{3}~. Some adjustment of the space +between the columns was necessary \verb~\setlength{\columnsep}{30pt}~. +\end{eqComments} + +\renameSolnAfterTo{} + +\begin{problem}[5] +For a polynomial of degree $12$, according to theory, the maximum number +of zeros is \fillin[u]{.5in}{12}, and the maximum number of turning points +is \fillin[u]{.5in}{11}. +\begin{solution}[]\ifvspacewithsolns +For a polynomial of degree $12$, according to theory, the maximum number +of zeros is \fillin[u]{.5in}{12}, and the maximum number of turning points +is \fillin[u]{.5in}{11}.\fi +\end{solution} +\end{problem} + +\begin{eqComments}[Comments:] +A fill-in the blank problem, just copy and paste it into the solution +environment, protected by \verb~\ifvspacewithsolns...\fi~. +\end{eqComments} + + +\begin{problem}[5] +In the boxes provided, list the laws of the exponents and the laws of +logarithms. + \begin{equation*}\def\bwidth{2.75in}\def\bheight{1.5in} + \begin{tabular}{cc} + \textbf{Laws of the Exponents} & \textbf{Laws of Logarithms}\\ + \multicolumn{1}{p{\bwidth}}{% + \fillin[boxed,enclosesoln,parbox={[c][\bheight][t]}]{\linewidth}{% +% + \begin{enumerate} + \item $a^x a^y = a^{x+y}$ + \item $a^x/a^y = a^{x-y}$ + \item $ (a^x)^y = a^{xy}$ + \end{enumerate} +% + }}& + \multicolumn{1}{p{\bwidth}}{% + \fillin[boxed,enclosesoln,parbox={[c][\bheight][t]}]{\linewidth}{% +% + \begin{enumerate} + \item $\log_a(xy) = \log_a(x)+\log_a(y)$ + \item $\log_a(x/y) = \log_a(x)-\log_a(y)$ + \item $\log_a(x^r) = r\log_a(x)$ + \end{enumerate} +% + }} + \end{tabular} + \end{equation*} +\begin{solution}[]\ifvspacewithsolns +Write sentences, in the provided boxes, describing, in laymen's terms, Type I + and Type II errors for this test of hypothesis. + \begin{equation*}\def\bwidth{2.75in}\def\bheight{1.5in} + \begin{tabular}{cc} + \textbf{Laws of the Exponents} & \textbf{Laws of Logarithms}\\ + \multicolumn{1}{p{\bwidth}}{% + \fillin[boxed,enclosesoln,parbox={[c][\bheight][t]}]{\linewidth}{% +% + \begin{enumerate} + \item $a^x a^y = a^{x+y}$ + \item $a^x/a^y = a^{x-y}$ + \item $ (a^x)^y = a^{xy}$ + \end{enumerate} +% + }}& + \multicolumn{1}{p{\bwidth}}{% + \fillin[boxed,enclosesoln,parbox={[c][\bheight][t]}]{\linewidth}{% +% + \begin{enumerate} + \item $\log_a(xy) = \log_a(x)+\log_a(y)$ + \item $\log_a(x/y) = \log_a(x)-\log_a(y)$ + \item $\log_a(x^r) = r\log_a(x)$ + \end{enumerate} +% + }} + \end{tabular} + \end{equation*}\fi +\end{solution} +\end{problem} + +\begin{eqComments}[Comments:] +The above pair of boxes use the \texttt{enclosesoln} key. When this key is +used, the vertical size of the box is adjusted to the vertical size the +solution uses when either \texttt{nosolutions} or \texttt{vspacewithsolns} +option are used. Note the dimensions of the \cs{parbox} are adjusted so +that the width and height are correct. The \cs{boxed} command adds +\texttt{2\cs{fboxesp}+2\cs{fboxrule}}, so we reduce the \cs{parbox} by +that amount so the boxes are the correct size. +\end{eqComments} + +\begin{problem}[12] +Define $ f(x) = -2x^2(x+1) $. Make a good sketch of the graph in the +coordinate plane below, taking into consideration the end-behavior of the +polynomial, and its intercepts. +\begin{solution}[3in] +The graph of $ f(x) = -2x^2(x+1) $ is seen below. +\par\nobreak\medskip\vskip-1.5\baselineskip +\begin{minipage}[t]{3.5in}\vskip\baselineskip\kern0pt +\includegraphics[width=3.5in]{graph} +\end{minipage}\hfill +\begin{minipage}[t]{\linewidth-3.5in-30pt}\vskip\baselineskip\kern0pt +\noindent\makebox[\linewidth][c]{\textbf{Work Area}} +\begin{itemize} +\item The end-behavior is like $y=-x^3$ +\item $x$-int: $x=0$ (even); $ x=-1 $ (odd) +\item $y$-int: $y=0$ (passes through origin) +\end{itemize} +\end{minipage} +\end{solution} +\begin{workarea}{\sameVspace}% +\begin{minipage}[t]{3.5in}\kern0pt +\includegraphics[width=3.5in]{coorplane} +\end{minipage}\hfill +\begin{minipage}[t]{\linewidth-3.5in-30pt}\kern0pt +\makebox[\linewidth][c]{\textbf{Work Area}} +\end{minipage} +\end{workarea} +\end{problem} + +\begin{eqComments}[Comments:] +Finally, we have the above problem. It uses the \texttt{workarea} +environment. Previously, \texttt{workarea} appeared with the \texttt{nosolutions} +option. Now it appears with the \texttt{vspacewithsolns} option as well. +On the actual test, I used \textsf{PSTricks} for the graphics, for this +demo file, I replace the \textsf{pstricks} code this a figure depicting what the +\textsf{pstricks} produced, that way users of pdflatex can compile this +file! \texttt{:-)} +\end{eqComments} + +\newpage + +\begin{eqComments}% +On this page, we more clearly demonstrate the new feature of preserving +the vertical space even when the \texttt{answerkey} option is used. In the +preamble, we have \cs{vspacewithkeyOn}. +\end{eqComments} + + +\resetSolnAfterToDefault +% try changing \vspacewithkeyOn to \vspacewithkeyOff and recompile, +% the 4 inches of vertical space are not preserved when you compile +% with the answerkey option. +\vspacewithkeyOn + +\begin{problem}[10] +Solve the equation $2x^2 - 5x + 10 = 0 $ using the quadratic formula. +\begin{solution}[4in] +Applying the quadratic formula with $a=2$, $ b = -5 $, and $ c = 10 $, +\begin{alignat*}{2} + x & = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} \qt{The Quad.\ Formula}\\& + = \frac{5 \pm \sqrt{25 -4(2)(10)}}{2(2)} \qt{substitute}\\& + = \frac{5 \pm \sqrt{25 -80}}{4} \qt{arithmetic}\\& + = \frac{5 \pm \sqrt{-45}}{4} \qt{ditto}\\& + = \frac{5 \pm 3\sqrt{5}\,\imath}{4} \qt{simplify} +\end{alignat*} +The solution is $\boxed{x=\frac{5 \pm 3\sqrt{5}\,\imath}{4}}$ +\end{solution} +\end{problem} + +\begin{problem}[5] +Write the equation, in standard form, for the circle with center at +$C(1,-3)$ and radius of $2$ +\begin{solution}[1in] +We have $(x-1)^2 + (y+2)^2 = 4 $. Expanding and combining the equation, we +have\dots \[\boxed{x^2+y^2-2x+4y+1=0}\] +\end{solution} +\end{problem} + +\begin{eqComments}[Comments:] +The \texttt{solution} environments in the above problems declared 4 inches +and 1 inch of vertical space, respectively. With \cs{vspacewithkeyOn} we +should have about 4 inches (resp., 1 inch) of vertical space even with the +\texttt{answerkey} option. Try compiling the file with +\cs{vspacewithkeyOff}. +\end{eqComments} + +\end{theseproblems} + +\end{exam} + +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/test_matching.pdf b/macros/latex/contrib/eqexam/examples/test_matching.pdf new file mode 100644 index 0000000000..56eff4053c Binary files /dev/null and b/macros/latex/contrib/eqexam/examples/test_matching.pdf differ diff --git a/macros/latex/contrib/eqexam/examples/test_matching.tex b/macros/latex/contrib/eqexam/examples/test_matching.tex new file mode 100644 index 0000000000..27317c656e --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/test_matching.tex @@ -0,0 +1,92 @@ +\documentclass{article} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage[forpaper,pointsonleft, +% online, +% compile with one of the following three options + nosolutions, +% answerkey, +% vspacewithsolns +]{eqexam} +%\usepackage[forpaper,pointsonleft,nosolutions]{eqexam} +%\usepackage[online,forpaper,pointsonleft,answerkey]{eqexam} + +\solAtEndFormatting{\eqequesitemsep{3pt}} + + +\title[T1]{Test 1} +\author{D. P. Story} +\subject{A Matching Problem} +\date{\thisterm, \the\year} +\keywords{Test 1, Section 001} + +\university +{% + NORTHWEST FLORIDA STATE COLLEGE\\ + Department of Mathematics +} +\email{storyd@nwfsc.edu} + +\hfuzz = .7pt + +\begin{document} +\maketitle + + +\begin{exam}{Part1} + +\begin{instructions} +Solve each of the problems without error. If you make an error, +points will be subtracted from your total score. +\end{instructions} + + +\begin{problem*}[\auto] +Match each of names on the left, with the corresponding names on the right. + +\begin{multicols}{2} +\begin{parts} +\item\label{dps}\PTs*{2}\fillin{.5in}{\ref{george}} Washington +\ifkeyalt +\begin{solution}[] +\fillin{.5in}{\ref{george}} Washington +\end{solution} +\fi +\item\PTs*{2}\fillin{.5in}{\ref{john}} Adams +\ifkeyalt +\begin{solution}[] +\fillin{.5in}{\ref{john}} Adams +\end{solution} +\fi +\item\PTs*{2}\fillin{.5in}{\ref{thomas}} Jefferson +\ifkeyalt +\begin{solution}[] +\fillin{.5in}{\ref{thomas}} Jefferson +\end{solution} +\fi + +\columnbreak + +\renewcommand{\thepartno}{\Alph{partno}} +\partsformat{\Alph{partno}.} + +% The above redefinitions are reset when we leave the group, when \end{parts} +% is completed. If the original definitions are needed to be reset before then +% execute the following commands: \defaultthepartno, \defaultpartsformat + +% \foritem{a} resets the partno counter back to 0, and displays (a), which +% has been redefined to A. + +\foritem{a}\label{john} John + +\item\label{thomas} Thomas + +\item\label{george} George + +\end{parts} +\end{multicols} +\end{problem*} + +\end{exam} + +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/tex_survey.tex b/macros/latex/contrib/eqexam/examples/tex_survey.tex new file mode 100644 index 0000000000..b007f34de8 --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/tex_survey.tex @@ -0,0 +1,537 @@ +\documentclass{article} +% +% AcroTeX eDucation Bundle required for the email option. +% +\usepackage[email,coverpage,forcolorpaper,nopoints,nosolutions,useforms]{eqexam} + +\title[TS]{\texorpdfstring{\TeX}{\textbackslash TeX} Usage Survey} +\author{D. P. Story} +\subject{\texorpdfstring{\sffamily eqExam}{eqExam} Demo} +\date{Spring, \the\year} +\keywords{TeX Usage Survey, eqExam, AcroTeX} + +\university +{% + THE UNIVERSITY OF AKRON\\ + Theoretical and Applied Mathematics +} +\email{dpstory@uakron.edu} + +\EmailSubject{TeX/LaTeX Survey Results} +\EmailCourseName{eqExam Demo} +\EmailExamName{TeX Usage Survey} +\ServerRetnMsg{Your TeX survey results have been received, thank you.} +\SubmitInfo{http://myWebSite/scripts/eqAttach.asp?nopath\#FDF}{myname@mymailprovider} + +\lhead{\textsf{eqExam} Demo} +\rhead{\TeX{} Usage Survey} + +\renewcommand\maketitledesign +{% + \parbox{\textwidth}{\normalsize + \makebox[\textwidth][c]{\bfseries\sffamily\Large\webtitle}\\[3ex] + \makebox[\textwidth][s]{An \textsf{eqExam} Demo \hfill\webauthor}} +} +\makeatletter +\renewcommand\eqexcoverpagedesign +{% + \thispagestyle{empty} + \addtolength\textwidth{\oddsidemargin} + \vspace*{.1\textheight} + \noindent\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\bfseries\color{blue}\large\centering\webuniversity}} + \par\vspace{.1\textheight} + \noindent\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\bfseries\color{blue}\large\centering\websubject}} + \par\vspace{\bigskipamount} + \noindent\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\bfseries\color{blue}\large\centering\webtitle}} + \par\vfill + \optionalpagematter + \par\vfill + \parindent0pt + \@date +} +\makeatother + +% +% From the Web package, part of the AcroTeX eDucation Bundle +% +\newNaviIcon[j]{\GoToSubmit}{20pt}{15pt}{\textcolor{webblue}{$\blacktriangleleft$}}{this.pageNum=1} +\def\optionalpagematter +{% + \begin{center}\setlength{\fboxrule}{1pt} + \fcolorbox{blue}{webyellow}{% + \begin{minipage}{.67\linewidth} + \noindent\textcolor{red}{\textbf{Instructions:}} First, thank + you very much for taking the time to fill out this survey of + \TeX/\LaTeX{} usage. I will summarize the results, and make + them publicly available. The survey has not been commissioned + by TUG ({\TeX} User's Group), but is a demo of some of + capabilities of my new {\LaTeX} package + \textsf{eqExam}.\par\medskip When you have finished, click on + the ``Submit'' button to record your responses.\par\medskip + \textbf{\textcolor{red}{Note:}} The \textcolor{webblue}{Adobe + Reader}, or an \textcolor{webblue}{Acrobat} application + (version 5.0 or later) is required to submit this + survey.\hfill\mbox{D. P. Story} + \end{minipage}} + \end{center} +} + +\begin{document} + +\maketitle + +\begin{exam}{Part1} + +\begin{instructions}[\TeX/\LaTeX.] +This first block of questions concerns your use of {\TeX/\LaTeX}. +\end{instructions} + +\begin{problem*} +Experience using \TeX/\LaTeX. +\begin{parts} +\item How would you describe yourself in terms of experience using \TeX/\LaTeX? +\begin{answers}{4} +\rowsep{1bp} +\bChoices + \Ans0 Novice\eAns + \Ans0 Intermediate\eAns + \Ans0 Experienced\eAns + \Ans0 Package Developer\eAns +\eChoices +\end{answers} + +\item I have used \TeX/\LaTeX{} for\dots +\begin{answers}{3} +\rowsep{1bp} +\bChoices + \Ans0 less than a year\eAns + \Ans0 one to two years\eAns + \Ans0 two to five years\eAns + \Ans0 five to ten years\eAns + \Ans0 ten to fifteen years\eAns + \Ans0 fifteen to twenty years\eAns + \Ans0 more than twenty years\eAns +\eChoices +\end{answers} + +\end{parts} +\end{problem*} + +\begin{problem} +Approximately how many hours do you spend using \TeX/\LaTeX{} in a typical week? +On a per week basis, I use \TeX/\LaTeX\dots +\begin{answers}{4} +\rowsep{1bp} +\bChoices + \Ans0 less than an hour\eAns + \Ans0 one to two hours\eAns + \Ans0 three to five hours\eAns + \Ans0 ten hours\eAns + \Ans0 more than ten hours\eAns +\eChoices +\end{answers} +\end{problem} + +\begin{problem} +There are many {\TeX} user's groups worldwide, are you a member of one or more? +\begin{answers}{4} +\bChoices + \Ans0 Yes\eAns + \Ans0 No\eAns +\eChoices +\end{answers} +\end{problem} + +\begin{problem*} +The following questions concern your preferred use of \TeX. +\begin{parts} +\item\label{whichTeX} Which styles to you predominately use? +\begin{answers}{4} +\rowsep{1bp} +\bChoices[2] + \Ans0 Plain \TeX\eAns + \Ans0 \LaTeX\eAns + \Ans0 Con\TeX t\eAns + \Ans0 Other, \makebox[0pt][l]{please specify \fillin{1.25in}{\empty}}\eAns +\eChoices +\end{answers} + +\item Based on your response to \hyperref[whichTeX]{(\ref*{whichTeX})}, +please explain why you made the choice you did. +\begin{solution}[.75in] +\end{solution} + + +\item There are many {\TeX} Systems available for use, commercial, +shareware, freeware. Which one do you primarily use? +\begin{answers}{4} +\rowsep{1bp} +\bChoices + \Ans0 A \TeX{} Live System\eAns + \Ans0 te\TeX\eAns + \Ans0 Mik\TeX\eAns + \Ans0 PC\TeX\eAns + \Ans0 Y\negthinspace{\scriptsize\&}\negthinspace Y \TeX{} System\eAns + \Ans0 Textures\eAns + \Ans0 CMac\TeX\eAns + \Ans0 True\TeX\eAns + \Ans0 Oz\TeX\eAns + \Ans0 Other, \makebox[0pt][l]{please specify \fillin{1.75in}{\empty}}\eAns +\eChoices +\end{answers} + +\item What is your favorite {\TeX} editor? Specify \fillin{1.75in}{\empty} + +\end{parts} +\end{problem*} + +\begin{problem*} +What operating systems (OS) do you use \TeX? + +\setlength\columnseprule{0pt} + +\begin{parts} + +\item What operating system (OS) runs on the machine you +most frequently use when working with \TeX/\LaTeX? Select one. +\begin{multicols}{2} +\begin{answers}{1} +\bChoices + \Ans0 Windows XP\eAns + \Ans0 Windows ME\eAns + \Ans0 Windows NT\eAns + \Ans0 Windows 2000\eAns + \Ans0 Windows 98\eAns + \Ans0 Windows 95\eAns + \Ans0 Macintosh OS X\eAns + \Ans0 Macintosh OS 9\eAns + \Ans0 Macintosh OS 8\eAns + \Ans0 Macintosh OS 7 or earlier\eAns + \Ans0 Unix or Linux\eAns + \Ans0 Other, please specify \fillin{1.25in}{\empty}\eAns + \Ans0 Don't know\eAns +\eChoices +\end{answers} +\end{multicols} + +\item Some people work on multiple platforms, what is your secondary +OS for working with \TeX/\LaTeX? +\begin{multicols}{2} +\begin{answers}{1} +\bChoices + \Ans0 Windows XP\eAns + \Ans0 Windows ME\eAns + \Ans0 Windows NT\eAns + \Ans0 Windows 2000\eAns + \Ans0 Windows 98\eAns + \Ans0 Windows 95\eAns + \Ans0 Macintosh OS X\eAns + \Ans0 Macintosh OS 9\eAns + \Ans0 Macintosh OS 8\eAns + \Ans0 Macintosh OS 7 or earlier\eAns + \Ans0 Unix or Linux\eAns + \Ans0 Other, please specify \fillin{1.25in}{\empty}\eAns + \Ans0 Don't use two systems.\eAns +\eChoices +\end{answers} +\end{multicols} + +\end{parts} + +\end{problem*} + + +\begin{eqComments}[Seeking Help.]\end{eqComments} + +\begin{problem*} +These questions concern any problems you may have with \TeX/\LaTeX{} and resources available to you. +\begin{parts} +\item Do you struggle on alone (with \TeX/\LaTeX ) if things are going wrong, or do you + seek help? + \begin{answers}{3} + \bChoices + \Ans0 Struggle on along\eAns + \Ans0 Seek help from a friend or colleague\eAns + \Ans0 Seek help from a public forum\eAns + \eChoices + \end{answers} + +\item Do you use on-line resources? + \begin{answers}{4} + \bChoices + \Ans0 No\eAns + \Ans0 Yes, I use \makebox[0pt][l]{\fillin{1.75in}{\empty}}\eAns + \eChoices + \end{answers} + +\goodbreak + +\item Do you seek help from \texttt{comp.text.tex}? + \begin{answers}{3} + \bChoices + \Ans0 No\eAns + \Ans0 Yes, I read the postings occasionally\eAns + \Ans0 Yes, I read the postings regularly\eAns + \Ans0 Yes, I even ask questions\eAns + \Ans0 Yes, I answer questions on occasion\eAns + \Ans0 Yes, I regularly answer questions\eAns + \eChoices + \end{answers} +\end{parts} +\end{problem*} + +\begin{problem*} +The \textsf{CTAN} Archive. +\begin{parts} +\item\label{CTAN} Do you know about \textsf{CTAN} (Central {\TeX} Archive Network)? + \begin{answers}{4} + \bChoices + \Ans0 No\eAns + \Ans0 Yes\eAns + \eChoices + \end{answers} + +\item If you answered ``Yes'' to question~\hyperref[CTAN]{(\ref*{CTAN})}, approximately, how often + do you use this archive? + \begin{answers}{3} + \bChoices + \Ans0 Once or twice a month\eAns + \Ans0 three to five times per month\eAns + \Ans0 More than five times per month\eAns + \eChoices + \end{answers} + +\end{parts} +\end{problem*} + +\begin{problem*} +The {\TeX} \textsf{FAQ} Resource. +\begin{parts} +\item\label{FAQ} Do you know there is a {\TeX} \textsf{FAQ} online resource? (\texttt{http://www.tex.ac.uk/faq}) + \begin{answers}{4} + \bChoices + \Ans0 No\eAns + \Ans0 Yes\eAns + \eChoices + \end{answers} + +\item\label{FAQ1} If you answered ``Yes'' to question, \hyperref[FAQ]{(\ref*{FAQ})} have you ever used the \textsf{FAQ}? + \begin{answers}{4} + \bChoices + \Ans0 No\eAns + \Ans0 Yes, \makebox[0pt][l]{how often? \fillin{1in}{\empty} per year.}\eAns + \eChoices + \end{answers} +\end{parts} +\end{problem*} + +\begin{problem} +In terms of paper publications, what are the titles of the books you use for a reference to your +work in \TeX/\LaTeX? Please list titles/authors in the space provided below. +\begin{solution}[1.8in] +\end{solution} +\end{problem} + +\goodbreak +\begin{eqComments}[Print and PDF.]\end{eqComments} + +\begin{problem} +What application do you use to create PDF? Adobe Distiller, ps2pdf, other. +\begin{answers}{3} +\rowsep{1bp} + \bChoices + \Ans0 Adobe Distiller\eAns + \Ans0 \textsf{ps2pdf} (\textsf{pdfwriter})\eAns + \Ans0 \textsf{pdftex}\eAns + \Ans0 \textsf{dvipdfm}\eAns + \Ans0 Other, \makebox[0pt][l]{please specify \fillin{1.75in}{\empty}}\eAns + \eChoices +\end{answers} +\end{problem} + +\begin{problem} +Describe the reasons you create PDF document from a \TeX/\LaTeX{} source. Is it for +distribution over the Internet; to create interactive, high +content materials; for business purposes? Please elaborate in the +space provided below. +\begin{solution}[.75in] +\end{solution} +\end{problem} + +\begin{problem} +Do you use {\TeX/\LaTeX} primarily for creating printable documents, or for creating +a PDF document suitable for publication on the Internet, or distribution to a colleague? +\begin{answers}{3} + \bChoices + \Ans0 Exclusively for print\eAns + \Ans0 Mostly for PDF\eAns + \Ans0 About half and half\eAns + \eChoices +\end{answers} +\end{problem} + +\begin{problem} +If you have any experience or knowledge of commercial publishing +houses that use a \TeX/\LaTeX{} or \textsf{pdftex} work flow for +prepress typesetting, please list publishing houses and countries +in the space provided below. +\begin{solution}[.75in] +\end{solution} +\end{problem} + +\begin{eqComments}[Population Demographics.] +The next set of questions concern you. +\end{eqComments} + +\begin{problem} +My gender is \dots +\begin{answers}{5} + \bChoices + \Ans0 Male\eAns + \Ans0 Female\eAns + \Ans0 \makebox[0pt][l]{Prefer not to disclose}\eAns + \eChoices +\end{answers} +\end{problem} + +\begin{problem} +I am \fillin{.75in}{\empty} years old. +\end{problem} + +\begin{problem} +Which of the following best describes your status as +an \TeX{} user today? Select one: + +\begin{answers}{1} + \bChoices + \Ans0 Use as a student\eAns + \Ans0 Use as an educator/trainer\eAns + \Ans0 Use at home for personal use or as a hobby\eAns + \Ans0 Use for a home-based business\eAns + \Ans0 Use in a company or business (non-home based)\eAns + \eChoices +\end{answers} +\end{problem} + +\begin{problem} +What is your country of residence? Select one: + +\setlength\columnseprule{0pt} + +\begin{multicols}{2} +\begin{answers}{1} + \bChoices + \Ans0 United States of America\eAns + \Ans0 Canada\eAns + \Ans0 Other Americas, \mbox{specify: \fillin{1.24in}{\empty}}\eAns + \Ans0 United Kingdom\eAns + \Ans0 France\eAns + \Ans0 Germany\eAns + \Ans0 Sweden\eAns + \Ans0 Netherlands\eAns + \Ans0 Other Europe, \mbox{specify: \fillin{1.25in}{\empty}}\eAns + \Ans0 Japan\eAns + \Ans0 Hong Kong/Taiwan\eAns + \Ans0 China\eAns + \Ans0 Other Asia, \mbox{specify: \fillin{1.25in}{\empty}}\eAns + \Ans0 Australia\eAns + \Ans0 New Zealand\eAns + \Ans0 Africa, \mbox{specify: \fillin{1.25in}{\empty}}\eAns + \eChoices +\end{answers} +\end{multicols} +\end{problem} + +\def\myDing{\makebox[0pt][r]{\textcolor{red}{\ding{042}}\enspace}} + +\begin{eqComments}[]% +\myDing If your company/organization uses \TeX/\LaTeX/\textsf{pdftex} in their business work flow, +please answer questions \textbf{\textcolor{blue}{\ref*{buss1}}} and \textbf{\textcolor{blue}{\ref*{buss2}}}. +\end{eqComments} + +\begin{problem}\label{buss1} +How many employees work at your company including all +sites? Select one: + +\setlength\columnseprule{0pt} +\begin{multicols}{3} +\begin{answers}{1} + \bChoices + \Ans0 One/work alone\eAns + \Ans0 2 - 9\eAns + \Ans0 10 - 49\eAns + \Ans0 50 - 99\eAns + \Ans0 100 - 499\eAns + \Ans0 500 - 999\eAns + \Ans0 1000 - 2999\eAns + \Ans0 3000 - 4999\eAns + \Ans0 5000 or more\eAns + \Ans0 Don't know\eAns + \eChoices +\end{answers} +\end{multicols} +\end{problem} + +\begin{problem}\label{buss2} +What is your company/organization's PRIMARY industry? Select one: + +\setlength\columnseprule{0pt} + +\begin{multicols}{2} +\begin{answers}{1} + \bChoices + \Ans0 Aerospace\eAns + \Ans0 Automotive\eAns + \Ans0 Computer hardware\eAns + \Ans0 Computer software\eAns + \Ans0 Education\eAns + \Ans0 Engineering\eAns + \Ans0 Financial services\eAns + \Ans0 Government\eAns + \Ans0 Graphic design/fine art\eAns + \Ans0 Healthcare/social services\eAns + \Ans0 Insurance\eAns + \Ans0 Legal\eAns + \Ans0 Manufacturing\eAns + \Ans0 Membership organizations - religious, nonprofit, trade unions\eAns + \Ans0 Military\eAns + \Ans0 Pharmaceuticals/bio tech\eAns + \Ans0 Professional services (documentation)\eAns + \Ans0 Professional services (technical/IT/Internet)\eAns + \Ans0 Printing and publishing\eAns + \Ans0 Public and protective services (police, fire)\eAns + \Ans0 Retail\eAns + \Ans0 Telecommunications\eAns + \Ans0 Transportation\eAns + \Ans0 Travel\eAns + \Ans0 Wholesale\eAns + \Ans0 Other, \mbox{please specify: \fillin{1.25in}{\empty}}\eAns + \eChoices +\end{answers} +\end{multicols} +\end{problem} + +\begin{eqComments}[Improvements in \TeX.]\end{eqComments} + +\begin{problem} +What you most like to see improved in \TeX/\LaTeX? Use the space provided +below: +\begin{solution}[2in] +\end{solution} +\end{problem} + + +\begin{eqComments}[Thank You] once again for participating in this survey.\end{eqComments} +\begin{eqComments}[\GoToSubmit] +Click on the left arrow to return to the first page to submit your responses.\end{eqComments} + + + +\end{exam} +\end{document} diff --git a/macros/latex/contrib/eqexam/examples/tex_survey_h.tex b/macros/latex/contrib/eqexam/examples/tex_survey_h.tex new file mode 100644 index 0000000000..158f2ca93f --- /dev/null +++ b/macros/latex/contrib/eqexam/examples/tex_survey_h.tex @@ -0,0 +1,551 @@ +\RequirePackage[!use=publish]{spdef} +\documentclass{article} +% var aSubmitFields = new Array("IdInfo", "Quiz1", "pathToTxtFile", "courseName", "quizName", "pdfFileName", "rtnURL"); +% this.submitForm({cURL: "http://localhost/scripts/eq2db/eqText_html.asp", bEmpty: true, aFields: aSubmitFields, cSubmitAs: "HTML" }); +% cPathToTxtFile = Request.Form("pathToTxtFile") +% cRtnURL = Request.Form("rtnURL") +% AcroTeX eDucation Bundle required for the email option. +% +\usepackage[online,coverpage,forcolorpaper,nopoints,nosolutions,useforms]{eqexam} +\usepackage[submitAs=html,eqText,tagged]{eq2db} + +\title[TS]{\texorpdfstring{\TeX}{\textbackslash TeX} Usage Survey} +\author{D. P. Story} +\subject{\texorpdfstring{\sffamily eqExam}{eqExam} Demo} +\date{Spring, \the\year} +\keywords{TeX Usage Survey, eqExam, AcroTeX} + +\university +{% + THE UNIVERSITY OF AKRON\\ + Theoretical and Applied Mathematics +} +\email{dpstory@uakron.edu} + +%\EmailSubject{TeX/LaTeX Survey Results} +%\EmailCourseName{eqExam Demo} +%\EmailExamName{TeX Usage Survey} +%\ServerRetnMsg{Your TeX survey results have been received, thank you.} +%\SubmitInfo{http://myWebSite/scripts/eqAttach.asp?nopath\#FDF}{myname@mymailprovider} + +\ifpublish +\eqSubmit{http://faculty.nwfsc.edu/web/math/storyd/scripts/eqText_html.asp}% + {d:/web/facultyweb/web/math/storyd/scripts/data/texsurvey.txt}{eqexam.TeXSurvey} +\else +\eqSubmit{http://localhost/scripts/eq2db/eqText_html.asp}% + {c:/Inetpub/Data/texsurvey.txt}{eqexam.TeXSurvey} +\fi +\rtnURL{http://faculty.nwfsc.edu/web/math/storyd} + +\lhead{\textsf{eqExam} Demo} +\rhead{\TeX{} Usage Survey} + +\renewcommand\maketitledesign +{% + \parbox{\textwidth}{\normalsize + \makebox[\textwidth][c]{\bfseries\sffamily\Large\webtitle}\\[3ex] + \makebox[\textwidth][s]{An \textsf{eqExam} Demo \hfill\webauthor}} +} +\makeatletter +\renewcommand\eqexcoverpagedesign +{% + \thispagestyle{empty} + \addtolength\textwidth{\oddsidemargin} + \vspace*{.1\textheight} + \noindent\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\bfseries\color{blue}\large\centering\webuniversity}} + \par\vspace{.1\textheight} + \noindent\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\bfseries\color{blue}\large\centering\websubject}} + \par\vspace{\bigskipamount} + \noindent\hspace*{-\oddsidemargin}% + \makebox[\linewidth]{\parbox{\linewidth}% + {\bfseries\color{blue}\large\centering\webtitle}} + \par\vfill + \optionalpagematter + \par\vfill + \parindent0pt + \@date +} +\makeatother + +% +% From the Web package, part of the AcroTeX eDucation Bundle +% +\newNaviIcon[j]{\GoToSubmit}{20pt}{15pt}{\textcolor{webblue}{$\blacktriangleleft$}}{this.pageNum=1} +\def\optionalpagematter +{% + \begin{center}\setlength{\fboxrule}{1pt} + \fcolorbox{blue}{webyellow}{% + \begin{minipage}{.67\linewidth} + \noindent\textcolor{red}{\textbf{Instructions:}} First, thank + you very much for taking the time to fill out this survey of + \TeX/\LaTeX{} usage. I will summarize the results, and make + them publicly available. The survey has not been commissioned + by TUG ({\TeX} User's Group), but is a demo of some of + capabilities of my new {\LaTeX} package + \textsf{eqExam}.\par\medskip When you have finished, click on + the ``Submit'' button to record your responses.\par\medskip + \textbf{\textcolor{red}{Note:}} The \textcolor{webblue}{Adobe + Reader}, or an \textcolor{webblue}{Acrobat} application + (version 5.0 or later) is required to submit this + survey.\hfill\mbox{D. P. Story} + \end{minipage}} + \end{center} +} + +\begin{document} + +\maketitle + +\begin{exam}{TeXSurvey} + +\begin{instructions}[\TeX/\LaTeX.] +This first block of questions concerns your use of {\TeX/\LaTeX}. +\end{instructions} + +\begin{problem*} +Experience using \TeX/\LaTeX. +\begin{parts} +\item How would you describe yourself in terms of experience using \TeX/\LaTeX? +\begin{answers}{4} +\rowsep{1bp} +\bChoices + \Ans0 Novice\eAns + \Ans0 Intermediate\eAns + \Ans0 Experienced\eAns + \Ans0 Package Developer\eAns +\eChoices +\end{answers} + +\item I have used \TeX/\LaTeX{} for\dots +\begin{answers}{3} +\rowsep{1bp} +\bChoices + \Ans0 less than a year\eAns + \Ans0 one to two years\eAns + \Ans0 two to five years\eAns + \Ans0 five to ten years\eAns + \Ans0 ten to fifteen years\eAns + \Ans0 fifteen to twenty years\eAns + \Ans0 more than twenty years\eAns +\eChoices +\end{answers} + +\end{parts} +\end{problem*} + +\begin{problem} +Approximately how many hours do you spend using \TeX/\LaTeX{} in a typical week? +On a per week basis, I use \TeX/\LaTeX\dots +\begin{answers}{4} +\rowsep{1bp} +\bChoices + \Ans0 less than an hour\eAns + \Ans0 one to two hours\eAns + \Ans0 three to five hours\eAns + \Ans0 ten hours\eAns + \Ans0 more than ten hours\eAns +\eChoices +\end{answers} +\end{problem} + +\begin{problem} +There are many {\TeX} user's groups worldwide, are you a member of one or more? +\begin{answers}{4} +\bChoices + \Ans0 Yes\eAns + \Ans0 No\eAns +\eChoices +\end{answers} +\end{problem} + +\begin{problem*} +The following questions concern your preferred use of \TeX. +\begin{parts} +\item\label{whichTeX} Which styles to you predominately use? +\begin{answers}{4} +\rowsep{1bp} +\bChoices[2] + \Ans0 Plain \TeX\eAns + \Ans0 \LaTeX\eAns + \Ans0 Con\TeX t\eAns + \Ans0 Other, \makebox[0pt][l]{please specify \fillin{1.25in}{\empty}}\eAns +\eChoices +\end{answers} + +\item Based on your response to \hyperref[whichTeX]{(\ref*{whichTeX})}, +please explain why you made the choice you did. +\begin{solution}[.75in] +\end{solution} + + +\item There are many {\TeX} Systems available for use, commercial, +shareware, freeware. Which one do you primarily use? +\begin{answers}{4} +\rowsep{1bp} +\bChoices + \Ans0 A \TeX{} Live System\eAns + \Ans0 te\TeX\eAns + \Ans0 Mik\TeX\eAns + \Ans0 PC\TeX\eAns + \Ans0 Y\negthinspace{\scriptsize\&}\negthinspace Y \TeX{} System\eAns + \Ans0 Textures\eAns + \Ans0 CMac\TeX\eAns + \Ans0 True\TeX\eAns + \Ans0 Oz\TeX\eAns + \Ans0 Other, \makebox[0pt][l]{please specify \fillin{1.75in}{\empty}}\eAns +\eChoices +\end{answers} + +\item What is your favorite {\TeX} editor? Specify \fillin{1.75in}{\empty} + +\end{parts} +\end{problem*} + +\begin{problem*} +What operating systems (OS) do you use \TeX? + +\setlength\columnseprule{0pt} + +\begin{parts} + +\item What operating system (OS) runs on the machine you +most frequently use when working with \TeX/\LaTeX? Select one. +\begin{multicols}{2} +\begin{answers}{1} +\bChoices + \Ans0 Windows XP\eAns + \Ans0 Windows ME\eAns + \Ans0 Windows NT\eAns + \Ans0 Windows 2000\eAns + \Ans0 Windows 98\eAns + \Ans0 Windows 95\eAns + \Ans0 Macintosh OS X\eAns + \Ans0 Macintosh OS 9\eAns + \Ans0 Macintosh OS 8\eAns + \Ans0 Macintosh OS 7 or earlier\eAns + \Ans0 Unix or Linux\eAns + \Ans0 Other, please specify \fillin{1.25in}{\empty}\eAns + \Ans0 Don't know\eAns +\eChoices +\end{answers} +\end{multicols} + +\item Some people work on multiple platforms, what is your secondary +OS for working with \TeX/\LaTeX? +\begin{multicols}{2} +\begin{answers}{1} +\bChoices + \Ans0 Windows XP\eAns + \Ans0 Windows ME\eAns + \Ans0 Windows NT\eAns + \Ans0 Windows 2000\eAns + \Ans0 Windows 98\eAns + \Ans0 Windows 95\eAns + \Ans0 Macintosh OS X\eAns + \Ans0 Macintosh OS 9\eAns + \Ans0 Macintosh OS 8\eAns + \Ans0 Macintosh OS 7 or earlier\eAns + \Ans0 Unix or Linux\eAns + \Ans0 Other, please specify \fillin{1.25in}{\empty}\eAns + \Ans0 Don't use two systems.\eAns +\eChoices +\end{answers} +\end{multicols} + +\end{parts} + +\end{problem*} + + +\begin{eqComments}[Seeking Help.]\end{eqComments} + +\begin{problem*} +These questions concern any problems you may have with \TeX/\LaTeX{} and resources available to you. +\begin{parts} +\item Do you struggle on alone (with \TeX/\LaTeX ) if things are going wrong, or do you + seek help? + \begin{answers}{3} + \bChoices + \Ans0 Struggle on along\eAns + \Ans0 Seek help from a friend or colleague\eAns + \Ans0 Seek help from a public forum\eAns + \eChoices + \end{answers} + +\item Do you use on-line resources? + \begin{answers}{4} + \bChoices + \Ans0 No\eAns + \Ans0 Yes, I use \makebox[0pt][l]{\fillin{1.75in}{\empty}}\eAns + \eChoices + \end{answers} + +\goodbreak + +\item Do you seek help from \texttt{comp.text.tex}? + \begin{answers}{3} + \bChoices + \Ans0 No\eAns + \Ans0 Yes, I read the postings occasionally\eAns + \Ans0 Yes, I read the postings regularly\eAns + \Ans0 Yes, I even ask questions\eAns + \Ans0 Yes, I answer questions on occasion\eAns + \Ans0 Yes, I regularly answer questions\eAns + \eChoices + \end{answers} +\end{parts} +\end{problem*} + +\begin{problem*} +The \textsf{CTAN} Archive. +\begin{parts} +\item\label{CTAN} Do you know about \textsf{CTAN} (Central {\TeX} Archive Network)? + \begin{answers}{4} + \bChoices + \Ans0 No\eAns + \Ans0 Yes\eAns + \eChoices + \end{answers} + +\item If you answered ``Yes'' to question~\hyperref[CTAN]{(\ref*{CTAN})}, approximately, how often + do you use this archive? + \begin{answers}{3} + \bChoices + \Ans0 Once or twice a month\eAns + \Ans0 three to five times per month\eAns + \Ans0 More than five times per month\eAns + \eChoices + \end{answers} + +\end{parts} +\end{problem*} + +\begin{problem*} +The {\TeX} \textsf{FAQ} Resource. +\begin{parts} +\item\label{FAQ} Do you know there is a {\TeX} \textsf{FAQ} online resource? (\texttt{http://www.tex.ac.uk/faq}) + \begin{answers}{4} + \bChoices + \Ans0 No\eAns + \Ans0 Yes\eAns + \eChoices + \end{answers} + +\item\label{FAQ1} If you answered ``Yes'' to question, \hyperref[FAQ]{(\ref*{FAQ})} have you ever used the \textsf{FAQ}? + \begin{answers}{4} + \bChoices + \Ans0 No\eAns + \Ans0 Yes, \makebox[0pt][l]{how often? \fillin{1in}{\empty} per year.}\eAns + \eChoices + \end{answers} +\end{parts} +\end{problem*} + +\begin{problem} +In terms of paper publications, what are the titles of the books you use for a reference to your +work in \TeX/\LaTeX? Please list titles/authors in the space provided below. +\begin{solution}[1.8in] +\end{solution} +\end{problem} + +\goodbreak +\begin{eqComments}[Print and PDF.]\end{eqComments} + +\begin{problem} +What application do you use to create PDF? Adobe Distiller, ps2pdf, other. +\begin{answers}{3} +\rowsep{1bp} + \bChoices + \Ans0 Adobe Distiller\eAns + \Ans0 \textsf{ps2pdf} (\textsf{pdfwriter})\eAns + \Ans0 \textsf{pdftex}\eAns + \Ans0 \textsf{dvipdfm}\eAns + \Ans0 Other, \makebox[0pt][l]{please specify \fillin{1.75in}{\empty}}\eAns + \eChoices +\end{answers} +\end{problem} + +\begin{problem} +Describe the reasons you create PDF document from a \TeX/\LaTeX{} source. Is it for +distribution over the Internet; to create interactive, high +content materials; for business purposes? Please elaborate in the +space provided below. +\begin{solution}[.75in] +\end{solution} +\end{problem} + +\begin{problem} +Do you use {\TeX/\LaTeX} primarily for creating printable documents, or for creating +a PDF document suitable for publication on the Internet, or distribution to a colleague? +\begin{answers}{3} + \bChoices + \Ans0 Exclusively for print\eAns + \Ans0 Mostly for PDF\eAns + \Ans0 About half and half\eAns + \eChoices +\end{answers} +\end{problem} + +\begin{problem} +If you have any experience or knowledge of commercial publishing +houses that use a \TeX/\LaTeX{} or \textsf{pdftex} work flow for +prepress typesetting, please list publishing houses and countries +in the space provided below. +\begin{solution}[.75in] +\end{solution} +\end{problem} + +\begin{eqComments}[Population Demographics.] +The next set of questions concern you. +\end{eqComments} + +\begin{problem} +My gender is \dots +\begin{answers}{5} + \bChoices + \Ans0 Male\eAns + \Ans0 Female\eAns + \Ans0 \makebox[0pt][l]{Prefer not to disclose}\eAns + \eChoices +\end{answers} +\end{problem} + +\begin{problem} +I am \fillin{.75in}{\empty} years old. +\end{problem} + +\begin{problem} +Which of the following best describes your status as +an \TeX{} user today? Select one: + +\begin{answers}{1} + \bChoices + \Ans0 Use as a student\eAns + \Ans0 Use as an educator/trainer\eAns + \Ans0 Use at home for personal use or as a hobby\eAns + \Ans0 Use for a home-based business\eAns + \Ans0 Use in a company or business (non-home based)\eAns + \eChoices +\end{answers} +\end{problem} + +\begin{problem} +What is your country of residence? Select one: + +\setlength\columnseprule{0pt} + +\begin{multicols}{2} +\begin{answers}{1} + \bChoices + \Ans0 United States of America\eAns + \Ans0 Canada\eAns + \Ans0 Other Americas, \mbox{specify: \fillin{1.24in}{\empty}}\eAns + \Ans0 United Kingdom\eAns + \Ans0 France\eAns + \Ans0 Germany\eAns + \Ans0 Sweden\eAns + \Ans0 Netherlands\eAns + \Ans0 Other Europe, \mbox{specify: \fillin{1.25in}{\empty}}\eAns + \Ans0 Japan\eAns + \Ans0 Hong Kong/Taiwan\eAns + \Ans0 China\eAns + \Ans0 Other Asia, \mbox{specify: \fillin{1.25in}{\empty}}\eAns + \Ans0 Australia\eAns + \Ans0 New Zealand\eAns + \Ans0 Africa, \mbox{specify: \fillin{1.25in}{\empty}}\eAns + \eChoices +\end{answers} +\end{multicols} +\end{problem} + +\def\myDing{\makebox[0pt][r]{\textcolor{red}{\ding{042}}\enspace}} + +\begin{eqComments}[]% +\myDing If your company/organization uses \TeX/\LaTeX/\textsf{pdftex} in their business work flow, +please answer questions \textbf{\textcolor{blue}{\ref*{buss1}}} and \textbf{\textcolor{blue}{\ref*{buss2}}}. +\end{eqComments} + +\begin{problem}\label{buss1} +How many employees work at your company including all +sites? Select one: + +\setlength\columnseprule{0pt} +\begin{multicols}{3} +\begin{answers}{1} + \bChoices + \Ans0 One/work alone\eAns + \Ans0 2 - 9\eAns + \Ans0 10 - 49\eAns + \Ans0 50 - 99\eAns + \Ans0 100 - 499\eAns + \Ans0 500 - 999\eAns + \Ans0 1000 - 2999\eAns + \Ans0 3000 - 4999\eAns + \Ans0 5000 or more\eAns + \Ans0 Don't know\eAns + \eChoices +\end{answers} +\end{multicols} +\end{problem} + +\begin{problem}\label{buss2} +What is your company/organization's PRIMARY industry? Select one: + +\setlength\columnseprule{0pt} + +\begin{multicols}{2} +\begin{answers}{1} + \bChoices + \Ans0 Aerospace\eAns + \Ans0 Automotive\eAns + \Ans0 Computer hardware\eAns + \Ans0 Computer software\eAns + \Ans0 Education\eAns + \Ans0 Engineering\eAns + \Ans0 Financial services\eAns + \Ans0 Government\eAns + \Ans0 Graphic design/fine art\eAns + \Ans0 Healthcare/social services\eAns + \Ans0 Insurance\eAns + \Ans0 Legal\eAns + \Ans0 Manufacturing\eAns + \Ans0 Membership organizations - religious, nonprofit, trade unions\eAns + \Ans0 Military\eAns + \Ans0 Pharmaceuticals/bio tech\eAns + \Ans0 Professional services (documentation)\eAns + \Ans0 Professional services (technical/IT/Internet)\eAns + \Ans0 Printing and publishing\eAns + \Ans0 Public and protective services (police, fire)\eAns + \Ans0 Retail\eAns + \Ans0 Telecommunications\eAns + \Ans0 Transportation\eAns + \Ans0 Travel\eAns + \Ans0 Wholesale\eAns + \Ans0 Other, \mbox{please specify: \fillin{1.25in}{\empty}}\eAns + \eChoices +\end{answers} +\end{multicols} +\end{problem} + +\begin{eqComments}[Improvements in \TeX.]\end{eqComments} + +\begin{problem} +What you most like to see improved in \TeX/\LaTeX? Use the space provided +below: +\begin{solution}[2in] +\end{solution} +\end{problem} + + +\begin{eqComments}[Thank You] once again for participating in this survey.\end{eqComments} +\begin{eqComments}[\GoToSubmit] +Click on the left arrow to return to the first page to submit your responses.\end{eqComments} + + + +\end{exam} +\end{document} diff --git a/macros/latex/contrib/eqexam/script/eqAttach.asp b/macros/latex/contrib/eqexam/script/eqAttach.asp new file mode 100644 index 0000000000..f87f8b47c1 --- /dev/null +++ b/macros/latex/contrib/eqexam/script/eqAttach.asp @@ -0,0 +1,202 @@ +<%@ LANGUAGE = VBScript%> +<% +' Copyright 2005 D. P. Story +' All Rights Reserved +' See eqexamman.pdf for some documentation + +' NOTICE: This program can redistributed and/or modified under +' the terms of the LaTeX Project Public License +' Distributed from CTAN archives in directory +' macros/latex/base/lppl.txt; either version 1 of the +' License, or (at your option) any later version. + +' This script is offered "as is", no guarantees are extended. +' eqRecord should be extensively tested on your own system +' until you are satisfied with its functionality and +' reliability. +' +' Note: You need to edit one line below. Search this file for the line that +' contains the string "mySMTP". Replace this string with your SMTP server. + +Response.buffer = True + +Dim DebugTxt, DebugFDF +Dim ErcStatus : ErcStatus = "Problems Reported: " +DebugTxt = False +DebugFDF = False + +' Send FDF file +If DebugTxt Then + Response.ContentType = "text/html" + Response.Write "Debug Info" & "
" +Else + Response.ContentType = "application/vnd.fdf" +End If + +On error Resume Next + +Dim silentMode : silentMode = False +Dim stripPath : stripPath = False + +If Request.QueryString("silent").Count > 0 Then silentMode = True +If Request.QueryString("nopath").Count > 0 Then stripPath = True + +Rem Create an FDF object +Set FdfAcx = Server.CreateObject("FdfApp.FdfApp") +Set FDFout = FdfAcx.FDFCreate + +Rem Parse Incoming Data +Set FDFin = FdfAcx.FDFOpenFromBuf (Request.BinaryRead(Request.TotalBytes)) + +Dim cPDFPath, pos + +If stripPath Then + If DebugTxt Then Response.Write "stripPath is true " & "
" + cPDFPath = FDFin.FDFGetFile + pos = InStrRev( cPDFPath, "/") + If pos <> 0 Then + If DebugTxt Then Response.Write "pos = " & pos & "
" + cPDFPath = Mid(cPDFPath, pos + 1, Len(cPDFPath) - pos ) + If DebugTxt Then Response.Write "cPDFPath = " & cPDFPath & "
" + FDFin.FDFSetFile cPDFPath + End If +End If + +Rem Declare some variables +Dim cBuf +Dim cTime : cTime = Now +Dim eqMail, cMailTo, cMailFrom, cMailSubject +Dim cCourseName, cExam, cStudent, cSID, strMessage, cRetnMsg, eqTab, eqCR +eqTab = chr(9) +eqCR = chr(10) + +' Get Required Info ------------------- +' The only thing we really need is the email address to send this data to +cMailTo = FDFin.FDFGetValue("IdInfo.mailTo") +' cMailFrom = cMailTo + +' Get Optional Info ------ + +On error Resume Next +cCourseName = "" : cCourseName = Trim(FDFin.FDFGetValue("IdInfo.courseName")) + +On error Resume Next +cExam = "" : cExam = Trim(FDFin.FDFGetValue("IdInfo.examName")) + +On error Resume Next +cStudent = "" : cStudent = Trim(FDFin.FDFGetValue("IdInfo.Name")) + +On error Resume Next +cSID = "" : cSID = Trim(FDFin.FDFGetValue("IdInfo.SID")) + +On error Resume Next +cMailFrom = "" : cMailFrom = Trim(FDFin.FDFGetValue("IdInfo.email")) +If Trim(cMailFrom) = "" Then cMailFrom = cMailTo + +On error Resume Next +cMailSubject = "" : cMailSubject = FDFin.FDFGetValue("IdInfo.subject") +If Trim(cMailSubject) = "" Then cMailSubject = "Exam Results: " & cExam & " of " & cCourseName + +On error Resume Next +cRetnMsg = "" : cRetnMsg = Trim(FDFin.FDFGetValue("IdInfo.retnmsg")) + +strMessage = "Summary Information:" +If cCourseName <> "" Then strMessage = strMessage & eqCR & eqTab & "Subject: " & cCourseName +If cExam <> "" Then strMessage = strMessage & eqCR & eqTab & "Title: " & cExam +If cStudent <> "" Then strMessage = strMessage & eqCR & eqTab & "Name: " & cStudent +strMessage = strMessage & eqCR & eqTab & "TimeOfQuiz: " & cTime + +If Trim(cRetnMsg) = "" Then + cBuf = "Exam results successfully sent to your instructor!" +Else + cBuf = cRetnMsg +End If + +If DebugFDF Then cBuf = cBuf & " " & ErcStatus + +If Not silentMode Then FDFout.FDFSetStatus cBuf + +' Construct and send e-mail + +'CDONTS +' Set eqMail = CreateObject("CDONTS.NewMail") 'cdots + +' CDOSYS +Set eqMail = Server.CreateObject("CDO.Message") +eqMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 +eqMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mySMTP" +eqMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 +eqMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60 +' eqMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 0 +eqMail.Configuration.Fields.Update + +eqMail.To = cMailTo +' See if there is a comma in the cMailFrom string, if yes, then we have multiple addresses +' that we are sending to. We extract the first e-mail address as the one we will put in +' the eqMail.From address. +position = InStr(1,cMailFrom,",",0) +If position <> 0 Then cMailFrom = Trim(Mid(cMailFrom,1,position-1)) +eqMail.From = cMailFrom +eqMail.Subject = cMailSubject + +' CDOSSYS or CDONTS +eqMail.TextBody = strMessage +' eqMail.Body = strMessage 'cdots + +Dim strTempFile +Dim strTempFolder +Dim strTemp +Dim fso + +Set fso = CreateObject("Scripting.FileSystemObject") +Set strTempfolder = fso.GetSpecialFolder(2) +strTempFile = fso.GetTempName() +strTempFile = left(strTempFile, len(strTempFile)-4) +strTemp = strTempFolder & "\" & strTempFile & ".fdf" +FDFin.FDFSaveToFile strTemp + +If DebugTxt Then Response.Write "strTemp = " & strTemp & "
" + +' CDOSSYS or CDONTS +eqMail.AddAttachment strTemp +' eqMail.AttachFile strTemp 'cdots + +eqMail.Send +Set eqMail = Nothing +' Send back to the browser +Response.BinaryWrite FDFout.FDFSaveToBuf + +' Delete temporary file +fso.DeleteFile strTemp +Set fso = nothing + +FDFin.FDFClose +FDFout.FDFClose +Set FdfAcx = Nothing +Set FDFin = Nothing +Set FDFout = Nothing + +If DebugTxt Then + Response.Write strMessage +End If + +Sub RecordError(field) + If Err.Number <> 0 And DebugFDF Then + ErcStatus = ErcStatus & " "&field&": " & Err.Description + End If + If Err.Number <> 0 And DebugTxt Then + Response.Write "Set Error: "&field&": " & Err.Description & "
" + End If + Err.Clear +End Sub + +Sub ReportError(ByRef localErr) + DebugMsg "Err.Description: ", localErr.Description + DebugMsg "Err.Number: ", localErr.Number + localErr.Clear +End Sub + +Sub DebugMsg(myText, myEval) + If DebugTxt Then Response.Write myText & myEval &"
" +End Sub +%> -- cgit v1.2.3