| % chngpage.sty |
| % |
| % Provides commands to change the page layout in the middle of a document, |
| % and to robustly check for typesetting on odd or even pages. |
| % Instructions for use are at the end of this file. |
| % |
| % author: Peter Wilson (CUA) |
| % (now at peter.r.wilson@boeing.com) |
| % Copyright 2000 |
| % Released under the Latex Project Public License |
| % |
| % |
| \NeedsTeXFormat{LaTeX2e} |
| \ProvidesPackage{chngpage}[2001/02/24 v1.1c change page layout] |
| |
| %% Note: internal package commands all include the string `cp@' |
| %% new \if for the strict option |
| \newif\ifcpstrict |
| \cpstrictfalse |
| |
| %% Declare and process options |
| \DeclareOption{strict}{\cpstricttrue} |
| \ProcessOptions\relax |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| %% new commands for strict checking of odd/even page |
| %% Works by writing a label and then checking its pageref |
| |
| \newif\ifcpoddpage |
| \newcounter{cp@cnt} |
| \newcounter{cp@tempcnt} |
| \newcommand{\cplabelprefix}{^_} |
| |
| \newcommand{\cp@setref}[3]{% |
| \ifx#1\relax |
| 0% in case no label in the *.aux file (page number made = 0) |
| \else |
| \expandafter#2#1% |
| \fi} |
| |
| \newcommand{\cp@pageref}[1]{% |
| \expandafter\cp@setref\csname r@#1\endcsname\@secondoftwo{#1}} |
| |
| \AtBeginDocument{% % special code if hyperrref package is used |
| \@ifpackageloaded{hyperref}{% |
| \renewcommand{\cp@pageref}[1]{% |
| \expandafter\ifx\csname r@#1\endcsname\relax |
| 0% % zero |
| \else |
| \expandafter\expandafter\expandafter\expandafter |
| \expandafter\expandafter\expandafter\@car |
| \expandafter\expandafter\expandafter\@gobble |
| \csname r@#1\endcsname\@nil |
| \fi}}{}} |
| |
| %% User level command to check for odd/even page |
| \DeclareRobustCommand{\checkoddpage}{% |
| \stepcounter{cp@cnt}\label{\cplabelprefix\thecp@cnt}% |
| \cpoddpagefalse% |
| \c@cp@tempcnt=\cp@pageref{\cplabelprefix\thecp@cnt} % must have a space here |
| \ifodd\c@cp@tempcnt\cpoddpagetrue\fi} |
| |
| %% end newcommands for strict checking of odd/even page |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| %% copy of some of the code from the ifmtarg package to save requiring ifmtarg |
| \begingroup |
| \catcode`\Q=3 |
| \long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil} |
| \long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4} |
| \endgroup |
| |
| %% set the page output parameters |
| %\newcommand{\ch@ngetext}{% |
| \DeclareRobustCommand{\ch@ngetext}{% |
| \setlength{\@colht}{\textheight}\setlength{\@colroom}{\textheight}% |
| \setlength{\vsize}{\textheight}\setlength{\columnwidth}{\textwidth}% |
| \if@twocolumn% |
| \advance\columnwidth-\columnsep \divide\columnwidth\tw@% |
| \@firstcolumntrue% |
| \fi% |
| \setlength{\hsize}{\columnwidth}% |
| \setlength{\linewidth}{\hsize}% |
| } |
| |
| %\newcommand{\changetext}[5]{% |
| \DeclareRobustCommand{\changetext}[5]{% |
| \@ifmtarg{#1}{}{\addtolength{\textheight}{#1}}% |
| \@ifmtarg{#2}{}{\addtolength{\textwidth}{#2}}% |
| \@ifmtarg{#3}{}{\addtolength{\evensidemargin}{#3}}% |
| \@ifmtarg{#4}{}{\addtolength{\oddsidemargin}{#4}}% |
| \@ifmtarg{#5}{}{\addtolength{\columnsep}{#5}}% |
| \ch@ngetext% |
| } |
| |
| %\newcommand{\changepage}[9]{% |
| \DeclareRobustCommand{\changepage}[9]{% |
| \@ifmtarg{#1}{}{\addtolength{\textheight}{#1}}% |
| \@ifmtarg{#2}{}{\addtolength{\textwidth}{#2}}% |
| \@ifmtarg{#3}{}{\addtolength{\evensidemargin}{#3}}% |
| \@ifmtarg{#4}{}{\addtolength{\oddsidemargin}{#4}}% |
| \@ifmtarg{#5}{}{\addtolength{\columnsep}{#5}}% |
| \ch@ngetext% |
| \@ifmtarg{#6}{}{\addtolength{\topmargin}{#6}}% |
| \@ifmtarg{#7}{}{\addtolength{\headheight}{#7}}% |
| \@ifmtarg{#8}{}{\addtolength{\headsep}{#8}}% |
| \@ifmtarg{#9}{}{\addtolength{\footskip}{#9}}% |
| } |
| |
| |
| \newenvironment{adjustwidth}[3][\@empty]{% |
| \begin{list}{}{% |
| \topsep\z@% |
| \listparindent\parindent% |
| \parsep\parskip% |
| \@ifmtarg{#2}{\setlength{\leftmargin}{\z@}}{\setlength{\leftmargin}{#2}}% |
| \@ifmtarg{#3}{\setlength{\rightmargin}{\z@}}{\setlength{\rightmargin}{#3}}% |
| \ifx\@empty #1\relax \else |
| \cpoddpagefalse |
| \ifcpstrict\checkoddpage\else |
| \ifodd\c@page\cpoddpagetrue\fi |
| \fi |
| \ifcpoddpage\else % even numbered page |
| \@ifmtarg{#3}{\setlength{\leftmargin}{\z@}}{\setlength{\leftmargin}{#3}}% |
| \@ifmtarg{#2}{\setlength{\rightmargin}{\z@}}{\setlength{\rightmargin}{#2}}% |
| \fi |
| \fi} |
| \item[]}{\end{list}} |
| |
| |
| |
| \endinput |
| |
| % Usage: |
| % ------ |
| % |
| %%%%%%%%%%%%% |
| % \changetext |
| %%%%%%%%%%%%% |
| % The \changetext command is for changing the size and horizontal position |
| % of the text block on a page. The command takes 5 arguments, each of which |
| % is a length or is empty. i.e., |
| % |
| % \changetext{textheight}{textwidth}{evensidemargin}{oddsidemargin}{columnsep} |
| % |
| % The given lengths are added to the corresponding current lengths and |
| % the remainder of the current page is typeset using the changed text block |
| % layout. The new layout remains in effect until another \change... command |
| % is issued. |
| % |
| %%%%%%%%%%%%% |
| % \changepage |
| %%%%%%%%%%%%% |
| % The \changepage command is for changing the general layout of |
| % a page. The command takes 9 arguments, each of which is a length or is empty. |
| % The first 5 arguments are the same as for \changetext and have the same effect. |
| % The last four arguments are: |
| % |
| % \changepage{5 args}{topmargin}{headheight}{headsep}{footskip} |
| % |
| % These lengths are added to the corresponding current lengths and |
| % thus modify the vertical positions of the elements of the page. The |
| % remainder of the current page is typeset using the changed text block |
| % and page layout. The new layout remains in effect until another |
| % \change... command is issued. |
| % |
| % NOTE 1: Not supplying a value for a length argument is equivalent |
| % to giving it a zero length value. |
| % |
| % NOTE 2: For any given page, everything is constant except for the textwidth |
| % and columnsep (for example, what is the meaning of two |
| % topmargins on a single column page?). |
| % It is therefore best to change anything else at the |
| % start of a new page. Further, any changes only apply to whole |
| % paragraphs. If you want an odd shaped paragraph use either |
| % the hanging package or the TeX \parshape command. |
| % |
| % For example, to change from single column pages to double column |
| % pages where the text block is both shorter and wider, then to revert |
| % back to the initial layout: |
| % ... single column normal page |
| % \newpage % or \clearpage |
| % \changetext{-5\baselineskip}{10em}{-5em}{-5em}{} |
| % \twocolumn |
| % ... two column pages |
| % \clearpage |
| % \changetext{5\baselineskip}{-10em}{5em}{5em}{} |
| % \onecolumn |
| % ... normal pages |
| % |
| % Note the adjustments to the margins which will keep the vertical centerline |
| % of the textblock at the same position on the page. |
| % |
| % As another example, to increase the width of a single paragraph: |
| % |
| % \changetext{0pt}{5em}{}{}{}% |
| % Start of wider paragraph text ... |
| % ... end of paragraph. |
| % |
| % \changetext{0pt}{-5em}{}{}{} |
| % Start of a normal paragraph ... |
| % |
| % Under some circumstances you can include a \change... command as part of |
| % the argument to \afterpage (from the afterpage package) and it may work. |
| % Similarly it may work in a heading style used for \thispagestyle to change |
| % a single page. |
| % |
| %%%%%%%%%%%%% |
| % adjustwidth |
| %%%%%%%%%%%%% |
| % Within an adjustwidth environment the left and right margins can be |
| % adjusted. The environment takes one optional argument and two required |
| % length arguments: |
| % |
| % \begin{adjustwidth}[]{leftmargin}{rightmargin} |
| % |
| % A positive length value will increase the relevant margin (shortening |
| % the text lines) while a negative length value will decrease the margin |
| % (lengthening text lines). An empty length argument means no change |
| % to the margin. At the end of the environment the margins revert to |
| % their original values. |
| % |
| % For example, to extend the text into the right margin: |
| % \begin{adjustwidth}{}{-8em} |
| % |
| % Any appearance of the optional argument (even just []) will cause |
| % the values of the margins to switch between odd and even pages. |
| % |
| % If the document is being set twosided it might be advantageous |
| % to have any wider text extending into the outside margin. This |
| % could be done via the optional argument, as: |
| % \begin{adjustwidth}[]{}{-8em} |
| % |
| % To have the adjusted text horizontally centered with respect to |
| % any surrounding text, the margins should be adjusted equally: |
| % \begin{adjustwidth}{-4em}{-4em} |
| % |
| % For interest, \begin{quotation} is pretty much equivalent |
| % to \begin{adjustwidth}{2.5em}{2.5em} |
| % |
| % The environment may also be used inside a float if the contents are |
| % a bit too wide for the text block, but can still fit within the physical |
| % page: |
| % \begin{figure} |
| % \begin{adjustwidth}{-2em}{-2em} |
| % \includegraphics{wide} |
| % \caption{Wide figure} |
| % \end{adjustwidth} |
| % \end{figure} |
| % |
| % Sometimes, because of the asynchronous nature of the TeX output |
| % routine, the margin switching may be incorrect (like \marginpar sometimes) |
| % near the top of a page. This can be corrected by using the package |
| % option `strict' (i.e., \usepackage[strict]{chngpage}), which causes |
| % adjustwidth to use the \checkoddpage command (see below). |
| % |
| % A disadvantage of the strict option is that the package generates |
| % a new label for each adjustwidth environment, and TeX may run out |
| % of space if there are an excessive number of labels in the document. |
| % |
| % Whether or not the strict option is used, `strict adjustwidths' |
| % can be turned on by putting the command \cpstricttrue before |
| % the environment, and turned of by using \cpstrictfalse. |
| % |
| % NOTE: In a twocolumn document, the adjustwidth environment |
| % treats both columns equally. For example, if the width is meant |
| % to be wider at the outer margin, then on odd pages the extra width |
| % will be at the right of any column, and on even pages the extra |
| % will be at the left of any column. You can get interesting effects |
| % by careful hand tuning on two column pages. |
| % |
| %%%%%%%%%%%%%%% |
| % \checkoddpage |
| %%%%%%%%%%%%%%% |
| % The \checkoddpage command can be used anywhere in the body of |
| % a document to determine if TeX is typesetting on an odd or |
| % even numbered page. If on an odd page then \ifcpoddpage is |
| % set TRUE, otherwise (on an even page) \ifcpoddpage is set |
| % FALSE. |
| % |
| % This works by the \checkoddpage command generating a label and |
| % then checking the \pageref for the label (actually, a special version |
| % of \pageref is required and is used internally by \checkoddpage). |
| % This mechanism requires at least two LaTeX passes to ensure that |
| % the labels have settled (on the initial pass there will be no labels |
| % in the *.aux file to be checked). |
| % |
| % The label identifier is composed of the command \cplabelprefix |
| % and an automatically generated number. \cplabelprefix, initially |
| % defined as `^_', can be changed in the preamble if it will cause |
| % a clash with any author-defined labels. The default labels will |
| % be of the form `^_N' where N is a positive integer. |
| % |
| % Changes in version 1.1c (2001/02/24) |
| % ----------------------- |
| % o Fixed problem when used with the calc package |
| % (can't do \setcounter{cp@tempcnt}{\cp@pageref{....}} |
| % o Fixed problem when used with the hyperef package |
| % (hyperref adds new arguments to \newlabel in the *.aux file) |
| % |
| % Changes in version 1.1b (2001/01/31) |
| % ----------------------- |
| % o Added strict option for robust adjustwidth; checks odd/even |
| % pages via labels instead of by the page counter. |
| % |
| % Changes in version 1.1a (2001/01/18) |
| % ----------------------- |
| % o Added missing {} in last 4 arguments of \changepage |
| % |
| % Changes in version 1.1 (2000/07/22) |
| % ---------------------- |
| % o Empty arguments made available |
| % o Added adjustwidth environment |
| % |
| % |
| % Peter W. |
| % |
| % |