summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/flowfram
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-07-02 17:45:30 +0000
committerKarl Berry <karl@freefriends.org>2008-07-02 17:45:30 +0000
commitb6814aa29ce2bd0832caa067247b509b8fc566aa (patch)
treeca636f4cb0e0f8f9c85de4d9cb1dfd6f4dd5757c /Master/texmf-dist/source/latex/flowfram
parent34b50d3efdaccd76772cd114b3aab830c4cf95b1 (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.dtx1557
-rw-r--r--Master/texmf-dist/source/latex/flowfram/flowfram.ins4
-rw-r--r--Master/texmf-dist/source/latex/flowfram/flowfram.perl1632
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;