diff --git a/lectures/coursehandbook.cls b/lectures/coursehandbook.cls new file mode 100644 index 0000000..7e676d2 --- /dev/null +++ b/lectures/coursehandbook.cls @@ -0,0 +1,558 @@ +\def\coursehandbookdate{12 June 2013} +\def\coursehandbookversion{1.0.2} +\def\coursehandbookshortdate{2013/06/12} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Document class for course handbooks. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Version History +% v1.0 Initial version. +% v1.0.1 Added siunitx to required packages. +% v1.0.2 Modified header generation to translate short teaching period strings +% into long equivalents (e.g., "S1" => "Semester One"). +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\NeedsTeXFormat{LaTeX2e}[2001/06/01] +\ProvidesClass{coursehandbook}% + [\coursehandbookshortdate\space v\coursehandbookversion\space INFO course handbook style] + +\RequirePackage{ifpdf} % We support only PDFLaTeX and XeTeX. +\RequirePackage{ifxetex} +\RequirePackage{kvoptions} % Key-value option handling. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Option processing. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\SetupKeyvalOptions{family=handbook, prefix=handbook@} + +\DeclareBoolOption{showanswers} +\DeclareComplementaryOption{hideanswers}{showanswers} + +\DeclareStringOption[INFO]{subjectcode} +\DeclareStringOption[!!PAPER NUMBER UNDEFINED!!]{papernumber} +\DeclareStringOption[!!PAPER TITLE UNDEFINED!!]{papertitle} +\DeclareStringOption[!!PAPER YEAR UNDEFINED!!]{paperyear} +\DeclareStringOption[!!PAPER PERIOD UNDEFINED!!]{paperperiod} +\DeclareStringOption[!!AUTHORS UNDEFINED!!]{authors} + +% \DeclareBoolOption{pdftex} +% \DeclareBoolOption{xetex} +% +% \ifxetex +% \DeclareVoidOption{xetex} +% \OptionNotUsed{pdftex} +% \else\ifpdf +% \DeclareBoolOption{pdftex} +% \OptionNotUsed{xetex} +% \else +% \ClassError{coursehandbook}{The coursehandbook document class only\MessageBreak\ supports PDF(La)TeX and XeTeX.}{The coursehandbook document class only supoprts the pdftex and\MessageBreak\ xetex drivers. Please use one of these.} +% \fi + +\DeclareDefaultOption{% + \ifx\CurrentOptionValue\relax% + \expandafter\PassOptionsToClass% + \expandafter{\CurrentOption}{book}% + \else% + \@unknownoptionerror% + \fi% +} + +\ProcessKeyvalOptions* +\LoadClass{book} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% A bunch o' packages. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\ifxetex + \RequirePackage{fontspec} % Font handling for XeTeX. + \RequirePackage{xunicode} + \RequirePackage{xltxtra} +\else + % Note that fontenc freaks out if any of the keyval option values + % are surrounded by braces (?!). Spaces get eaten without braces, + % so instead use \ in \documentclass to preserve them. + \RequirePackage[T1]{fontenc} + \RequirePackage{textcomp} +\fi +\RequirePackage{mathpazo} % Palatino for text and maths. +\RequirePackage{graphicx} % Include graphics of all sorts. +\RequirePackage{color} % Color handling. +\RequirePackage[hmargin=68.393315pt,% Sensible margins, essentially the same as a4wide. + top=107.1438pt,% + bottom=116.90304pt]{geometry} +% \RequirePackage{makeidx} +\RequirePackage{amssymb} % AMS maths symbols. +\RequirePackage{latexsym} % Extra LaTeX maths symbols. +\RequirePackage{relalg} % Relational algebra symbols. +% \RequirePackage{longtable} % For multi-page tables. +\RequirePackage{multirow} % Multi-row cells in tables. +\RequirePackage{rotating} % Rotate stuff. +\RequirePackage{fancyhdr} % Fancy page headers & footers. +\RequirePackage{verbatim} % Enhanced verbatim handling. +\RequirePackage{listings} % Nicely formatted code listings. +\RequirePackage[normalem]{ulem} % Fancy underlining, strike-through, etc. +\usepackage[detect-all,binary-units]{siunitx} % SI unit and number formatting. +% \RequirePackage{moreverb} +% \RequirePackage{listings} % Pretty-print code listings; not currently used. + +\RequirePackage{count1to} % Needed to get the absolute page numbers. +\RequirePackage{calc} % Needed to calculate page numbers for 2-up version. +\RequirePackage{parskip} % Space-separated rather than indented paragraphs. + +\RequirePackage[% + plainpages=false, % Stops pdfTeX complaining about duplicate page numbers. + colorlinks=true,% + urlcolor=blue, % Acceptable for print or screen + linkcolor=blue, % Acceptable for print or screen + bookmarks=true,% + bookmarksopen=true,% + bookmarksnumbered=true,% + pdfpagemode=UseOutlines,% + pdfstartview=FitB,% +]{hyperref} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Various setup macros to enable on-the-fly option changing. +% These are particularly necessary for paper detail options (such as +% papertitle) that may contain spaces. From the kvoptions documentation: +% +% ================================================== +% * Spaces are removed, regardless where: +% \documentclass[box=0 0 400 600]{article} +% Now each package will see box=00400600 as global option. +% +% * In the previous case also braces would not help: +% \documentclass[box={0 0 400 600}]{article} +% The result is an error message: +% ! LaTeX Error: Missing \begin{document}. +% +% * The requirements on robustness are extremly high. LATEX expands the +% option. All that will not work as environment name will break also +% as option. Even a \relax will generate an error message: +% ! Missing \endcsname inserted. +% Of course, LATEX does not use its protecting mechanisms. On contrary +% \protect itself will cause errors. +% ================================================== +% +% The upshot is that in the \documentclass, spaces are eaten, but we can't use +% {} or macros like \space or "\ " to escape them. The only thing that does +% work is: +% +% papertitle=some\csname space\endcsname name +% +% which is particularly ugly. A better solution is to follow the hyperref +% model and have a "setup" macro that sets these options AFTER the +% \documentclass. +% +% These also call \hypersetup to ensure that the PDF metadata match. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Set arbitrary class options. +\newcommand{\handbooksetup}[1]{% + \setkeys{handbook}{#1}% + \@updatepdfmetadata% +} + +% \papersetup is intended to be for setting paper detail options, but is +% essentially just a synonym of \handbooksetup. +\let\papersetup\handbooksetup + +% Macros for setting specific paper detail options. +\newcommand{\setsubjectcode}[1]{% + \@setpaperoption{subjectcode}{#1}% +} +\newcommand{\setpapernumber}[1]{% + \@setpaperoption{papernumber}{#1}% +} +\newcommand{\setpapertitle}[1]{% + \@setpaperoption{papertitle}{#1}% +} +\newcommand{\setpaperyear}[1]{% + \expandafter\@setpaperoption{paperyear}{#1}% +} +\newcommand{\setpaperperiod}[1]{% + \@setpaperoption{paperperiod}{#1}% +} +\newcommand{\setauthors}[1]{% + \@setpaperoption{authors}{#1}% +} + +\newcommand{\@setpaperoption}[2]{% + \setkeys{handbook}{#1={#2}} + \@updatepdfmetadata% +} + +\def\@updatepdfmetadata{% + \hypersetup{% + pdftitle={\expandafter\handbook@subjectcode\ \expandafter\handbook@papernumber\ Handbook, \expandafter\handbook@paperyear},% + pdfauthor={\expandafter\handbook@authors},% + pdfsubject={Student Handbook for \expandafter\handbook@subjectcode\ \expandafter\handbook@papernumber, \expandafter\handbook@paperyear.}% + }% +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Set up fonts. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\ifxetex + \defaultfontfeatures{Mapping=tex-text} + \setmainfont{TeX Gyre Pagella} + \setmonofont[Scale=MatchLowercase]{Letter Gothic 12 Pitch} + % Not sure about these? + \setsansfont[Scale=MatchLowercase]{Futura Book} + \newfontfamily\headerfont[Size=11]{Futura Light} +\else + \renewcommand{\sfdefault}{bfu} + \renewcommand{\ttdefault}{blg} + \DeclareFixedFont{\headerfont}{T1}{bfu}{lc}{n}{11} +\fi + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Set up listings. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Pre-load the most obviously used languages. You can still use other languages, +% just not as quickly. +\lstloadlanguages{Oracle,Java} + +% Set defaults. +\lstset{basicstyle=\ttfamily,basewidth=0.5em,escapeinside={(@}{@)}, + showspaces=false,showstringspaces=false} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Miscellaneous stuff. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Useful macros for paper code, etc. +\def\PaperCode{\expandafter\handbook@subjectcode\ \expandafter\handbook@papernumber} +\def\ShortPaperCode{\expandafter\handbook@subjectcode\expandafter\handbook@papernumber} +\def\PaperTitle{\expandafter\handbook@papertitle} +\def\PaperYear{\expandafter\handbook@paperyear} +\def\PaperPeriod{\expandafter\handbook@paperperiod} +\def\HandbookAuthors{\expandafter\handbook@authors} + +% Stolen from ouexam :). +\def\@SONE{S1} +\def\@STWO{S2} +\def\@SS{SS} +\def\@FY{FY} +\newcommand{\PaperLongPeriod}{% + \ifx\handbook@paperperiod\@SONE Semester One% + \else\ifx\handbook@paperperiod\@STWO Semester Two% + \else\ifx\handbook@paperperiod\@SS Summer School% + \else\ifx\handbook@paperperiod\@FY Full Year% + \else\PaperPeriod% + \fi\fi\fi\fi% +} + +% Handbook name. +\newcommand{\handbookname}{Student Handbook} + +% "Chapter" names. Note that the lab and tutorial names are dependent on +% the setting of the showanswers class option. +\newcommand{\introchaptername}{Introductory Chapter} +\newcommand{\labname}{\ifhandbook@showanswers Selected Answers for \fi\PaperCode\ Lab} +\newcommand{\tutorialname}{\ifhandbook@showanswers Selected Answers for \fi\PaperCode\ Tutorial} + +% listings.sty has problems with in-line verbatim code and fancy styles +% (backgrounds, borders), hence this: +\newcommand{\code}[1]{\texttt{#1}} + +% Other useful macros. +\newcommand{\term}[1]{\textit{#1}} +\newcommand{\foreign}[1]{\textit{#1}} +\newcommand{\BookTitle}[1]{\textit{#1}} + +% Backslashes - what a pain! +\newcommand{\bs}{\(\backslash{}\)} + +% We want "chapter" numbers to reset for each part. +\@addtoreset{chapter}{part} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Set up fancy headings. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Although we don't actually use the "fancy" page style, we have to set it +% initially in order for the page marks to be set up correctly. +\pagestyle{fancy} +\fancyhf{} + +% Page marks. \partmark is completely new, the others are standard. +\newcommand{\partmark}[1]{\markboth{\partname\ \thepart---#1}{}} +\renewcommand{\chaptermark}[1]{\markright{\@chapapp\ \thechapter---#1}} +\renewcommand{\sectionmark}[1]{} + +\setlength{\headheight}{15pt} + +% No running head or foot rules. +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} + +% Use | to separate items in the header/footer. +\newcommand{\LeftHeadingBullet}{\(\vert\)} +\newcommand{\RightHeadingBullet}{\(\vert\)} +\newlength{\HeadingBulletSpacing} +\setlength{\HeadingBulletSpacing}{0.5em} + +% The headers and footers are set up as follows, where "TOC" = table of +% contents, "1st" = first page of part or chapter, "part" = title page of +% a part, "plain" = plain page style, "empty" = empty page style, +% "#" = page number, "LO" = left odd, "RE" = right even, etc. If something +% isn't mentioned, it's empty. +% +% Note that we're optimising for 2-up printing, so the placement of page +% numbers on even/odd pages is the opposite of what you'd normally expect. +% TODO: make this a switchable option? +% +% Headers: +% {plain,TOC} LO # | STUDENT HANDBOOK +% {plain,TOC} RO , +% TOC LE +% TOC RE CONTENTS | # +% plain LE PART --- +% plain RE --- | # +% {empty,1st,part} * +% +% Footers: +% {plain,TOC,empty,part} * +% 1st LO # | +% 1st RE | # +% +% For ease of definition, here are some macros: +\def\@plainHeadLO{\headerfont{\thepage{}\hspace{\HeadingBulletSpacing}\LeftHeadingBullet\hspace{\HeadingBulletSpacing}\MakeUppercase{\PaperCode\ \handbookname}}} +\def\@plainHeadRO{\headerfont{\MakeUppercase{\PaperLongPeriod, \PaperYear}}} +\def\@plainHeadLE{\headerfont{\MakeUppercase{\leftmark}}} +\def\@plainHeadRE{\headerfont{\MakeUppercase{\rightmark}\hspace{\HeadingBulletSpacing}\RightHeadingBullet\hspace{\HeadingBulletSpacing}\thepage}} +\def\@tocHeadLE{} +\def\@tocHeadRE{\headerfont{\MakeUppercase{\contentsname}\hspace{\HeadingBulletSpacing}\RightHeadingBullet\hspace{\HeadingBulletSpacing}\thepage}} +\def\@firstFootLO{\headerfont{\thepage\hspace{\HeadingBulletSpacing}\LeftHeadingBullet}} +\def\@firstFootRO{\headerfont{\LeftHeadingBullet\hspace{\HeadingBulletSpacing}\thepage}} + +% Plain style is automatically set when we use \chapter or \part, but +% this becomes a bit complicated, because we want a different appearance +% for the first page of a chapter (simple footer only) vs. the title page of +% a part (no header or footer at all). The simplest solution seems to be to +% define a \newif that tells us if we're in part mode (default false) and sets +% up the style accordingly. We then just have to overload the original +% \chapter and \part macros to set the flag appropriately (see below). +\newif\if@inpart \@inpartfalse + +\fancypagestyle{plain}{% + \fancyhf{}% + \if@inpart\else% + \fancyfoot[LO]{\headerfont{\thepage\hspace{\HeadingBulletSpacing}\LeftHeadingBullet}}% + \fancyfoot[RE]{\headerfont{\LeftHeadingBullet\hspace{\HeadingBulletSpacing}\thepage}}% + \fi% +} + +% Heading style for table of contents. +\fancypagestyle{toc}{% + \fancyhf{}% + \fancyhead[LO]{\@plainHeadLO}% + \fancyhead[RO]{\@plainHeadRO}% + \fancyhead[LE]{\@tocHeadLE}% + \fancyhead[RE]{\@tocHeadRE}% +} + +% "normal" is the new "plain" :) +% We use this rather than just \pagestyle{fancy}, because we need to +% explicitly switch styles in a couple of places (e.g., TOC). It would +% probably have made more sense to just redefine the "fancy" style, but +% that seems to make LaTeX grind to a halt. +\fancypagestyle{normal}{% + \fancyhf{}% + \fancyhead[LO]{\@plainHeadLO}% + \fancyhead[RO]{\@plainHeadRO}% + \fancyhead[LE]{\@plainHeadLE}% + \fancyhead[RE]{\@plainHeadRE}% +} + +\pagestyle{normal} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Create title page. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\maketitlepage}{% + % TODO: + % - Add University logo? + \thispagestyle{empty}% + \vspace*{\stretch{1}}% + \begin{flushright}% + \Huge\PaperCode \\% + \PaperTitle \\% + \rule{\textwidth}{3pt} \\[0.25\baselineskip]% + \huge \handbookname \\[1.1\baselineskip]% + \Large\HandbookAuthors% + \end{flushright}% + \vspace*{\stretch{2}}% + \begin{center}% + \scshape\Large Department of Information Science \\% + University of Otago \\[0.25\baselineskip]% + \PaperYear% + \end{center}% + \vspace*{\stretch{0.3}}% + \clearpage\thispagestyle{empty}% blank, empty page +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Table of contents. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Add a wrapper around the book class's \tableofcontents macro so we can +% easily change the page style for the TOC section (and more importantly, +% change it back). This also lets us hook in our own tracking of various +% things like chapter titles. +\let\@booktableofcontents\tableofcontents +\renewcommand\tableofcontents{% + \pagestyle{toc}% + \@booktableofcontents% + \clearpage\thispagestyle{toc}% + \pagestyle{normal}% +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Different modes for different parts of the document. The behaviour here +% is analogous to the \appendix macro. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% This macro updates relevant internal parameters in hyperref so that +% correct PDF bookmarks are generated. +\newcommand\@hyperrefsetup[1]{% + \def\Hy@chapapp{#1}% + \renewcommand{\theHchapter}{\theHpart.\arabic{chapter}}% + \renewcommand{\theHsection}{\theHpart.\theHchapter.\arabic{section}}% + \renewcommand{\theHsubsection}{\theHpart.\theHchapter.\theHsection.\arabic{subsection}}% + \renewcommand{\theHsubsubsection}{\theHpart.\theHchapter.\theHsection.\theHsubsection.\arabic{subsubsection}}% +} + +% Introduction part. +\newcommand\intro{% + \gdef\@chapapp{\introchaptername}% + \@hyperrefsetup{introchapter}% +} + +% Labs part. +\newcommand\labs{% + \gdef\@chapapp{\labname}% + \@hyperrefsetup{lab}% +} + +% Tutorials part. +\newcommand\tutorials{% + \gdef\@chapapp{\tutorialname}% + \@hyperrefsetup{tutorial}% +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Sectioning. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Wrappers for \chapter for each of labs, tutorials and "ordinary" chapters. +% These all make the chapter title available through \CurrentChapterTitle. +% +% TODO: I wanted to override \chapter and refactor \general to \chapter, but +% the TOC seems to wig out when I try it. Probably not that crucial... +%\let\@bookchapter\chapter +% +% \renewcommand{\chapter}[1]% +% {% +% \@bookchapter{#1}% +% \renewcommand{\CurrentChapterTitle}{#1}% +% } +% +% TODO: prehaps rename \general to \introchapter? +\newcommand{\general}[1]{\@inpartfalse\chapter{#1}} + +\newcommand{\lab}[1]{\@inpartfalse\chapter{#1}} + +\newcommand{\tutorial}[1]{\@inpartfalse\chapter{#1}} + +\newcommand{\handbookpart}[1]{\@inparttrue\part{#1}\partmark{#1}} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Answers handling. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\ifhandbook@showanswers + \newenvironment{answer}{\par\vspace{0.5em}\itshape}{\normalfont\vspace{1.5em}} +\else + \newenvironment{answer}{% + \@bsphack% + \let\do\@makeother\dospecials\catcode`\^^M\active% + \let\verbatim@startline\relax% + \let\verbatim@addtoline\@gobble% + \let\verbatim@processline\relax% + \let\verbatim@finish\relax% + \verbatim@% + }{\@esphack} +\fi + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Set up auxiliary file so that we can write out the first and last +% absolute page number for each tutorial and lab exercise. We can then use +% this to automatically generate a separate PDF for each exercise. +% +\newcounter{absolutepage} +\newcounter{absolutepagetwoup} + +\newcommand{\markfirstpage}[1]{% + \setcounter{absolutepage}{\the\count1}% + \stepcounter{absolutepage}% + \immediate\write\@auxout{\string\@writefile{bmk}{\string#1.1up.first=\theabsolutepage}}% + \setcounter{absolutepagetwoup}{\value{absolutepage}/2+1}% + \immediate\write\@auxout{\string\@writefile{bmk}{\string#1.2up.first=\theabsolutepagetwoup}}% +} + +\newcommand{\marklastpage}[1]{% + \cleardoublepage% can't just add 1 because we may be skipping 2 pages + \immediate\write\@auxout{\string\@writefile{bmk}{\string#1.1up.last=\the\count1}}% + \setcounter{absolutepagetwoup}{\the\count1/2}% + \immediate\write\@auxout{\string\@writefile{bmk}{\string#1.2up.last=\theabsolutepagetwoup}}% +} + + +\endinput