diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/flowfram/flowfram.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/flowfram/flowfram.dtx | 1557 |
1 files changed, 1406 insertions, 151 deletions
diff --git a/Master/texmf-dist/source/latex/flowfram/flowfram.dtx b/Master/texmf-dist/source/latex/flowfram/flowfram.dtx index 983fb08b65f..7ad71e5b94c 100644 --- a/Master/texmf-dist/source/latex/flowfram/flowfram.dtx +++ b/Master/texmf-dist/source/latex/flowfram/flowfram.dtx @@ -6,7 +6,7 @@ % -author "Nicola Talbot" % -dir "source" % flowfram -% Created on 2007/8/21 13:54 +% Created on 2008/7/1 14:05 %\fi %\iffalse %<*package> @@ -29,13 +29,13 @@ %\fi % \iffalse % Doc-Source file to use with LaTeX2e -% Copyright (C) 2007 Nicola Talbot, all rights reserved. +% Copyright (C) 2008 Nicola Talbot, all rights reserved. % \fi % \iffalse %<*driver> \documentclass{ltxdoc} -\CheckSum{8345} +\CheckSum{9387} \PageIndex \usepackage{url} @@ -132,9 +132,9 @@ IDN}]{idl}{IDL}{identification label} \end{document} %</driver> %\fi -%\title{Documented Source Code for flowfram.sty v1.10} +%\title{Documented Source Code for flowfram.sty v1.11} %\author{Nicola L. C. Talbot} -%\date{20th Aug 2007} +%\date{28th June 2008} %\maketitle % %This is the documented source code for the flowfram package. @@ -157,7 +157,7 @@ IDN}]{idl}{IDL}{identification label} % Declare package, and identify it as a \LaTeXe\ package. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{flowfram}[2007/08/21 v1.10] +\ProvidesPackage{flowfram}[2008/06/27 v1.11] % \end{macrocode} % Load packages needed by this package % \begin{macrocode} @@ -367,14 +367,48 @@ IDN}]{idl}{IDL}{identification label} } % \end{macrocode} % Now get on with the package. First we need to set up -% a count register to store the number of \glspl{flow}, and -% one to store the id number of the current \gls{flow}: +% a register to store the number of \glspl{flow} that have been defined: % \begin{macrocode} \newcounter{maxflow} -\newcounter{thisframe} \c@maxflow=0\relax +% \end{macrocode} +% Next define a counter to keep track of the \gls{idn} of the current +% \gls{flow}. +% \begin{macrocode} +\newcounter{thisframe} \c@thisframe=0\relax +\@ifpackageloaded{hyperref}{% +\def\theHthisframe{\thepage.\arabic{thisframe}}}{} +% \end{macrocode} +%\begin{macro}{\labelflowidn} +%\changes{1.11}{2008/06/27}{new} +% Define a command to label the current \gls{flow} so that its +% \gls{idn} can be referenced: +% \begin{macrocode} +\newcommand*{\labelflowidn}[1]{% +{\def\@currentlabel{\thethisframe}\label{#1}}} +% \end{macrocode} +%\end{macro} +% Define a counter to store the current frame index for the current +% page. This will be the same as the \gls{idn} if all \glspl{flow} +% are displayed on the current page, but may be different to the +% \gls{idn} if some \glspl{flow} are not displayed. +%\changes{1.11}{2008/06/27}{displayedframe counter added} +% \begin{macrocode} +\newcounter{displayedframe} +\c@displayedframe=0 +\@ifpackageloaded{hyperref}{% +\def\theHdisplayedframe{\thepage.\arabic{displayedframe}}}{} +% \end{macrocode} +%\begin{macro}{\labelflow} +%\changes{1.11}{2008/06/27}{new} +% Define a command to label the current \gls{flow} so that its +% displayed index can be referenced: +% \begin{macrocode} +\newcommand*{\labelflow}[1]{% +{\def\@currentlabel{\thedisplayedframe}\label{#1}}} % \end{macrocode} +%\end{macro} % Define a counter to store the total number of \glspl{static}: % \begin{macrocode} \newcounter{maxstatic} @@ -690,6 +724,30 @@ for flow frame \number\@colN}}{}% }}} % \end{macrocode} %\end{macro} +% +%\begin{macro}{\getflowlabel} +%\changes{1.11}{2008/06/27}{new} +%\cs{getflowlabel}\marg{idn} +% Gets the \gls{idl} for the \gls{flow} identified by its +% \gls{idn}. +% \begin{macrocode} +\newcommand*{\getflowlabel}[1]{% +\csname @col@id@\romannumeral#1\endcsname} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\getflowid} +%\changes{1.11}{2008/06/27}{new} +%\cs{getflowid}\marg{cmd}\marg{idl} +% Gets the \gls{idn} for the \gls{flow} identified by its +% \gls{idl} and stores in \meta{cmd} which must be a control +% sequence. +% \begin{macrocode} +\newcommand*{\getflowid}[2]{% +\@flowframeid{#2}\edef#1{\number\ff@id}} +% \end{macrocode} +%\end{macro} +% %\begin{macro}{\@flowframeid} % Work out the \gls{flow} \gls{idn} from the label. This % iterates through the \glspl{flow}, so if you have a lot of @@ -914,10 +972,10 @@ may only specify 'c', 't' or 'b'}}} \ifnum\@ff@numstart=0\relax \def\@ff@numstart{1}% \fi -\ifnum\@ff@numend>\c@maxflow +\ifnum\@ff@numend>\c@maxflow\relax \def\@ff@numend{\c@maxflow}% \fi -\@colN=\@ff@numstart +\@colN=\@ff@numstart\relax \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% \@@setflowframe{\@colN}{#2}% \advance\@colN by 1\relax @@ -928,6 +986,7 @@ may only specify 'c', 't' or 'b'}}} % This is the command that actually sets the values for % the \gls{flow} whose \gls{idn} is specified by the first % parameter. +%\changes{1.11}{2008/06/27}{removed unwanted spaces} % \begin{macrocode} \newcommand*{\@@setflowframe}[2]{% \def\ff@frame{}\def\ff@width{}\def\ff@height{}\def\ff@margin{}% @@ -954,26 +1013,26 @@ may only specify 'c', 't' or 'b'}}} \expandafter\setlength\csname col@\romannumeral#1@posy\endcsname {\ff@y}% \expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname -{\ff@y}} +{\ff@y}}% \ifthenelse{\equal{\ff@evenx}{}}{}{% \expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname -{\ff@evenx}} +{\ff@evenx}}% \ifthenelse{\equal{\ff@eveny}{}}{}{% \expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname -{\ff@eveny}} +{\ff@eveny}}% \ifthenelse{\equal{\ff@oddx}{}}{}{% \expandafter\setlength\csname col@\romannumeral#1@posx\endcsname -{\ff@oddx}} +{\ff@oddx}}% \ifthenelse{\equal{\ff@oddy}{}}{}{% \expandafter\setlength\csname col@\romannumeral#1@posy\endcsname -{\ff@oddy}} +{\ff@oddy}}% \ifthenelse{\equal{\ff@label}{}}{}{% -\@s@tflowframeid{#1}[\ff@label]} +\@s@tflowframeid{#1}[\ff@label]}% \ifthenelse{\equal{\ff@frametype}{}}{}{% \expandafter\edef\csname @ff@frametype@\romannumeral#1\endcsname -{\ff@frametype}} +{\ff@frametype}}% \ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\@setframecol\ff@col\end{#1}{col}{ff}} +\expandafter\@setframecol\ff@col\end{#1}{col}{ff}}% \ifthenelse{\equal{\ff@txtcol}{}}{}{% \expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{ff}}% \ifthenelse{\equal{\ff@backcol}{}}{}{% @@ -1259,6 +1318,30 @@ for static frame \number\@colN}}{}% }} % \end{macrocode} %\end{macro} +% +%\begin{macro}{\getstaticlabel} +%\changes{1.11}{2008/06/27}{new} +%\cs{getstaticlabel}\marg{idn} +% Gets the \gls{idl} for the \gls{static} identified by its +% \gls{idn}. +% \begin{macrocode} +\newcommand*{\getstaticlabel}[1]{% +\csname @sf@id@\romannumeral#1\endcsname} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\getstaticid} +%\changes{1.11}{2008/06/27}{new} +%\cs{getstaticid}\marg{cmd}\marg{idl} +% Gets the \gls{idn} for the \gls{static} identified by its +% \gls{idl} and stores in \meta{cmd} which must be a control +% sequence. +% \begin{macrocode} +\newcommand*{\getstaticid}[2]{% +\@staticframeid{#2}\edef#1{\number\ff@id}} +% \end{macrocode} +%\end{macro} +% %\begin{macro}{\@staticframeid} % Work out the \gls{idn} of the \gls{static} with the % given label. This iterates through each \gls{static}, @@ -1349,10 +1432,10 @@ id '#1'}{}\fi} \ifnum\@ff@numstart=0\relax \def\@ff@numstart{1}% \fi -\ifnum\@ff@numend>\c@maxstatic +\ifnum\@ff@numend>\c@maxstatic\relax \def\@ff@numend{\c@maxstatic}% \fi -\@colN=\@ff@numstart +\@colN=\@ff@numstart\relax \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% \@@setstaticframe{\@colN}{#2}% \advance\@colN by 1\relax @@ -1577,6 +1660,29 @@ sectioning commands within a \string\shapepar}{}}% % \begin{macrocode} \newbox\staticframe \newenvironment{staticcontents}[1]{% +\let\continueonframe=\@staticcontinueonframe +\@beginstaticcontents{#1}% +}{% +\@endstaticcontents +\ignorespaces} +% \end{macrocode} +%\end{environment} +%\begin{environment}{staticcontents*} +% Set the contents of the \gls{static} given by its \gls{idl}. +% Syntax: "\begin{staticcontents*}"\marg{label}. +% \begin{macrocode} +\newenvironment{staticcontents*}[1]{\@staticframeid{#1}% +\let\continueonframe=\@staticscontinueonframe +\@beginstaticcontents{\ff@id}% +}{% +\@endstaticcontents +\ignorespaces} +% \end{macrocode} +%\end{environment} +% +% Begin staticcontents stuff. +% \begin{macrocode} +\newcommand{\@beginstaticcontents}[1]{% \@ifundefined{@staticframe@\romannumeral#1}{% \PackageError{flowfram}{Static frame '#1' not defined}{}}{}% \expandafter\let\expandafter\@ff@parshape\csname @sf@shape@\romannumeral#1\endcsname @@ -1616,21 +1722,17 @@ sectioning commands within a \string\shapepar}{}}% \@s@tfftextcol\noindent \@sf@mpg \setlength\parindent\sdfparindent -}{\ifnum\ff@shape=2\par -\else\FLForgpar\fi\endgroup\end{minipage}\end{lrbox}% -\expandafter\global\expandafter\sbox\@sf@thisframe{% -\usebox\staticframe}\ignorespaces } % \end{macrocode} -%\end{environment} -%\begin{environment}{staticcontents*} -% Set the contents of the \gls{static} given by its \gls{idl}. -% Syntax: "\begin{staticcontents*}"\marg{label}. +% End staticcontents stuff % \begin{macrocode} -\newenvironment{staticcontents*}[1]{\@staticframeid{#1}% -\begin{staticcontents}{\ff@id}}{\end{staticcontents}} +\newcommand*{\@endstaticcontents}{% +\ifnum\ff@shape=2\par +\else\FLForgpar\fi\endgroup\end{minipage}\end{lrbox}% +\expandafter\global\expandafter\sbox\@sf@thisframe{% +\usebox\staticframe}} % \end{macrocode} -%\end{environment} +% %\begin{macro}{\setstaticcontents} % Provide a command version. % Syntax: \cs{setstaticcontents}\marg{idn}\marg{text}. @@ -1642,8 +1744,8 @@ sectioning commands within a \string\shapepar}{}}% %\begin{macro}{\@sstaticconts} % Starred version: \gls{static} identified by label. % \begin{macrocode} -\newcommand{\@sstaticconts}[1]{\@staticframeid{#1}% -\@staticconts{\ff@id}} +\newcommand{\@sstaticconts}[2]{\begin{staticcontents*}{#1}% +#2\end{staticcontents*}} % \end{macrocode} %\end{macro} %\begin{macro}{\@staticconts} @@ -1838,6 +1940,30 @@ for dynamic frame \number\@colN}}{}% }} % \end{macrocode} %\end{macro} +% +%\begin{macro}{\getdynamiclabel} +%\changes{1.11}{2008/06/27}{new} +%\cs{getdynamiclabel}\marg{idn} +% Gets the \gls{idl} for the \gls{dynamic} identified by its +% \gls{idn}. +% \begin{macrocode} +\newcommand*{\getdynamiclabel}[1]{% +\csname @df@id@\romannumeral#1\endcsname} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\getdynamicid} +%\changes{1.11}{2008/06/27}{new} +%\cs{getdynamicid}\marg{cmd}\marg{idl} +% Gets the \gls{idn} for the \gls{dynamic} identified by its +% \gls{idl} and stores in \meta{cmd} which must be a control +% sequence. +% \begin{macrocode} +\newcommand*{\getdynamicid}[2]{% +\@dynamicframeid{#2}\edef#1{\number\ff@id}} +% \end{macrocode} +%\end{macro} +% %\begin{macro}{\@dynamicframeid} % Determine the \gls{idn} of the \gls{dynamic} from its label. % The \gls{idn} is stored in "\ff@id". @@ -1854,6 +1980,20 @@ for dynamic frame \number\@colN}}{}% id '#1'}{}\fi} % \end{macrocode} %\end{macro} +% +%\begin{macro}{\@getframeid} +% \cs{@getframeid}\marg{type}\marg{idl} +% +% Gets the \gls{idl} for the frame of type \meta{type} whose \gls{idl} +% is given by \meta{idl}. The \gls{idn} is stored in "\ff@id". +% \begin{macrocode} +\newcommand*{\@getframeid}[2]{% +\@ifdefined{@#1frameid}{\csname @#1frameid\endcsname{#2}}{% +\PackageError{flowfram}{Unknown frame type `#1'}{Frame types can +be one of: flow, static or dynamic}}} +% \end{macrocode} +%\end{macro} +% % Make it easier to get the x and y values for dynamic % frames. (Width and height stored differently.) %\begin{macro}{\dynamicframex} @@ -1925,10 +2065,10 @@ id '#1'}{}\fi} \ifnum\@ff@numstart=0\relax \def\@ff@numstart{1}% \fi -\ifnum\@ff@numend>\c@maxdynamic +\ifnum\@ff@numend>\c@maxdynamic\relax \def\@ff@numend{\c@maxdynamic}% \fi -\@colN=\@ff@numstart +\@colN=\@ff@numstart\relax \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% \@@setdynamicframe{\@colN}{#2}% \advance\@colN by 1\relax @@ -1937,6 +2077,8 @@ id '#1'}{}\fi} %\end{macro} %\begin{macro}{\@@setdynamicframe} % Change the setting for the \gls{dynamic} given by its \gls{idn}. +%\changes{1.11}{2008/06/27}{removed unwanted space} +%\changes{1.11}{2008/06/27}{fixed bug in clear key} % \begin{macrocode} \newcommand*{\@@setdynamicframe}[2]{% \expandafter\expandafter\expandafter @@ -1975,7 +2117,7 @@ id '#1'}{}\fi} \expandafter\xdef\csname @df@dim@\romannumeral#1\endcsname{% [c][\ff@height][\ff@valign]{\ff@width}}% \ifthenelse{\equal{\ff@label}{}}{}{% -\@s@tdynamicframeid{#1}[\ff@label]} +\@s@tdynamicframeid{#1}[\ff@label]}% \ifthenelse{\equal{\ff@frametype}{}}{}{% \expandafter \xdef\csname @df@frametype@\romannumeral#1\endcsname{% @@ -2007,7 +2149,7 @@ id '#1'}{}\fi} \expandafter \xdef\csname @df@style@\romannumeral#1\endcsname{\ff@style}}}% \ifthenelse{\equal{\ff@clear}{}}{}{% -\setboolean{@df@clear@\romannumeral\c@maxdynamic}{true}% +\setboolean{@df@clear@\romannumeral#1}{\ff@clear}% }% \ifthenelse{\equal{\ff@margin}{}}{}{% \PackageError{flowfram}{Key 'margin' not available for dynamic @@ -2092,57 +2234,125 @@ frames}{dynamic frames don't have marginal notes}}% % The contents of the \env{dynamiccontents} environment needs % to be stored in the control sequence "\@dynamicframe@"\meta{rn} % (where \meta{rn} is the \meta{idn} as a roman numeral.) +% \begin{macrocode} +\newenvironment{dynamiccontents}[1]{% +\def\@flf@{dynamiccontents}% +\xdynamiccontents{#1}}{% +\endxdynamiccontents +} +% \end{macrocode} +%\end{environment} +% Token to store contents of environment: +% \begin{macrocode} +\newtoks\@dynamictok +% \end{macrocode} % Start of the environment (unstarred): % \begin{macrocode} -\def\dynamiccontents#1{% -\edef\@flf@{\@currenvir}% +\def\xdynamiccontents#1{% \def\@flf@idn{#1}% -\toks@{}\@flf@get@body +\@dynamictok{}\@flf@get@body } % \end{macrocode} % Get the body of the environment: % \begin{macrocode} -\long\def\@flf@get@body#1\end - {\toks@\expandafter{\the\toks@#1}\@flf@find@end} +\long\def\@flf@get@body#1\end{% +\@flf@checkcontinued#1\continueonframe\@nil +\ifdfcontinued + \expandafter\flf@ta\expandafter{\@flf@tmpa}% + \edef\@flf@tmp{\the\@dynamictok\the\flf@ta}% + \@dynamictok\expandafter{\@flf@tmp}% +\else + \@dynamictok\expandafter{\the\@dynamictok#1}% +\fi +\@flf@find@end} +% \end{macrocode} +% Check if \cs{continueonframe} has been used. +% \begin{macrocode} +\newif\ifdfcontinued +\long\def\@flf@checkcontinued#1\continueonframe#2\@nil{% +\long\def\@flf@tmpa{#1}\long\def\@flf@tmpb{#2}% +\ifx\@flf@tmpb\@lempty + \dfcontinuedfalse +\else + \dfcontinuedtrue + \flf@getcontargs#2\@ff@text\@ff@nextid\@ff@rest +\fi +} +% \end{macrocode} +% Long equivalent of \cs{@empty}: +% \begin{macrocode} +\long\def\@lempty{} +% \end{macrocode} +% Get the first optional argument and store in the forth argument +% (which should be a control sequence). Get the second argument and +% store in the fifth argument (which should be a control sequence). +% Get the third argument and +% store in the sixth argument (which should be a control sequence). +% \begin{macrocode} +\def\flf@getcontargs{% +\@ifnextchar[{\@flf@getcontargs}{\@flf@getcontargs[]}} +% \end{macrocode} +% \begin{macrocode} +\long\def\@flf@getcontargs[#1]#2#3\continueonframe#4#5#6{% +\def#4{#1}\def#5{#2}\def#6{#3}% +} % \end{macrocode} % Find the end of the environment: % \begin{macrocode} \def\@flf@find@end#1{% \def\@tempa{#1}% -\ifx\@tempa\@flf@ -\expandafter\@flf@enddynamiccontents +\global\let\flf@next=\relax +\ifdfcontinued + \@dynamictok\expandafter + {\the\@dynamictok\ffcontinuedtextlayout}% + \protected@edef\@tmpa{\the\@dynamictok{\@ff@text}}% + \@dynamictok\expandafter{\@tmpa}% + \toks@\expandafter{\@ff@rest}% + \edef\flf@next{\noexpand\@flf@get@body\noexpand\end{#1}% + \noexpand\begin{#1}{\@ff@nextid}\noexpand\par + \noexpand\noindent\noexpand\ignorespaces + \the\toks@\noexpand\end{#1}}% \else -\toks@\expandafter - {\the\toks@\end{#1}}\expandafter\@flf@get@body\fi + \ifx\@tempa\@flf@ + \let\flf@next=\@flf@endxdynamiccontents + \else + \@dynamictok\expandafter + {\the\@dynamictok\end{#1}}% + \let\flf@next=\@flf@get@body + \fi +\fi +\flf@next } % \end{macrocode} % End of the environment: % \begin{macrocode} -\let\enddynamiccontents\relax -\def\@flf@enddynamiccontents{% +\let\endxdynamiccontents\relax +\def\@flf@endxdynamiccontents{% \ifnum\@flf@idn>\c@maxdynamic -\PackageError{flowfram}{Dynamic frame \number\@flf@idn\ does not exist}{% -You have specified dynamic frame number \number\@flf@idn, but there are -only \number\c@maxdynamic\space dynamic frames currently defined}% + \PackageError{flowfram}{Dynamic frame \number\@flf@idn\ does not exist}{% + You have specified dynamic frame number \number\@flf@idn, but there are + only \number\c@maxdynamic\space dynamic frames currently defined}% \else -\expandafter -\xdef\csname @dynamicframe@\romannumeral\@flf@idn\endcsname{\the\toks@}% -\expandafter + \expandafter + \xdef\csname @dynamicframe@\romannumeral\@flf@idn\endcsname{% + \the\@dynamictok}% + \expandafter \fi -\expandafter\end\expandafter{\@flf@}} +\expandafter\end\expandafter{\@flf@}% +} % \end{macrocode} -%\end{environment} %\begin{environment}{dynamiccontents*} -% Starred version: +% Starred version % \begin{macrocode} -\expandafter\def\csname dynamiccontents*\endcsname#1{% -\edef\@flf@{\@currenvir}% +\newenvironment{dynamiccontents*}[1]{% +\def\@flf@{dynamiccontents*}% \@dynamicframeid{#1}% -\edef\@flf@idn{\number\ff@id}% -\toks@{}\@flf@get@body +\xdynamiccontents{\ff@id}}{% +\enddynamiccontents } % \end{macrocode} %\end{environment} +% %\begin{macro}{\setdynamiccontents} % \begin{macrocode} \newcommand{\setdynamiccontents}{% @@ -2191,13 +2401,13 @@ only \number\c@maxdynamic\space dynamic frames currently defined}% % \begin{macrocode} \newcommand{\@appenddynamic}[2]{% \ifnum#1>\c@maxdynamic -\PackageError{flowfram}{Dynamic frame \number#1 does not exist}{% -You have specified dynamic frame number \number#1, -but there are only -\number\c@maxdynamic\space dynamic frames currently defined}% + \PackageError{flowfram}{Dynamic frame \number#1 does not exist}{% + You have specified dynamic frame number \number#1, + but there are only + \number\c@maxdynamic\space dynamic frames currently defined}% \else -\expandafter\@ff@addtolist -\csname @dynamicframe@\romannumeral#1\endcsname\entry{#2}% + \expandafter\@ff@addtolist + \csname @dynamicframe@\romannumeral#1\endcsname\entry{#2}% \fi} % \end{macrocode} %\end{macro} @@ -2211,6 +2421,56 @@ but there are only % \end{macrocode} %\end{macro} % +%\begin{macro}{\continueonframe} +% \cs{continueonframe}\oarg{text}\marg{id} +% Ends current \env{staticcontents} or \env{dynamiccontents} +% environment and starts environment of the same type for frame +% given by \meta{id}. Can only be used inside \env{staticcontents} +% or \env{dynamiccontents} environments. If the starred version of +% the environment is used, \marg{id} refers to the \gls{idl}, otherwise +% it refers to the \gls{idn} of the new frame. +% \begin{macrocode} +\newcommand{\continueonframe}{\PackageError{flowfram}{Can't continue +to new frame: not in static or dynamic frame}{% +\string\continueonframe\space may only +be used inside `staticcontents' or `dynamiccontents' environments +(of their starred versions)}} +% \end{macrocode} +%\end{macro} +% \cs{@scontinueonframe} and \cs{@continueonframe} are set +% by \env{staticcontents} and \env{dynamiccontents} environments +% (and their starred forms). +% +% Static starred version uses \gls{idl} +% \begin{macrocode} +\newcommand*{\@staticscontinueonframe}[2][]{% +\ffcontinuedtextlayout{#1}% +\end{staticcontents*}% +\begin{staticcontents*}{#2}\par\noindent\ignorespaces} +% \end{macrocode} +% Static unstarred version uses \gls{idn} +% \begin{macrocode} +\newcommand*{\@staticcontinueonframe}[2][]{% +\ffcontinuedtextlayout{#1}% +\end{staticcontents}% +\begin{staticcontents}{#2}\par\noindent\ignorespaces} +% \end{macrocode} +% +%\begin{macro}{\ffcontinuedtextlayout} +%Displays the continued text used by \cs{continueonframe}. +% \begin{macrocode} +\newcommand{\ffcontinuedtextlayout}[1]{% +\parfillskip=0pt\par\hfill\ffcontinuedtextfont{#1}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ffcontinuedtextfont} +%Sets the font to display the continuation text used by +%\cs{continueonframe} +% \begin{macrocode} +\newcommand*{\ffcontinuedtextfont}[1]{\emph{\small #1}} +% \end{macrocode} +%\end{macro} +% %\subsection{Determining Dimensions and Locations} %\begin{macro}{\computeleftedgeodd} % Compute the position of the left most edge of the page, @@ -2369,6 +2629,7 @@ but there are only \setlength{#2}{\@ff@tmp@x}} % \end{macrocode} %\end{macro} +% %\begin{macro}{\@ff@getdim} % Get the dimensions for the given type of frame. % The first parameter should be a number indictating @@ -2378,55 +2639,116 @@ but there are only % \begin{macrocode} \newcommand*{\@ff@getdim}[2]{% \ifnum#2<1\relax -\PackageError{flowfram}{Frame IDNs start from 1}{% -You have specified a frame IDN of '\number#2'}% + \PackageError{flowfram}{Frame IDNs start from 1}{% + You have specified a frame IDN of '\number#2'}% \fi -\ifcase#1 -\PackageError{flowfram}{Unknown frame ID type '#1'}{% -Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} +\ifcase#1\relax + \PackageError{flowfram}{Unknown frame ID type '#1'}{% + Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)}% \or -\ifnum#2>\c@maxflow -\PackageError{flowfram}{Invalid flow frame IDN '\number#2'}{% -Flow frame IDNs go from 1 to \number\c@maxflow} -\else -\setlength{\ffareax}{\flowframex{#2}} -\setlength{\ffareay}{\flowframey{#2}} -\setlength{\ffareawidth}{\flowframewidth{#2}} -\setlength{\ffareaheight}{\flowframeheight{#2}} -\fi + \ifnum#2>\c@maxflow\relax + \PackageError{flowfram}{Invalid flow frame IDN '\number#2'}{% + Flow frame IDNs go from 1 to \number\c@maxflow}% + \else + \setlength{\ffareax}{\flowframex{#2}}% + \setlength{\ffareay}{\flowframey{#2}}% + \setlength{\ffareawidth}{\flowframewidth{#2}}% + \setlength{\ffareaheight}{\flowframeheight{#2}}% + \fi \or -\ifnum#2>\c@maxstatic -\PackageError{flowfram}{Invalid static frame IDN '\number#2'}{% -Static frame IDNs go from 1 to \number\c@maxstatic} -\else -\setlength{\ffareax}{\staticframex{#2}} -\setlength{\ffareay}{\staticframey{#2}} -\expandafter\expandafter\expandafter -\@ff@getstaticpos -\csname @sf@dim@\romannumeral#2\endcsname -\setlength{\ffareawidth}{\@ff@tmp@x}% -\setlength{\ffareaheight}{\@ff@tmp@y}% -\fi + \ifnum#2>\c@maxstatic\relax + \PackageError{flowfram}{Invalid static frame IDN '\number#2'}{% + Static frame IDNs go from 1 to \number\c@maxstatic}% + \else + \setlength{\ffareax}{\staticframex{#2}}% + \setlength{\ffareay}{\staticframey{#2}}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos + \csname @sf@dim@\romannumeral#2\endcsname + \setlength{\ffareawidth}{\@ff@tmp@x}% + \setlength{\ffareaheight}{\@ff@tmp@y}% + \fi \or -\ifnum#2>\c@maxdynamic -\PackageError{flowfram}{Invalid dynamic frame IDN '\number#2'}{% -Dynamic frame IDNs go from 1 to \number\c@maxdynamic} + \ifnum#2>\c@maxdynamic\relax + \PackageError{flowfram}{Invalid dynamic frame IDN '\number#2'}{% + Dynamic frame IDNs go from 1 to \number\c@maxdynamic}% + \else + \setlength{\ffareax}{\dynamicframex{#2}}% + \setlength{\ffareay}{\dynamicframey{#2}}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos + \csname @df@dim@\romannumeral#2\endcsname + \setlength{\ffareawidth}{\@ff@tmp@x}% + \setlength{\ffareaheight}{\@ff@tmp@y}% + \fi \else -\setlength{\ffareax}{\dynamicframex{#2}} -\setlength{\ffareay}{\dynamicframey{#2}} -\expandafter\expandafter\expandafter -\@ff@getstaticpos -\csname @df@dim@\romannumeral#2\endcsname -\setlength{\ffareawidth}{\@ff@tmp@x}% -\setlength{\ffareaheight}{\@ff@tmp@y}% + \PackageError{flowfram}{Unknown frame ID type '#1'}{% + Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)}% +\fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@ff@getevendim} +%\changes{1.11}{2008/06/27}{new} +% Get the dimensions for the given type of frame on even pages. +% The first parameter should be a number indictating +% type of frame : 1 (flow), 2 (static), 3 (dynamic). +% The second number is its \gls{idn}. Values are stored in +% "\ffareax", "\ffareay", "\ffareawidth" and "\ffareaheight". +% \begin{macrocode} +\newcommand*{\@ff@getevendim}[2]{% +\ifnum#2<1\relax + \PackageError{flowfram}{Frame IDNs start from 1}{% + You have specified a frame IDN of '\number#2'}% \fi +\ifcase#1\relax + \PackageError{flowfram}{Unknown frame ID type '#1'}{% + Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} +\or + \ifnum#2>\c@maxflow + \PackageError{flowfram}{Invalid flow frame IDN '\number#2'}{% + Flow frame IDNs go from 1 to \number\c@maxflow}% + \else + \setlength{\ffareax}{\flowframeevenx{#2}}% + \setlength{\ffareay}{\flowframeeveny{#2}}% + \setlength{\ffareawidth}{\flowframewidth{#2}}% + \setlength{\ffareaheight}{\flowframeheight{#2}}% + \fi +\or + \ifnum#2>\c@maxstatic\relax + \PackageError{flowfram}{Invalid static frame IDN '\number#2'}{% + Static frame IDNs go from 1 to \number\c@maxstatic}% + \else + \setlength{\ffareax}{\staticframeevenx{#2}}% + \setlength{\ffareay}{\staticframeeveny{#2}}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos + \csname @sf@dim@\romannumeral#2\endcsname + \setlength{\ffareawidth}{\@ff@tmp@x}% + \setlength{\ffareaheight}{\@ff@tmp@y}% + \fi +\or + \ifnum#2>\c@maxdynamic\relax + \PackageError{flowfram}{Invalid dynamic frame IDN '\number#2'}{% + Dynamic frame IDNs go from 1 to \number\c@maxdynamic}% + \else + \setlength{\ffareax}{\dynamicframeevenx{#2}}% + \setlength{\ffareay}{\dynamicframeeveny{#2}}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos + \csname @df@dim@\romannumeral#2\endcsname + \setlength{\ffareawidth}{\@ff@tmp@x}% + \setlength{\ffareaheight}{\@ff@tmp@y}% + \fi \else -\PackageError{flowfram}{Unknown frame ID type '#1'}{% -Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} + \PackageError{flowfram}{Unknown frame ID type '#1'}{% + Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} \fi } % \end{macrocode} %\end{macro} +% %\begin{macro}{\getstaticbounds} % Convenience method for calling the above. Firstly for static % frames: @@ -2444,10 +2766,36 @@ Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} %\end{macro} %\begin{macro}{\@getstaticbounds} % Unstarred version (specify by \gls{idn}): +%\changes{1.11}{2008/06/27}{fixed bug: changed frame id from +% 1 to 2 (thanks to Lutz Goldmann for pointing it out)} +% \begin{macrocode} +\newcommand*{\@getstaticbounds}[1]{\@ff@getdim{2}{#1}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\getstaticevenbounds} +%\changes{1.11}{2008/06/27}{new} +% Even pages +% \begin{macrocode} +\newcommand*{\getstaticevenbounds}{% +\@ifstar\@sgetstaticevenbounds\@getstaticevenbounds} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@sgetstaticevenbounds} +% Starred version (specify by \gls{idl}): +% \begin{macrocode} +\newcommand*{\@sgetstaticevenbounds}[1]{% +\@staticframeid{#1}\@getstaticevenbounds{\ff@id}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@getstaticevenbounds} +%\changes{1.11}{2008/06/27}{new} +% Unstarred version (specify by \gls{idn}): % \begin{macrocode} -\newcommand*{\@getstaticbounds}[1]{\@ff@getdim{1}{#1}} +\newcommand*{\@getstaticevenbounds}[1]{\@ff@getevendim{2}{#1}} % \end{macrocode} %\end{macro} +% %\begin{macro}{\getflowbounds} % Next flow frames: % \begin{macrocode} @@ -2464,10 +2812,36 @@ Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} %\end{macro} %\begin{macro}{\@getflowbounds} % Unstarred version (specify by \gls{idn}): +%\changes{1.11}{2008/06/27}{fixed bug: changed frame id from +% 2 to 1 (thanks to Lutz Goldmann for pointing it out)} +% \begin{macrocode} +\newcommand*{\@getflowbounds}[1]{\@ff@getdim{1}{#1}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\getflowevenbounds} +%\changes{1.11}{2008/06/27}{new} +% Even pages: +% \begin{macrocode} +\newcommand*{\getflowevenbounds}{% +\@ifstar\@sgetflowevenbounds\@getflowevenbounds} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@sgetflowevenbounds} +%\changes{1.11}{2008/06/27}{new} +% Starred version (specify by \gls{idl}): +% \begin{macrocode} +\newcommand*{\@sgetflowevenbounds}[1]{% +\@flowframeid{#1}\@getflowevenbounds{\ff@id}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@getflowevenbounds} +%\changes{1.11}{2008/06/27}{new} +% Unstarred version (specify by \gls{idn}): % \begin{macrocode} -\newcommand*{\@getflowbounds}[1]{\@ff@getdim{2}{#1}} +\newcommand*{\@getflowevenbounds}[1]{\@ff@getevendim{1}{#1}} % \end{macrocode} %\end{macro} +% %\begin{macro}{\getdynamicbounds} % Next dynamic frames: % \begin{macrocode} @@ -2489,6 +2863,853 @@ Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} % \end{macrocode} %\end{macro} % +%\begin{macro}{\getdynamicevenbounds} +% Even pages: +% \begin{macrocode} +\newcommand*{\getdynamicevenbounds}{% +\@ifstar\@sgetdynamicevenbounds\@getdynamicevenbounds} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@sgetdynamicevenbounds} +% Starred version (specify by \gls{idl}): +% \begin{macrocode} +\newcommand*{\@sgetdynamicevenbounds}[1]{% +\@dynamicframeid{#1}\@getdynamicevenbounds{\ff@id}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@getdynamicevenbounds} +% Unstarred version (specify by \gls{idn}): +% \begin{macrocode} +\newcommand*{\@getdynamicevenbounds}[1]{\@ff@getevendim{3}{#1}} +% \end{macrocode} +%\end{macro} +% +% \subsection{Determining the relative location of one frame from +% another} +%\changes{1.11}{2008/06/27}{added relative location commands} +% The commands in this section set the following boolean variables: +% \begin{macrocode} +\newif\ifFLFabove +\newif\ifFLFbelow +\newif\ifFLFleft +\newif\ifFLFright +% \end{macrocode} +% These can then be used after one of the \cs{checkifframe}\meta{loc} +% commands defined below. For example: +%\begin{verbatim} +%\checkifframeabove{static}{1}{flow}{1} +%\ifFLFabove +% Static frame is above flow frame. +%\else +% Static frame isn't above flow frame. +%\fi +%\end{verbatim} +% +%\begin{macro}{\checkifframeabove} +%\changes{1.11}{2008/06/27}{new} +%\cs{checkifframeabove}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% +% Checks if the first frame is above the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2}. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be above the +% second frame if they overlap. This code checks the page number to +% determine whether to use \cs{oddcheckifframeabove} or +% \cs{evencheckifframeabove} so it should not be used in the +% first paragraph of the first \gls{flow} on the page if the paragraph +% spans the page break. +% \begin{macrocode} +\newcommand*{\checkifframeabove}{% +\@ifstar\@scheckifframeabove\@checkifframeabove} +% \end{macrocode} +% Starred version: +% \begin{macrocode} +\newcommand*{\@scheckifframeabove}[4]{% +\ifodd\c@page + \@soddcheckifframeabove{#1}{#2}{#3}{#4}% +\else + \@sevencheckifframeabove{#1}{#2}{#3}{#4}% +\fi} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@checkifframeabove}[4]{% +\ifodd\c@page + \@oddcheckifframeabove{#1}{#2}{#3}{#4}% +\else + \@evencheckifframeabove{#1}{#2}{#3}{#4}% +\fi} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\oddcheckifframeabove} +%\changes{1.11}{2008/06/27}{new} +%\cs{oddcheckifframeabove}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Checks if the first frame is above the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2} for odd pages. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be above the +% second frame if they overlap. +% \begin{macrocode} +\newcommand*{\oddcheckifframeabove}{% +\@ifstar\@soddcheckifframeabove\@oddcheckifframeabove} +% \end{macrocode} +% The starred version +% \begin{macrocode} +\newcommand*{\@soddcheckifframeabove}[4]{% +\@ifundefined{@sget#1bounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#1bounds\endcsname{#2}% +\edef\@ff@check{\the\ffareay}% +\@ifundefined{@sget#3bounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#3bounds\endcsname{#4}% +\advance\ffareay by \ffareaheight\relax +\expandafter\ifdim\@ff@check>\ffareay + \FLFabovetrue +\else + \FLFabovefalse +\fi +} +% \end{macrocode} +% The unstarred version +% \begin{macrocode} +\newcommand*{\@oddcheckifframeabove}[4]{% +\@ifundefined{@get#1bounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#1bounds\endcsname{#2}% +\edef\@ff@check{\the\ffareay}% +\@ifundefined{@get#3bounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#3bounds\endcsname{#4}% +\advance\ffareay by \ffareaheight\relax +\expandafter\ifdim\@ff@check>\ffareay + \FLFabovetrue +\else + \FLFabovefalse +\fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\checkifframebelow} +%\changes{1.11}{2008/06/27}{new} +%\cs{checkifframebelow}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Checks if the first frame is below the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2}. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be below the +% second frame if they overlap. This code checks the page number to +% determine whether to use \cs{oddcheckifframebelow} or +% \cs{evencheckifframebelow} so it should not be used in the +% first paragraph of the first \gls{flow} on the page if the paragraph +% spans the page break. +% \begin{macrocode} +\newcommand*{\checkifframebelow}{% +\@ifstar\@scheckifframebelow\@checkifframebelow} +% \end{macrocode} +% Starred version: +% \begin{macrocode} +\newcommand*{\@scheckifframebelow}[4]{% +\ifodd\c@page + \@soddcheckifframebelow{#1}{#2}{#3}{#4}% +\else + \@sevencheckifframebelow{#1}{#2}{#3}{#4}% +\fi} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@checkifframebelow}[4]{% +\ifodd\c@page + \@oddcheckifframebelow{#1}{#2}{#3}{#4}% +\else + \@evencheckifframebelow{#1}{#2}{#3}{#4}% +\fi} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\oddcheckifframebelow} +%\changes{1.11}{2008/06/27}{new} +%\cs{oddcheckifframebelow}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% +% Checks if the first frame is below the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2} on odd pages. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be below the +% second frame if they overlap. +% \begin{macrocode} +\newcommand*{\oddcheckifframebelow}{% +\@ifstar\@soddcheckifframebelow\@oddcheckifframebelow} +% \end{macrocode} +% The starred version +% \begin{macrocode} +\newcommand*{\@soddcheckifframebelow}[4]{% +\@ifundefined{@sget#1bounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#1bounds\endcsname{#2}% +\advance\ffareay by \ffareaheight\relax +\edef\@ff@check{\the\ffareay}% +\@ifundefined{@sget#3bounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#3bounds\endcsname{#4}% +\expandafter\ifdim\@ff@check<\ffareay + \FLFbelowtrue +\else + \FLFbelowfalse +\fi +} +% \end{macrocode} +% The unstarred version +% \begin{macrocode} +\newcommand*{\@oddcheckifframebelow}[4]{% +\@ifundefined{@get#1bounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#1bounds\endcsname{#2}% +\advance\ffareay by \ffareaheight\relax +\edef\@ff@check{\the\ffareay}% +\@ifundefined{@get#3bounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#3bounds\endcsname{#4}% +\expandafter\ifdim\@ff@check<\ffareay + \FLFbelowtrue +\else + \FLFbelowfalse +\fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\checkifframeleft} +%\changes{1.11}{2008/06/27}{new} +%\cs{checkifframeleft}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Checks if the first frame is to the left of the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2}. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be to the +% left of the second frame if they overlap. This code checks the page number to +% determine whether to use \cs{oddcheckifframeleft} or +% \cs{evencheckifframeleft} so it should not be used in the +% first paragraph of the first \gls{flow} on the page if the paragraph +% spans the page break. +% \begin{macrocode} +\newcommand*{\checkifframeleft}{% +\@ifstar\@scheckifframeleft\@checkifframeleft} +% \end{macrocode} +% Starred version: +% \begin{macrocode} +\newcommand*{\@scheckifframeleft}[4]{% +\ifodd\c@page + \@soddcheckifframeleft{#1}{#2}{#3}{#4}% +\else + \@sevencheckifframeleft{#1}{#2}{#3}{#4}% +\fi} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@checkifframeleft}[4]{% +\ifodd\c@page + \@oddcheckifframeleft{#1}{#2}{#3}{#4}% +\else + \@evencheckifframeleft{#1}{#2}{#3}{#4}% +\fi} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\oddcheckifframeleft} +%\changes{1.11}{2008/06/27}{new} +%\cs{oddcheckifframeleft}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% +% Checks if the first frame is to the left of the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2} on odd pages. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be to the +% left of the second frame if they overlap. +% \begin{macrocode} +\newcommand*{\oddcheckifframeleft}{% +\@ifstar\@soddcheckifframeleft\@oddcheckifframeleft} +% \end{macrocode} +% The starred version +% \begin{macrocode} +\newcommand*{\@soddcheckifframeleft}[4]{% +\@ifundefined{@sget#1bounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#1bounds\endcsname{#2}% +\advance\ffareax by \ffareawidth\relax +\edef\@ff@check{\the\ffareax}% +\@ifundefined{@sget#3bounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#3bounds\endcsname{#4}% +\expandafter\ifdim\@ff@check<\ffareax + \FLFlefttrue +\else + \FLFleftfalse +\fi +} +% \end{macrocode} +% The unstarred version +% \begin{macrocode} +\newcommand*{\@oddcheckifframeleft}[4]{% +\@ifundefined{@get#1bounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#1bounds\endcsname{#2}% +\advance\ffareax by \ffareawidth\relax +\edef\@ff@check{\the\ffareax}% +\@ifundefined{@get#3bounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#3bounds\endcsname{#4}% +\expandafter\ifdim\@ff@check<\ffareax + \FLFlefttrue +\else + \FLFleftfalse +\fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\checkifframeright} +%\changes{1.11}{2008/06/27}{new} +%\cs{checkifframeright}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Checks if the first frame is to the right of the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2}. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be to the +% right of the second frame if they overlap. This code checks the page number to +% determine whether to use \cs{oddcheckifframeright} or +% \cs{evencheckifframeright} so it should not be used in the +% first paragraph of the first \gls{flow} on the page if the paragraph +% spans the page break. +% \begin{macrocode} +\newcommand*{\checkifframeright}{% +\@ifstar\@scheckifframeright\@checkifframeright} +% \end{macrocode} +% Starred version: +% \begin{macrocode} +\newcommand*{\@scheckifframeright}[4]{% +\ifodd\c@page + \@soddcheckifframeright{#1}{#2}{#3}{#4}% +\else + \@sevencheckifframeright{#1}{#2}{#3}{#4}% +\fi} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@checkifframeright}[4]{% +\ifodd\c@page + \@oddcheckifframeright{#1}{#2}{#3}{#4}% +\else + \@evencheckifframeright{#1}{#2}{#3}{#4}% +\fi} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\oddcheckifframeright} +%\changes{1.11}{2008/06/27}{new} +%\cs{oddcheckifframeright}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% +% Checks if the first frame is to the right of the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2} on odd pages. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be to the +% right of the second frame if they overlap. +% \begin{macrocode} +\newcommand*{\oddcheckifframeright}{% +\@ifstar\@soddcheckifframeright\@oddcheckifframeright} +% \end{macrocode} +% The starred version +% \begin{macrocode} +\newcommand*{\@soddcheckifframeright}[4]{% +\@ifundefined{@sget#1bounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#1bounds\endcsname{#2}% +\edef\@ff@check{\the\ffareax}% +\@ifundefined{@sget#3bounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#3bounds\endcsname{#4}% +\advance\ffareax by \ffareawidth\relax +\expandafter\ifdim\@ff@check>\ffareax + \FLFrighttrue +\else + \FLFrightfalse +\fi +} +% \end{macrocode} +% The unstarred version +% \begin{macrocode} +\newcommand*{\@oddcheckifframeright}[4]{% +\@ifundefined{@get#1bounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#1bounds\endcsname{#2}% +\edef\@ff@check{\the\ffareax}% +\@ifundefined{@get#3bounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#3bounds\endcsname{#4}% +\advance\ffareax by \ffareawidth\relax +\expandafter\ifdim\@ff@check>\ffareax + \FLFrighttrue +\else + \FLFrightfalse +\fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\evencheckifframeabove} +%\changes{1.11}{2008/06/27}{new} +%\cs{evencheckifframeabove}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Checks if the first frame is above the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2} for even pages. +% The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be above the +% second frame if they overlap. +% \begin{macrocode} +\newcommand*{\evencheckifframeabove}{% +\@ifstar\@sevencheckifframeabove\@evencheckifframeabove} +% \end{macrocode} +% The starred version +% \begin{macrocode} +\newcommand*{\@sevencheckifframeabove}[4]{% +\@ifundefined{@sget#1evenbounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#1evenbounds\endcsname{#2}% +\edef\@ff@check{\the\ffareay}% +\@ifundefined{@sget#3evenbounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#3evenbounds\endcsname{#4}% +\advance\ffareay by \ffareaheight\relax +\expandafter\ifdim\@ff@check>\ffareay + \FLFabovetrue +\else + \FLFabovefalse +\fi +} +% \end{macrocode} +% The unstarred version +% \begin{macrocode} +\newcommand*{\@evencheckifframeabove}[4]{% +\@ifundefined{@get#1evenbounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#1evenbounds\endcsname{#2}% +\edef\@ff@check{\the\ffareay}% +\@ifundefined{@get#3evenbounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#3evenbounds\endcsname{#4}% +\advance\ffareay by \ffareaheight\relax +\expandafter\ifdim\@ff@check>\ffareay + \FLFabovetrue +\else + \FLFabovefalse +\fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\evencheckifframebelow} +%\changes{1.11}{2008/06/27}{new} +%\cs{checkifframebelow}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Checks if the first frame is below the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2}. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be below the +% second frame if they overlap. +% \begin{macrocode} +\newcommand*{\evencheckifframebelow}{% +\@ifstar\@sevencheckifframebelow\@evencheckifframebelow} +% \end{macrocode} +% The starred version +% \begin{macrocode} +\newcommand*{\@sevencheckifframebelow}[4]{% +\@ifundefined{@sget#1evenbounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#1evenbounds\endcsname{#2}% +\advance\ffareay by \ffareaheight\relax +\edef\@ff@check{\the\ffareay}% +\@ifundefined{@sget#3evenbounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#3evenbounds\endcsname{#4}% +\expandafter\ifdim\@ff@check<\ffareay + \FLFbelowtrue +\else + \FLFbelowfalse +\fi +} +% \end{macrocode} +% The unstarred version +% \begin{macrocode} +\newcommand*{\@evencheckifframebelow}[4]{% +\@ifundefined{@get#1evenbounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#1evenbounds\endcsname{#2}% +\advance\ffareay by \ffareaheight\relax +\edef\@ff@check{\the\ffareay}% +\@ifundefined{@get#3evenbounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#3evenbounds\endcsname{#4}% +\expandafter\ifdim\@ff@check<\ffareay + \FLFbelowtrue +\else + \FLFbelowfalse +\fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\evencheckifframeleft} +%\changes{1.11}{2008/06/27}{new} +%\cs{evencheckifframeleft}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Checks if the first frame is to the left of the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2}. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be to the +% left of the second frame if they overlap. +% \begin{macrocode} +\newcommand*{\evencheckifframeleft}{% +\@ifstar\@sevencheckifframeleft\@evencheckifframeleft} +% \end{macrocode} +% The starred version +% \begin{macrocode} +\newcommand*{\@sevencheckifframeleft}[4]{% +\@ifundefined{@sget#1evenbounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#1evenbounds\endcsname{#2}% +\advance\ffareax by \ffareawidth\relax +\edef\@ff@check{\the\ffareax}% +\@ifundefined{@sget#3evenbounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#3evenbounds\endcsname{#4}% +\expandafter\ifdim\@ff@check<\ffareax + \FLFlefttrue +\else + \FLFleftfalse +\fi +} +% \end{macrocode} +% The unstarred version +% \begin{macrocode} +\newcommand*{\@evencheckifframeleft}[4]{% +\@ifundefined{@get#1evenbounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#1evenbounds\endcsname{#2}% +\advance\ffareax by \ffareawidth\relax +\edef\@ff@check{\the\ffareax}% +\@ifundefined{@get#3evenbounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#3evenbounds\endcsname{#4}% +\expandafter\ifdim\@ff@check<\ffareax + \FLFlefttrue +\else + \FLFleftfalse +\fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\evencheckifframeright} +%\changes{1.11}{2008/06/27}{new} +%\cs{evencheckifframeright}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Checks if the first frame is to the right of the second frame where the +% first frame is of type \meta{type1} with \gls{idn} given by +% \meta{id1} and the second frame is of type \meta{type2} with \gls{idn} +% given by \meta{id2}. The starred version uses the \gls{idl} instead +% of the \gls{idn}. The first frame is not considered to be to the +% right of the second frame if they overlap. +% \begin{macrocode} +\newcommand*{\evencheckifframeright}{% +\@ifstar\@sevencheckifframeright\@evencheckifframeright} +% \end{macrocode} +% The starred version +% \begin{macrocode} +\newcommand*{\@sevencheckifframeright}[4]{% +\@ifundefined{@sget#1evenbounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#1evenbounds\endcsname{#2}% +\edef\@ff@check{\the\ffareax}% +\@ifundefined{@sget#3evenbounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @sget#3evenbounds\endcsname{#4}% +\advance\ffareax by \ffareawidth\relax +\expandafter\ifdim\@ff@check>\ffareax + \FLFrighttrue +\else + \FLFrightfalse +\fi +} +% \end{macrocode} +% The unstarred version +% \begin{macrocode} +\newcommand*{\@evencheckifframeright}[4]{% +\@ifundefined{@get#1evenbounds}{\PackageError{flowfram}{Unknown frame +type `#1'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#1evenbounds\endcsname{#2}% +\edef\@ff@check{\the\ffareax}% +\@ifundefined{@get#3evenbounds}{\PackageError{flowfram}{Unknown frame +type `#3'}{Frame types may only be one of: static, dynamic or +flow}}{}% +\csname @get#3evenbounds\endcsname{#4}% +\advance\ffareax by \ffareawidth\relax +\expandafter\ifdim\@ff@check>\ffareax + \FLFrighttrue +\else + \FLFrightfalse +\fi +} +% \end{macrocode} +%\end{macro} +% +% Textual labels used to indicate relative location of one frame +% to another. +%\begin{macro}{\FFaboveleft} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFaboveleft}{above left} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\FFaboveright} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFaboveright}{above right} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\FFbelowleft} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFbelowleft}{below left} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\FFbelowright} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFbelowright}{below right} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\FFleft} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFleft}{on the left} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\FFbelowright} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFright}{on the right} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\FFabove} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFabove}{above} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\FFbelow} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFbelow}{below} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\FFoverlap} +%\changes{1.11}{2008/06/27}{new} +% \begin{macrocode} +\newcommand*{\FFoverlap}{overlap} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\relativeframelocation} +%\changes{1.11}{2008/06/27}{new} +%\cs{relativeframelocation}\marg{type1}\marg{id1}\marg{type2}\marg{id2} +% Displays one of the above commands depending on the relative +% locations of the first frame to the second frame. The arguments +% \meta{id1} and \meta{id2} refer to the \gls{idn} for the unstarred +% version and to the \gls{idl} for the starred version. +% \begin{macrocode} +\DeclareRobustCommand*{\relativeframelocation}{% +\@ifstar\@srelativeframelocation\@relativeframelocation} +% \end{macrocode} +% Starred version: +% \begin{macrocode} +\newcommand*{\@srelativeframelocation}[4]{% +\@scheckifframeabove{#1}{#2}{#3}{#4}% +\@scheckifframebelow{#1}{#2}{#3}{#4}% +\@scheckifframeleft{#1}{#2}{#3}{#4}% +\@scheckifframeright{#1}{#2}{#3}{#4}% +\ifFLFabove + \ifFLFleft + \FFaboveleft + \else + \ifFLFright + \FFaboveright + \else + \FFabove + \fi + \fi +\else + \ifFLFbelow + \ifFLFleft + \FFbelowleft + \else + \ifFLFright + \FFbelowright + \else + \FFbelow + \fi + \fi + \else + \ifFLFleft + \FFleft + \else + \ifFLFright + \FFright + \else + \FFoverlap + \fi + \fi + \fi +\fi +} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@relativeframelocation}[4]{% +\@checkifframeabove{#1}{#2}{#3}{#4}% +\@checkifframebelow{#1}{#2}{#3}{#4}% +\@checkifframeleft{#1}{#2}{#3}{#4}% +\@checkifframeright{#1}{#2}{#3}{#4}% +\ifFLFabove + \ifFLFleft + \FFaboveleft + \else + \ifFLFright + \FFaboveright + \else + \FFabove + \fi + \fi +\else + \ifFLFbelow + \ifFLFleft + \FFbelowleft + \else + \ifFLFright + \FFbelowright + \else + \FFbelow + \fi + \fi + \else + \ifFLFleft + \FFleft + \else + \ifFLFright + \FFright + \else + \FFoverlap + \fi + \fi + \fi +\fi +} +% \end{macrocode} +%\end{macro} +% +% Short cut commands for \glspl{frame} of the same type. +%\begin{macro}{\reldynamicloc} +%\changes{1.11}{2008/06/27}{new} +%\cs{reldynamicloc}\marg{id1}\marg{id2} +% \begin{macrocode} +\DeclareRobustCommand*{\reldynamicloc}{% +\@ifstar\@sreldynamicloc\@reldynamicloc} +% \end{macrocode} +% Starred version: +% \begin{macrocode} +\newcommand*{\@sreldynamicloc}[2]{ +\@srelativeframelocation{dynamic}{#1}{dynamic}{#2}} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@reldynamicloc}[2]{ +\@relativeframelocation{dynamic}{#1}{dynamic}{#2}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\relstaticloc} +%\changes{1.11}{2008/06/27}{new} +%\cs{relstaticloc}\marg{id1}\marg{id2} +% \begin{macrocode} +\DeclareRobustCommand*{\relstaticloc}{% +\@ifstar\@srelstaticloc\@relstaticloc} +% \end{macrocode} +% Starred version: +% \begin{macrocode} +\newcommand*{\@srelstaticloc}[2]{ +\@srelativeframelocation{static}{#1}{static}{#2}} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@relstaticloc}[2]{ +\@relativeframelocation{static}{#1}{static}{#2}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\relflowloc} +%\changes{1.11}{2008/06/27}{new} +%\cs{relflowloc}\marg{id1}\marg{id2} +% \begin{macrocode} +\DeclareRobustCommand*{\relflowloc}{% +\@ifstar\@srelflowloc\@relflowloc} +% \end{macrocode} +% Starred version: +% \begin{macrocode} +\newcommand*{\@srelflowloc}[2]{ +\@srelativeframelocation{flow}{#1}{flow}{#2}} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@relflowloc}[2]{ +\@relativeframelocation{flow}{#1}{flow}{#2}} +% \end{macrocode} +%\end{macro} +% %\subsection{Initialise Flow Frames} %\begin{macro}{\setinitialframe} % Specify initial frame. This should be the first flow @@ -2611,32 +3832,34 @@ Frames must be defined in the preamble}#1}% %\begin{macro}{\@setcol} % Set up the output box so it has the correct dimensions for % specified \gls{flow}. This is used by the output routine. +%\changes{1.11}{2008/06/27}{added displayedframe increment} % \begin{macrocode} \newcommand{\@setcol}[1]{% \ifnum\c@maxflow<#1\relax -\PackageError{flowfram}{Can't set frame '\number#1', doesn't -exist}{}% -\else -\expandafter\global\expandafter\columnwidth -\csname colwidth\romannumeral#1\endcsname -\ifdim\hsize=\columnwidth + \PackageError{flowfram}{Can't set frame '\number#1', doesn't + exist}{}% \else - \ifusedframebreak - \else - \PackageWarning{flowfram}{Moving to flow frame of unequal -width,\MessageBreak use of \string\framebreak\space advised, -or text might not appear correctly}% - \fi -\fi -\global\usedframebreakfalse -\global\hsize\columnwidth -\expandafter\global -\expandafter\vsize\csname colheight\romannumeral#1\endcsname -\global\@colht\vsize -\global\@colroom\@colht -\global\linewidth\columnwidth -\setmargin + \expandafter\global\expandafter\columnwidth + \csname colwidth\romannumeral#1\endcsname + \ifdim\hsize=\columnwidth + \else + \ifusedframebreak + \else + \PackageWarning{flowfram}{Moving to flow frame of unequal + width,\MessageBreak use of \string\framebreak\space advised, + or text might not appear correctly}% + \fi + \fi + \global\usedframebreakfalse + \global\hsize\columnwidth + \expandafter\global + \expandafter\vsize\csname colheight\romannumeral#1\endcsname + \global\@colht\vsize + \global\@colroom\@colht + \global\linewidth\columnwidth + \setmargin \fi +\stepcounter{displayedframe}% } % \end{macrocode} %\end{macro} @@ -2744,24 +3967,27 @@ or text might not appear correctly}% \global\let\@@if@newlist\if@newlist \global\@newlistfalse\@parboxrestore \shipout\vbox{\set@typeset@protect - \aftergroup - \endgroup - \aftergroup - \set@typeset@protect - \reset@font\normalsize\normalsfcodes - \let\label\@gobble - \let\index\@gobble - \let\glossary\@gobble - \baselineskip\z@skip - \lineskip\z@skip - \lineskiplimit\z@ + \aftergroup + \endgroup + \aftergroup + \set@typeset@protect + \reset@font\normalsize\normalsfcodes + \let\label\@gobble + \let\index\@gobble + \let\glossary\@gobble + \baselineskip\z@skip + \lineskip\z@skip + \lineskiplimit\z@ \vskip\topmargin\moveright\@themargin \vbox{% - \vskip\headheight - \vskip\headsep - \box\@outputbox - }}\global\let\if@newlist\@@if@newlist - \stepcounter{page}\let\firstmark\botmark} + \vskip\headheight + \vskip\headsep + \box\@outputbox + }}% + \global\let\if@newlist\@@if@newlist + \stepcounter{page}% + \setcounter{displayedframe}{0}% + \let\firstmark\botmark} % \end{macrocode} %\end{macro} %\begin{macro}{\makedfheaderfooter} @@ -4109,7 +5335,7 @@ adding new one}% % \meta{type}) at the top of the other frames. %\begin{macro}{\vcolumnsep} % The vertical distance between the top frames and column flow -% frames when created using "\Ncolumnhead" etc is given by: +% frames when created using "\Ncolumntop" etc is given by: % \begin{macrocode} \newlength{\vcolumnsep} \setlength{\vcolumnsep}{\columnsep} @@ -4403,7 +5629,7 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} % \cs{onecolumnbottom}\oarg{pages}\marg{type}\marg{H} % \begin{macrocode} \newcommand*{\onecolumnbottom}[3][all]{% -\onecolumnSbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} +\onecolumnbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} % \end{macrocode} %\end{macro} % This command may only be used in the preamble. @@ -5143,7 +6369,7 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} % rule that goes from the maximum height of the highest % to the minimum height of the lowest, equidistant from % both frames. Syntax:\newline -% \cs{insertvrule}\oarg{y top}\oarg{y bottom}\marg{frame1 type}\marg{IDN2}\marg{frame2 type}\meta{IDN2}. +% \cs{insertvrule}\oarg{y top}\oarg{y bottom}\marg{frame1 type}\marg{IDN1}\marg{frame2 type}\meta{IDN2}. % The starred version uses \glspl{idl} instead of \glspl{idn}. % The optional arguments indicate to continue above the highest % point by \meta{y top} or continue below the lowest point @@ -5157,6 +6383,15 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} \setlength{\ffcolumnseprule}{2pt} % \end{macrocode} %\end{macro} +%\begin{macro}{\ffruledeclarations} +%\changes{1.11}{2008/06/27}{new} +% This can be redefined to use declarations that affect how the +% rule appears. For example, it can be used to set the colour of +% the rule. +% \begin{macrocode} +\newcommand*{\ffruledeclarations}{} +% \end{macrocode} +%\end{macro} %\begin{macro}{\insertvrule} % Determine whether or not the starred version is being % used. @@ -5244,8 +6479,9 @@ or 'dynamic'}}}}% {\@ff@tmp@x}{\@ff@tmp@y}% \addtolength{\@ff@staticH}{#1}% \addtolength{\@ff@staticH}{#2}% -\setstaticcontents{\c@maxstatic}{\hfill -\rule[-#2]{\ffcolumnseprule}{\@ff@staticH}\hfill\mbox{}}% +\setstaticcontents{\c@maxstatic}{% +\ffruledeclarations +\ffvrule{#2}{\ffcolumnseprule}{\@ff@staticH}}% \ifcase#3\relax \or \edef\@ff@pages{\csname @ff@pages@\romannumeral#4\endcsname}% \or \edef\@ff@pages{\csname @sf@pages@\romannumeral#4\endcsname}% @@ -5265,6 +6501,15 @@ or 'dynamic'}}}}% } % \end{macrocode} %\end{macro} +%\begin{macro}{\ffvrule} +%\changes{1.11}{2008/06/27}{new} +%\cs{ffvrule}\marg{offset}\marg{width}\marg{height}\par +% Draws the rule for \cs{insertvrule} +% \begin{macrocode} +\newcommand*{\ffvrule}[3]{% +\hfill \rule[-#1]{#2}{#3}\hfill\mbox{}} +% \end{macrocode} +%\end{macro} %\begin{macro}{\@sinsertvrule} % Starred version. Two optional arguments required. % \begin{macrocode} @@ -5377,7 +6622,8 @@ or 'dynamic'}}}}% \addtolength{\@ff@staticW}{#1}% \addtolength{\@ff@staticW}{#2}% \setstaticcontents{\c@maxstatic}{% -\hspace*{-#1}\rule{\@ff@staticW}{\ffcolumnseprule}}% +\ffruledeclarations +\ffhrule{#1}{\@ff@staticW}{\ffcolumnseprule}}% \ifcase#3\relax \or \edef\@ff@pages{\csname @ff@pages@\romannumeral#4\endcsname}% \or \edef\@ff@pages{\csname @sf@pages@\romannumeral#4\endcsname}% @@ -5392,6 +6638,15 @@ or 'dynamic'}}}}% } % \end{macrocode} %\end{macro} +%\begin{macro}{\ffhrule} +%\changes{1.11}{2008/06/27}{new} +%\cs{ffhrule}\marg{offset}\marg{width}\marg{height}\par +% Draws the rule for \cs{inserthrule} +% \begin{macrocode} +\newcommand*{\ffhrule}[3]{% +\hspace*{-#1}\rule{#2}{#3}} +% \end{macrocode} +%\end{macro} %\begin{macro}{\@sinserthrule} % Starred version. Two optional arguments required. % \begin{macrocode} |