diff options
author | Karl Berry <karl@freefriends.org> | 2008-07-02 17:45:30 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2008-07-02 17:45:30 +0000 |
commit | b6814aa29ce2bd0832caa067247b509b8fc566aa (patch) | |
tree | ca636f4cb0e0f8f9c85de4d9cb1dfd6f4dd5757c /Master/texmf-dist/source/latex/flowfram | |
parent | 34b50d3efdaccd76772cd114b3aab830c4cf95b1 (diff) |
flowfram update (1jul08)
git-svn-id: svn://tug.org/texlive/trunk@9166 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/flowfram')
-rw-r--r-- | Master/texmf-dist/source/latex/flowfram/flowfram.dtx | 1557 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/flowfram/flowfram.ins | 4 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/flowfram/flowfram.perl | 1632 |
3 files changed, 3040 insertions, 153 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} diff --git a/Master/texmf-dist/source/latex/flowfram/flowfram.ins b/Master/texmf-dist/source/latex/flowfram/flowfram.ins index 4ba18a984e3..39d4d46d06c 100644 --- a/Master/texmf-dist/source/latex/flowfram/flowfram.ins +++ b/Master/texmf-dist/source/latex/flowfram/flowfram.ins @@ -1,10 +1,10 @@ -% flowfram.ins generated using makedtx version 0.94b 2007/8/21 13:54 +% flowfram.ins generated using makedtx version 0.94b 2008/7/1 14:05 \input docstrip \preamble flowfram.dtx - Copyright 2007 Nicola Talbot + Copyright 2008 Nicola Talbot This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 diff --git a/Master/texmf-dist/source/latex/flowfram/flowfram.perl b/Master/texmf-dist/source/latex/flowfram/flowfram.perl new file mode 100644 index 00000000000..7d7f8c23c56 --- /dev/null +++ b/Master/texmf-dist/source/latex/flowfram/flowfram.perl @@ -0,0 +1,1632 @@ +#!/usr/bin/env perl +# File : flowfram.perl +# Author : Nicola L C Talbot +# Date : 28 June 2008 +# Last Modified : 1 July 2008 +# Version : 1.0 +# Description : LaTeX2HTML implementation of the flowfram package. +# This is not meant to emulate the flowfram package. +# Most of the frame related commands are ignored, to +# provide a simple HTML version of the document. +# +# Copyright 2007 Nicola L.C. Talbot +# +# This work may be distributed and/or modified under the +# conditions of the LaTeX Project Public License, either version 1.3 +# of this license of (at your option) any later version. +# The latest version of this license is in +# http://www.latex-project.org/lppl.txt +# and version 1.3 or later is part of all distributions of LaTeX +# version 2005/12/01 or later. +# +# This work has the LPPL maintenance status `maintained'. +# +# The Current Maintainer of this work is Nicola Talbot. + +package main; + +$showstaticcontents = 0; +$showdynamiccontents = 0; + +sub do_cmd_onecolumninarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumninarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_Ncolumninarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_Ncolumn{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumntopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumntopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_Ncolumntopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_Ncolumnbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnStopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnDtopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnSbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnDbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnStopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnDtopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnSbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnDbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_NcolumnDbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_NcolumnSbottominarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumntop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumntop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_Ncolumntop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnStop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnStop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_NcolumnStop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnDtop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnDtop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_NcolumnDtop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_Ncolumnbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnSbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnSbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_NcolumnSbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_onecolumnDbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_twocolumnDbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_NcolumnDbottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_NcolumnDtopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_NcolumnStopinarea +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_makebackgroundframe +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + ($keyval,$pat) = &get_next_optional_argument; + + $_ +} + +sub do_cmd_vtwotone +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_vtwotonetop +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_vtwotonebottom +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_htwotone +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_htwotoneleft +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_htwotoneright +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_hNtone{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + $keyval,$pat = &get_next_optional_argument; + + local($n); + + $n = &missing_braces + unless(s/$next_pair_pr_rx/$n=$2;''/eo); + + for ($idx = 1; $idx <= $n; $idx++) + { + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + } + + $_; +} + +sub do_cmd_hNtoneleft{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + $keyval,$pat = &get_next_optional_argument; + + local($n); + + $n = &missing_braces + unless(s/$next_pair_pr_rx/$n=$2;''/eo); + + for ($idx = 1; $idx <= $n; $idx++) + { + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + } + + $_; +} + +sub do_cmd_hNtoneright{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + $keyval,$pat = &get_next_optional_argument; + + local($n); + + $n = &missing_braces + unless(s/$next_pair_pr_rx/$n=$2;''/eo); + + for ($idx = 1; $idx <= $n; $idx++) + { + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + } + + $_; +} + +sub do_cmd_vNtone{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + $keyval,$pat = &get_next_optional_argument; + + local($n); + + $n = &missing_braces + unless(s/$next_pair_pr_rx/$n=$2;''/eo); + + for ($idx = 1; $idx <= $n; $idx++) + { + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + } + + $_; +} + +sub do_cmd_vNtonetop{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + $keyval,$pat = &get_next_optional_argument; + + local($n); + + $n = &missing_braces + unless(s/$next_pair_pr_rx/$n=$2;''/eo); + + for ($idx = 1; $idx <= $n; $idx++) + { + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + } + + $_; +} + +sub do_cmd_vNtonebottom{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + $keyval,$pat = &get_next_optional_argument; + + local($n); + + $n = &missing_braces + unless(s/$next_pair_pr_rx/$n=$2;''/eo); + + for ($idx = 1; $idx <= $n; $idx++) + { + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + } + + $_; +} + +sub do_cmd_inserthrule{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + ($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_insertvrule{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + ($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_newflowframe +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + ($keyval,$pat) = &get_next_optional_argument; + + $_ +} + +sub do_cmd_newflowframestar +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + ($keyval,$pat) = &get_next_optional_argument; + + $_ +} + +sub do_cmd_newstaticframe +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + ($keyval,$pat) = &get_next_optional_argument; + + $_ +} + +sub do_cmd_newstaticframestar +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + ($keyval,$pat) = &get_next_optional_argument; + + $_ +} + +sub do_cmd_newdynamicframe +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + ($keyval,$pat) = &get_next_optional_argument; + + $_ +} + +sub do_cmd_newdynamicframestar +{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + ($keyval,$pat) = &get_next_optional_argument; + + $_ +} + +sub do_cmd_setflowframe +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setflowframestar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setstaticframe +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setstaticframestar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setdynamicframe +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setdynamicframestar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setalldynamicframes +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setallflowframes +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setallstaticframes +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setthumbtab +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setthumbtabindex +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_ffswapoddeven +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_ffswapoddevenstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_dfswapoddeven +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_dfswapoddevenstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_sfswapoddeven +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_sfswapoddevenstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_dfchaphead +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_dfchapheadstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_computeleftedgeodd +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_computeleftedgeeven +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_computerightedgeodd +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_computerightedgeeven +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_computebottomedge +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_computetopedge +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_appenddfminitoc +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_appenddfminitocstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_makethumbtabs +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_setstaticcontents +{ + local($_) = @_; + local($text); + + s/$next_pair_pr_rx/;''/eo; + + $text = &missing_braces + unless (s/$next_pair_pr_rx/$text=$2;''/eo); + + $text = "" unless($showstaticcontents); + + "$text$_" +} + +sub do_cmd_setstaticcontentsstar +{ + local($_) = @_; + local($text); + + s/$next_pair_pr_rx/;''/eo; + + $text = &missing_braces + unless (s/$next_pair_pr_rx/$text=$2;''/eo); + + $text = "" unless($showstaticcontents); + + "$text$_" +} + +sub do_cmd_setdynamiccontents +{ + local($_) = @_; + local($text); + + s/$next_pair_pr_rx/;''/eo; + + $text = &missing_braces + unless (s/$next_pair_pr_rx/$text=$2;''/eo); + + $text = "" unless($showdynamiccontents); + + "$text$_" +} + +sub do_cmd_setdynamiccontentsstar +{ + local($_) = @_; + local($text); + + s/$next_pair_pr_rx/;''/eo; + + $text = &missing_braces + unless (s/$next_pair_pr_rx/$text=$2;''/eo); + + $text = "" unless($showdynamiccontents); + + "$text$_" +} + +sub do_cmd_appenddynamiccontents +{ + local($_) = @_; + local($text); + + s/$next_pair_pr_rx/;''/eo; + + $text = &missing_braces + unless (s/$next_pair_pr_rx/$text=$2;''/eo); + + $text = "" unless($showdynamiccontents); + + "$text$_" +} + +sub do_cmd_appenddynamiccontentsstar +{ + local($_) = @_; + local($text); + + s/$next_pair_pr_rx/;''/eo; + + $text = &missing_braces + unless (s/$next_pair_pr_rx/$text=$2;''/eo); + + $text = "" unless($showdynamiccontents); + + "$text$_" +} + +sub do_env_staticcontents{ + local($_) = @_; + local($id); + + $id = &missing_braces + unless (s/$next_pair_rx/$id=$2,''/eo); + + local($body) = ($showstaticcontents ? $_ : ""); + + $body +} + +sub do_env_staticcontentsstar{ + local($_) = @_; + local($id); + + $id = &missing_braces + unless (s/$next_pair_rx/$id=$2,''/eo); + + local($body) = ($showstaticcontents ? $_ : ""); + + $body +} + +sub do_env_dynamiccontents{ + local($_) = @_; + local($id); + + $id = &missing_braces + unless (s/$next_pair_rx/$id=$2,''/eo); + + local($body) = ($showdynamiccontents ? $_ : ""); + + $body +} + +sub do_env_dynamiccontentsstar{ + local($_) = @_; + local($id); + + $id = &missing_braces + unless (s/$next_pair_rx/$id=$2,''/eo); + + local($body) = ($showdynamiccontents ? $_ : ""); + + $body +} + +sub do_continueonframe{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getflowid +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getstaticid +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getdynamicid +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getdynamiclabel +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getflowlabel +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getstaticlabel +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getdynamicbounds +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getdynamicboundsstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getflowbounds +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getflowboundsstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getstaticbounds +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_getstaticboundsstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_FFaboveleft{ "above left".$_[0] } +sub do_cmd_FFaboveright{ "above right".$_[0] } +sub do_cmd_FFbelowleft{ "below left".$_[0] } +sub do_cmd_FFbelowright{ "below right".$_[0] } +sub do_cmd_FFleft{ "on the left".$_[0] } +sub do_cmd_FFright{ "on the right".$_[0] } +sub do_cmd_FFabove{ "above".$_[0] } +sub do_cmd_FFbelow{ "below".$_[0] } +sub do_cmd_FFoverlap{ "overlap".$_[0] } + +sub do_cmd_ffcontinuedtextfont{ + local($_) = @_; + local($text); + + $text = &missingbraces + unless (s/$next_pair_pr_rx/$text=$2;''/eo); + + "<EM>$text</EM>$_" +} + +sub do_cmd_ffhrule{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_ffvrule{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_labelflow{ &do_cmd_label(@_) } + +sub do_cmd_labelflowid{ &do_cmd_label(@_) } + +sub do_cmd_minitocstyle{ + local($_) = @_; + local($text); + + $text = &missing_braces + unless(s/$next_pair_pr_rx/$text=$2;''/eo); + + "$text$_" +} + +sub do_cmd_relativeframelocation +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_relativeframelocationstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_reldynamicloc +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_reldynamiclocstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_relflowloc +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_relflowlocstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_relstaticloc +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_relstaticlocstar +{ + local($_) = @_; + + s/$next_pair_pr_rx/;''/eo; + s/$next_pair_pr_rx/;''/eo; + + $_ +} + +sub do_cmd_simpar{ + local($_) = @_; + + "<P>$_" +} + +sub do_env_staticfigure{ &do_env_figure(@_) } +sub do_env_statictable{ &do_env_table(@_) } + +&ignore_commands( <<_IGNORED_CMDS); +thumbtabindex +tocandthumbtabindex +enablethumbtabs +disablethumbtabs +enableminitoc +makedfheaderfooter +ffcontinuedtextlayout +fflabelfont +ffruledeclarations +ffvadjustfalse +ffvadjusttrue +flowframeshowlayout +finishthispage +framebreak +setffdraftcolor +setffdraftypeblockcolor +showframebboxfalse +showframebboxtrue +showmarginsfalse +showmarginstrue +showtypeblockfalse +showtypeblocktrue +thumbtabformat +thumbtabindexformat +_IGNORED_CMDS + +1; |