From b847625057328d18cbaff06505599203c8382a17 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 13 Nov 2012 00:16:56 +0000 Subject: flowfram 1.14 (12nov12) git-svn-id: svn://tug.org/texlive/trunk@28238 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/flowfram/CHANGES | 89 + Master/texmf-dist/doc/latex/flowfram/README | 6 +- .../texmf-dist/doc/latex/flowfram/ffuserguide.html | 4922 ----- .../texmf-dist/doc/latex/flowfram/ffuserguide.pdf | Bin 447019 -> 298953 bytes .../texmf-dist/doc/latex/flowfram/ffuserguide.tex | 505 +- .../doc/latex/flowfram/ffuserguideidx.ist | 3 + Master/texmf-dist/doc/latex/flowfram/flowfram.pdf | Bin 478309 -> 524458 bytes .../doc/latex/flowfram/samples/brochure.pdf | Bin 64325 -> 0 bytes .../doc/latex/flowfram/samples/brochure.tex | 362 - .../texmf-dist/doc/latex/flowfram/samples/news.pdf | Bin 29456 -> 0 bytes .../texmf-dist/doc/latex/flowfram/samples/news.tex | 204 - .../doc/latex/flowfram/samples/news2.pdf | Bin 35856 -> 0 bytes .../doc/latex/flowfram/samples/news2.tex | 231 - .../doc/latex/flowfram/samples/poster.pdf | Bin 77235 -> 0 bytes .../doc/latex/flowfram/samples/poster.tex | 363 - .../doc/latex/flowfram/samples/sample-article.pdf | Bin 0 -> 163034 bytes .../doc/latex/flowfram/samples/sample-article.tex | 283 + .../doc/latex/flowfram/samples/sample-blanks.tex | 19 + .../doc/latex/flowfram/samples/sample-brochure.pdf | Bin 0 -> 101902 bytes .../doc/latex/flowfram/samples/sample-brochure.tex | 345 + .../doc/latex/flowfram/samples/sample-news.pdf | Bin 0 -> 47959 bytes .../doc/latex/flowfram/samples/sample-news.tex | 189 + .../doc/latex/flowfram/samples/sample-news2.pdf | Bin 0 -> 52810 bytes .../doc/latex/flowfram/samples/sample-news2.tex | 217 + .../doc/latex/flowfram/samples/sample-pages.pdf | Bin 0 -> 136327 bytes .../doc/latex/flowfram/samples/sample-pages.tex | 104 + .../doc/latex/flowfram/samples/sample-poster.pdf | Bin 0 -> 91415 bytes .../doc/latex/flowfram/samples/sample-poster.tex | 355 + .../doc/latex/flowfram/samples/sample-rot.pdf | Bin 0 -> 54583 bytes .../doc/latex/flowfram/samples/sample-rot.tex | 49 + .../doc/latex/flowfram/samples/sample.pdf | Bin 0 -> 100462 bytes .../doc/latex/flowfram/samples/sample.tex | 379 + .../doc/latex/flowfram/samples/sample1.pdf | Bin 0 -> 151242 bytes .../doc/latex/flowfram/samples/sample1.tex | 305 + .../doc/latex/flowfram/samples/sample2.pdf | Bin 0 -> 142705 bytes .../doc/latex/flowfram/samples/sample2.tex | 272 + .../doc/latex/flowfram/samples/sample3.pdf | Bin 0 -> 46648 bytes .../doc/latex/flowfram/samples/sample3.tex | 65 + .../doc/latex/flowfram/samples/sampleRL.pdf | Bin 0 -> 31645 bytes .../doc/latex/flowfram/samples/sampleRL.tex | 16 + Master/texmf-dist/scripts/flowfram/flowfram.perl | 1632 ++ .../texmf-dist/source/latex/flowfram/flowfram.dtx | 19351 ++++++++++++++----- .../texmf-dist/source/latex/flowfram/flowfram.ins | 20 +- .../texmf-dist/source/latex/flowfram/flowfram.perl | 1632 -- Master/texmf-dist/tex/latex/flowfram/flowfram.sty | 10192 ++++++---- Master/tlpkg/libexec/ctan2tds | 1 - 46 files changed, 26002 insertions(+), 16109 deletions(-) delete mode 100644 Master/texmf-dist/doc/latex/flowfram/ffuserguide.html create mode 100644 Master/texmf-dist/doc/latex/flowfram/ffuserguideidx.ist delete mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/brochure.pdf delete mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/brochure.tex delete mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/news.pdf delete mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/news.tex delete mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/news2.pdf delete mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/news2.tex delete mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/poster.pdf delete mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/poster.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-article.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-article.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-blanks.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-brochure.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-brochure.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-news.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-news.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-news2.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-news2.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-pages.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-pages.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-poster.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-poster.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-rot.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample-rot.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample1.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample1.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample2.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample2.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample3.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sample3.tex create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sampleRL.pdf create mode 100644 Master/texmf-dist/doc/latex/flowfram/samples/sampleRL.tex create mode 100644 Master/texmf-dist/scripts/flowfram/flowfram.perl delete mode 100644 Master/texmf-dist/source/latex/flowfram/flowfram.perl diff --git a/Master/texmf-dist/doc/latex/flowfram/CHANGES b/Master/texmf-dist/doc/latex/flowfram/CHANGES index ab0e4aca1c3..9b2069d7880 100644 --- a/Master/texmf-dist/doc/latex/flowfram/CHANGES +++ b/Master/texmf-dist/doc/latex/flowfram/CHANGES @@ -1,5 +1,94 @@ flowfram change log +1.14 (2012/11/10) : + + * Now loads xkeyval rather than keyval + + * Now loads xfor and etoolbox + + * Added new package options: + + - verbose (mainly for debugging messages) + + - thumbtabs (key=value option replacing options "ttbtitle", + "ttbnotitle", "ttbnum" and "ttbnonum") + + - pages + + * Changed the following package options to boolean key=value + (missing value assumed "true", providing backward compatibility): + + - rotate + + - color + + * Made \usedframebreaktrue global in definition of \framebreak + + * Added \usedframebreaktrue to definition of \newpage + + * New counter: "absolutepage" (keeps track of physical page rather + than page number given by \c@page). + + * Added pre-chapter hook \ffprechapterhook + + * Added page exclusion list. + + * New commands to set page list and page exclusion list: + + - \flowsetpagelist + - \flowsetexclusion + - \flowaddexclusion + - \dynamicsetpagelist + - \dynamicsetexclusion + - \dynamicaddexclusion + - \staticsetpagelist + - \staticsetexclusion + - \staticaddexclusion + + * New commands to make it easier to switch frames on and off + on-the-fly: + + - \flowswitchonnext + - \flowswitchoffnext + - \flowswitchonnextonly + - \flowswitchoffnextonly + - \flowswitchonnextodd + - \flowswitchoffnextodd + - \flowswitchonnextoddonly + - \flowswitchoffnextoddonly + + - \dynamicswitchonnext + - \dynamicswitchoffnext + - \dynamicswitchonnextonly + - \dynamicswitchoffnextonly + - \dynamicswitchonnextodd + - \dynamicswitchoffnextodd + - \dynamicswitchonnextoddonly + - \dynamicswitchoffnextoddonly + + - \staticswitchonnext + - \staticswitchoffnext + - \staticswitchonnextonly + - \staticswitchoffnextonly + - \staticswitchonnextodd + - \staticswitchoffnextodd + - \staticswitchonnextoddonly + - \staticswitchoffnextoddonly + + - \ffaddtoadjustframeshook + + * Added \fftolerance (now only warns about moving to unequal width + frame if width difference is greater than tolerance). + + * Added optional argument to \@sf@chckifthispg and + \@df@chckifthispg + + * Bug fixes: + + - removed unwanted spaces caused by eol character + + - added check for non-void boxes. + 1.13 (2010/01/23) : * Fixed 'undefined \ffareaevenx' bug. diff --git a/Master/texmf-dist/doc/latex/flowfram/README b/Master/texmf-dist/doc/latex/flowfram/README index b67134a19de..6850d26118c 100644 --- a/Master/texmf-dist/doc/latex/flowfram/README +++ b/Master/texmf-dist/doc/latex/flowfram/README @@ -1,6 +1,6 @@ -LaTeX Package : flowfram v 1.13 +LaTeX Package : flowfram v1.14 -Last Modified : 23rd January 2010 +Last Modified : 2012-11-10 Author : Nicola Talbot @@ -46,5 +46,5 @@ frames unless other packages (such as frames.perl) are used. This material is subject to the LaTeX Project Public License. See http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html for the details of that license. -http://theoval.cmp.uea.ac.uk/~nlct/ +http://www.dickimaw-books.com/ diff --git a/Master/texmf-dist/doc/latex/flowfram/ffuserguide.html b/Master/texmf-dist/doc/latex/flowfram/ffuserguide.html deleted file mode 100644 index cc817a62f25..00000000000 --- a/Master/texmf-dist/doc/latex/flowfram/ffuserguide.html +++ /dev/null @@ -1,4922 +0,0 @@ - - - - - -Creating Flow Frames for Posters, Brochures or Magazines using flowfram.sty v 1.13 - - - - - - - - - - - - - - - -

- -

- -

Creating Flow Frames for Posters, Brochures or -Magazines using flowfram.sty v 1.13

-

Nicola L. C. Talbot

-

Date: 23rd January 2010

-

-

Key words and phrases: LaTeX; text frames; posters; brochures; magazines; newspapers

- -

- -

-Dr Nicola Talbot -
-School of Computing Sciences -
-University of East Anglia -
-Norwich. Norfolk. NR4 7TJ. -
-United Kingdom -
http://theoval.cmp.uea.ac.uk/~nlct/ -

- -

- -
- -

-Contents -

- - - - -

- -

- -

- -

-1. Introduction -

- -

- -This chapter provides a brief overview of the package, -the package options and the various frame types. -

- -

-The flowfram package is a LaTeX2e package designed to -enable you to create text frames in a document such that -the contents of the document environment flow from one -frame to the next in the order that they were defined. -This is useful for creating posters -or magazines or any other form of document that does not -conform to the standard one or two column layout. - -

-The flowfram package provides three types of frame: -flow frames, static frames and dynamic frames with dimensions and -positions specified by the -user1.1. -The main contents of the document environment flow from -one flow frame to the next in the order of definition, -whereas the contents of the static and dynamic frames -are set explicitly using commands described in -Modifying Frame -Attributes. Note that -unless otherwise stated, all co-ordinates are relative to the -bottom left hand corner of the typeblock. If you have -a two-sided document, the absolute position of the typeblock may vary depending on the values of \oddsidemargin -and \evensidemargin, and all the frames will shift -accordingly unless otherwise indicated. - -

-Since floats (such as figures and tables) can only go in -flow frames, this package provides -the additional environments: -staticfigure and -statictable which can be used in static frames and dynamic frames. Unlike their figure and -table counterparts, they are fixed in place, and -so do not take an optional placement specifier. The -\caption and \label commands can -be used within staticfigure and statictable as -usual, but remember that if the frame is displayed on multiple -pages, you may end up with multiply defined labels. - -

-The standard figure and table commands will -behave as usual in the flow frames, but their starred versions, -figure* and table* behave no differently -from figure and table1.2. - -

-This package has only been tested with a limited number of -class files and packages. Since it modifies the output routine, -it is likely to conflict with any other package which also -does this. - -

-You should load flowfram after hyperref and any -colour package (e.g. color). -

-Top | Index - -

- -

-1.1 Draft Option -

- -

-The flowfram package has the package option draft -which will draw the bounding boxes for -each frame that has been defined. At the bottom right of each -bounding box (except for the bounding box denoting the -typeblock), a marker will be shown in the form: -[T:idn;idl], where T is a single -letter denoting the frame type, idn is the identification number (IDN) for the frame and idl is the identification label (IDL) for that -frame. Values of T are: F (flow frame), -S (static frame) or D (dynamic frame). -Markers of the form: [M:idn] indicate that the -bounding box is the area taken up by the margin for flow frame with IDN idn. Note that even if a frame has been rotated, the bounding box will not be rotated. - -

-If you want to show or hide specific types of bounding -boxes, you can use one of the following commands: - -

- -

-You can see the layout for the current page (irrespective of -whether or not the draft option has been set) using -the command: - -

-\flowframeshowlayout -

- -

-The flowfram package also has the options nocolor -and norotate for previewers that can not process -colour or rotating specials. (Otherwise you may end up with -large black rectangles obscuring your text, instead of -the pale background colour you were hoping for.) -

-Top | Index - -

- -

- -
-1.2 Frame Stacking Order -

- -

-The material on each page is placed in the following order: - -

    -
  1. Each static frame defined for that page in ascending -order of IDN. - -

    -

  2. -
  3. Each flow frame defined for that page in ascending -order of IDN. - -

    -

  4. -
  5. Each dynamic frame defined for that page in ascending -order of IDN. - -

    -

  6. -
  7. Bounding boxes if the draft -package option has been used. -
  8. -
- -

-This ordering can be used to determine if you want something -to overlay or underlay everything else on the page. -Note that the frames do not interact with each other. If -you have two or more overlapping frames, the text in each -frame will not attempt to wrap around the other -frames, but will simply overwrite -them.1.3 -

-Top | Index - -

- -

-1.3 HTML -

- -

-The flowfram package now comes with a LaTeX2HTML style -file flowfram.perl. However this style file is not meant -to emulate the flowfram package, but is provided to facilitate -creating a plain HTML document from the LaTeX source. All -frame-related information is ignored. By default, the contents -of any static or -dynamic frames are ignored, but this can be changed using -

-\HTMLset{showstaticcontents}{1}
-
-to show the contents of the static frames or -
-\HTMLset{showdynamiccontents}{1}
-
-to show the contents of the dynamic frames (where \HTMLset -is defined in the html package). Note that this places the -text at the point in the document where the contents are set. -This style file does not create HTML frames. It can therefore be -used to create an accessible version of the PDF document -such as this document. -

-Top | Index - -

- -

-2. Defining New Frames -

- -

- -This chapter describes how to define new frames, and how to -identify and set frame contents. See also -Predefined -Layouts. -

- -

-Top | Index - -

- -

-2.1 Flow Frames -

- -

-The flow frame is the principle type of frame. -The text of the document environment will flow from -one frame to the next in order of definition. Each -flow frame has an associated width, height, -position on the page and optionally a border. To define -a new flow frame use: - -

-\newflowframe[page list]{width}{height}{x}{y}[label] -

-where width is the width of the frame, height is -the height of the frame, (x,y) is the -position of the bottom left hand corner of the frame relative to the bottom left hand corner of the -typeblock2.1. -The first optional argument, page list, indicates the -list of pages for which this frame is defined. - -

-A page list can either be specified by the keywords: -all, odd, even or none, or -by a comma-separated list of either individual page numbers or -page ranges. If page list is -omitted, all is assumed. -A page range can be a closed -range (e.g. 2-8) or an open range (e.g. -<10 or >5). For example: <3,5,7-11,>15 -indicates pages 1, 2, 5, 7, 8, 9, 10, 11 and all pages -greater than page 15. These page numbers refer to the value of -the page counter2.2, -so if you have a page i and a page 1, they -will both have the same layout (unless you change the -page list setting somewhere between the two pages). - -

-Each frame has its own unique IDN, -corresponding to the order in which it was defined. So the first -flow frame to be defined has IDN 1, -the second has IDN 2, and so on. This number can then -be used to identify the frame when you want to modify its -settings. Alternatively, you can assign a unique IDL to the -frame using the final optional argument label. - -

-You can retrieve the IDL for a given flow frame from its IDN using: - -

-\getflowlabel{idn} -

-Conversely, you can retrieve the IDN for a given flow frame from its IDL using: - -

-\getflowid{cmd}{idl} -

-where cmd is a control sequence which will be used to -store the frame's IDN. -For example: -

-The label for the first flow frame is ``\getflowlabel{1}''.
-The flow frame labelled ``main'' has IDN \getflowid{\myid}{main}\myid.
-
- (See also -Counters.) - -

-Note that \getflowlabel doesn't perform any check to -determine whether the supplied IDN is valid, but -\getflowid will generate an error if the supplied -IDL is undefined. - -

-By default, the flow frame will not have a border, but the -starred form - -

-\newflowframe*[page list]{width}{height}{x}{y}[label] -

-will place a plain border around the flow frame. -(See Modifying frame -attributes if you want a different border.) - -

-Note that if the document continues beyond the last -defined flow frame (for example, the flow frames have only -been defined on pages 1 to 10, but the document contains 11 -pages) then a single flow frame will be defined, -emulating one column mode for all subsequent pages. - -

-In the PDF version of this document, -I used the command -

-\newflowframe{0.6\textwidth}{\textheight}{0pt}{0pt}[main]
-
-to define the main flow frame2.3. -

-Top | Index - -

- -

- -
-2.1.1 Prematurely Ending a Flow Frame -

- -

-You can force text to move immediately to the next defined -flow frame using one of the commands: \newpage, -\pagebreak or \framebreak. -The first two work in an analogous way to the way they -work in standard two column mode. The last one, -\framebreak, is required -when a paragraph spans two flow frames of different widths, as TeX's output routine does not -adjust to the new value of \hsize until the last -paragraph of the previous frame has ended. As a -result, the end of the paragraph at the beginning of the new -flow frame retains the width of the previous flow frame. - -

-If you want to start a new page, rather than simply move to the -next frame, use the command \clearpage, -or for two-sided documents, to start on the next odd page -do \cleardoublepage. -

-Top | Index - -

- -

- -
-2.2 Static Frames -

- -

-A static frame is a rectangular area in which text neither -flows into nor flows out of.2.4 -The contents must be set explicitly, and once set, the contents -of the static frame will remain the same on each page until it is -explicitly changed. Thus, a static frame can be used, for -example, to make a company logo appear in the same place on every -page. - -

-As from version 1.03 it is now possible to have -static frames with non-rectangular contents, see -Non-Rectangular -Frames for further details. - -

-A new static frame is defined using the command: - -

-\newstaticframe[page list]{width}{height}{x}{y}[label] -

-where, as with \newflowframe, width is the width of -the frame, height is the height of the frame, -(x,y) is the position of the bottom left hand -corner of the frame relative to the bottom left hand -corner of the typeblock. The first optional argument, -page list, indicates the page list for which this -static frame should appear, and the final optional argument, -label is a unique textual IDL which you can use to -identify this frame. If no label is specified, you -can refer to this frame by its unique IDN. -The first static frame to be defined has IDN 1, the second -has IDN 2, and so on. - -

-You can retrieve the IDL for a given static frame from its IDN using: - -

-\getstaticlabel{idn} -

-Conversely, you can retrieve the IDN for a given static frame from its IDL using: - -

-\getstaticid{cmd}{idl} -

-where cmd is a control sequence which will be used to -store the frame's IDN. -For example: -

-The label for the first static frame is ``\getstaticlabel{1}''.
-The static frame labelled ``backleft'' has IDN
-\getstaticid{\myid}{backleft}\myid.
-
- -

-Note that \getstaticlabel doesn't perform any check to -determine whether the supplied IDN is valid, but -\getstaticid will generate an error if the supplied -IDL is undefined. - -

-As with \newflowframe, there is a starred version - -

-\newstaticframe*[page list]{width}{height}{x}{y}[label] -

-which will place a border around that static frame. - -

-To set the contents of a particular static frame, you can -either use the staticcontents environment: - -

-\begin{staticcontents}{IDN} -
contents -
\end{staticcontents} -

-where IDN is the unique IDN associated with -that static frame and contents is the contents of the -static frame, or you can use the -command: - -

-\setstaticcontents{IDN}{contents} -

-which will do the same thing. - -

-There are starred versions available for both the environment -and the command to enable you to identify the static frame by its associated IDL rather than its IDN: - -

-\begin{staticcontents*}{IDL} -
contents -
\end{staticcontents*} -

-or the equivalent: - -

-\setstaticcontents*{IDL}{contents} -

- -

-In the body of staticcontents or staticcontents*, -or in the second argument of \setstaticcontents -or \setstaticcontents*, you can move onto another -static frame using: - -

-\continueonframe[continuation text]{id} -

-If staticcontents* or \setstaticcontents* are -being used, id refers to the IDL of the next -static frame, otherwise id refers to the IDN of the -next static frame. -The optional argument specifies some continuation text to place -at the end of the first static frame. For example, suppose I have -defined two static frames labelled "frame1" and "frame2", then -

-\begin{staticcontents*}{frame1}
-Some text in the first frame. (Let's
-assume this frame is somewhere on the
-left half of the page.)
-\continueonframe[Continued on the right]{frame2}
-This is some text in the second frame. (Let's
-assume this frame is somewhere on the
-right half of the same page.)
-\end{staticcontents*}
-
-is equivalent to: -
-\begin{staticcontents*}{frame1}
-Some text in the first frame. (Let's
-assume this frame is somewhere on the
-left half of the page.)
-\ffcontinuedtextlayout{Continued on the right}
-\end{staticcontents*}
-\begin{staticcontents*}{frame2}\par\noindent
-This is some text in the second frame. (Let's
-assume this frame is somewhere on the
-right half of the same page.)
-\end{staticcontents*}
-
-where - -

-\ffcontinuedtextlayout{text} -

-governs how the continuation text should be displayed. The font used -to display the continuation text is given by - -

-\ffcontinuedtextfont{text} -

- -

-Note that this assumes that it should appear that no paragraph -break occurs in the transition between the two frames. If you -want a paragraph break you need to explicitly put one before -and after \continueonframe. For example: -

-\begin{staticcontents*}{frame1}
-Some text in the first frame. (Let's
-assume this frame is somewhere on the
-left half of the page.)
-
-\continueonframe[Continued on the right]{frame2}
-
-This is some text in the second frame. (Let's
-assume this frame is somewhere on the
-right half of the same page.)
-\end{staticcontents*}
-
- -

-Top | Index - -

- -

-2.2.1 Important Notes -

- -

- -

- -

-Top | Index - -

- -

- -
-2.3 Dynamic Frames -

- -

-A dynamic frame is similar to a static frame except that its contents -are re-typeset on each page. (A static frame stores its -contents in a savebox, whereas a dynamic frame stores its -contents in a macro.2.5) - -

-As from version 1.03 it is now possible to have -dynamic frames with non-rectangular contents, see -Non-Rectangular -Frames for further details. - -

-To create a new dynamic frame, use the command: - -

-\newdynamicframe[page list]{width}{height}{x}{y}[label] -

-The parameters are exactly the same as for \newflowframe -and \newstaticframe. -Again, each dynamic frame has an associated unique IDN, -starting from 1 for the first dynamic frame to be defined, and -a unique IDL can also be set using the final optional -argument label. - -

-You can retrieve the IDL for a given dynamic frame from its IDN using: - -

-\getdynamiclabel{idn} -

-Conversely, you can retrieve the IDN for a given dynamic frame from its IDL using: - -

-\getdynamicid{cmd}{idl} -

-where cmd is a control sequence which will be used to -store the frame's IDN. - -

-For example: -

-The label for the first dynamic frame is ``\getdynamiclabel{1}''.
-The dynamic frame labelled ``chaphead'' has IDN
-\getdynamicid{\myid}{chaphead}\myid.
-
- -

-Note that \getdynamiclabel doesn't perform any check to -determine whether the supplied IDN is valid, but -\getdynamicid will generate an error if the supplied -IDL is undefined. - -

-As with the other frame types, there is also a starred -version - -

-\newdynamicframe*[page list]{width}{height}{x}{y}[label] -

-which will place a plain border around the dynamic frame. -For example, in the PDF version -of this document I used the command -

-\newdynamicframe{0.38\textwidth}{\textheight}{0.62\textwidth}{0pt}[chaphead]
-
-which created a frame on the -right on odd pages and on the left on even pages. (The -position for the even pages is set using \setdynamicframe -defined in Modifying -Frame Attributes.) - -

-The contents of a dynamic frame are set using the command: - -

-\setdynamiccontents{id}{contents} -

-where id is the unique IDN associated with that -dynamic frame, and contents is the contents of the -dynamic frame. Alternatively, if you have assigned an IDL, -label, to the dynamic frame, you can use the starred -version: - -

-\setdynamiccontents*{label}{contents} -

-As with most LaTeX commands, you can't use verbatim text in -contents. - -

-As from version 1.09, the contents can also be set using the -dynamiccontents environment: - -

-\begin{dynamiccontents}{id} -
contents -
\end{dynamiccontents} -

-or the dynamiccontents* environment: - -

-\begin{dynamiccontents*}{label} -
contents -
\end{dynamiccontents*} -

-Note that you can't use verbatim text within the -dynamiccontents or dynamiccontents* environments. - -

-You can additionally append text to a dynamic frame using -either: - -

-\appenddynamiccontents{id}{contents} -

-or: - -

-\appenddynamiccontents*{label}{contents} -

- -

-If \chapter is defined, you can make the chapter titles -appear in a dynamic frame using the command - -

-\dfchaphead{IDN} -

-where IDN is the IDN of the dynamic frame. There is -also a starred version of this command if you want to -use the IDL instead of the IDN. For example, in -the PDF version of this document, I used the command: -

-\dfchaphead*{chaphead}
-
- -

-The headers and footers can be turned into dynamic frames using the command - -

-\makedfheaderfooter -

-This will create two dynamic frames with IDLs header and footer. The page style will be used as -usual, but you can then move or resize the header and footer using -\setdynamicframe (described later). - -

-In the body of dynamiccontents or dynamiccontents*, -you can move onto another dynamic frame using: - -

-\continueonframe[continuation text]{id} -

-If this command occurs within dynamiccontents*, id -refers to the IDL of the new frame, otherwise it refers -to the IDN of the new frame. -The optional argument specifies some continuation text to place -at the end of the first dynamic frame. For example, suppose I have -defined two dynamic frames labelled "frame1" and "frame2", then -

-\begin{dynamiccontents*}{frame1}
-Some text in the first frame. (Let's
-assume this frame is somewhere on the
-left half of the page.)
-\continueonframe[Continued on the right]{frame2}
-This is some text in the second frame. (Let's
-assume this frame is somewhere on the
-right half of the same page.)
-\end{dynamiccontents*}
-
-is equivalent to: -
-\begin{dynamiccontents*}{frame1}
-Some text in the first frame. (Let's
-assume this frame is somewhere on the
-left half of the page.)
-\ffcontinuedtextlayout{Continued on the right}
-\end{dynamiccontents*}
-\begin{dynamiccontents*}{frame2}\par\noindent
-This is some text in the second frame. (Let's
-assume this frame is somewhere on the
-right half of the same page.)
-\end{dynamiccontents*}
-
-where - -

-\ffcontinuedtextlayout{text} -

-governs how the continuation text should be displayed. The font used -to display the continuation text is given by - -

-\ffcontinuedtextfont{text} -

- -

-Note that this assumes that it should appear that no paragraph -break occurs in the transition between the two frames. If you -want a paragraph break you need to explicitly put one before -and after \continueonframe. For example: -

-\begin{dynamiccontents*}{frame1}
-Some text in the first frame. (Let's
-assume this frame is somewhere on the
-left half of the page.)
-
-\continueonframe[Continued on the right]{frame2}
-
-This is some text in the second frame. (Let's
-assume this frame is somewhere on the
-right half of the same page.)
-\end{dynamiccontents*}
-
- -

-Top | Index - -

- -

-2.3.1 Important Notes -

- -

- -

- -

-Top | Index - -

- -

- -
-3. Modifying Frame Attributes -

- -

- -This chapter describes how to modify frame attributes, -such as the size and location. -

- -

-Once you have defined the flow frames, static frames and -dynamic frames, their attributes can be changed. The three types of -frame mostly have the same set of attributes, but some are -specific to a certain type. - -

-Flow frame attributes are modified using -either the command: - -

-\setflowframe{idn list}{key-val list} -

-or the starred version: - -

-\setflowframe*{label list}{key-val list} -

-or the attributes for all flow frames can be set using: - -

-\setallflowframes{key-val list} -

-Static frame attributes are modified using either the command: - -

-\setstaticframe{idn list}{key-val list} -

-or the starred version: - -

-\setstaticframe*{label list}{key-val list} -

-or the attributes for all static frames can be set using: - -

-\setallstaticframes{key-val list} -

-Dynamic frame attributes are modified using either the command: - -

-\setdynamicframe{idn list}{key-val list} -

-or the starred version: - -

-\setdynamicframe*{label list}{key-val list} -

-or the attributes for all dynamic frames can be set using: - -

-\setalldynamicframes{key-val list} -

- -

-In each of the above, idn list can either be one of the -keywords: all, odd or even (indicating -all frames of that type, frames of that type whose -IDN is odd or frames of that type whose IDN is even) or it can be a comma-separated list of ID numbers, or -IDN ranges. - -

-For the starred versions, label list should be -a comma-separated list of IDLs. Note that you can't use the -above keywords or have ranges in label list. - -

-The key-val list argument must be a comma-separated -list of key=value pairs, indicating which -attributes to modify. The available values are as follows: - -

-

-
width=length
-
The width of the frame. - -

-

-
height=length
-
The height of the frame. - -

-

-
x=length
-
The x-coordinate of the frame for all pages on which it is defined. - -

-

-
y=length
-
The y-coordinate of the frame for all pages on which it is defined. - -

-

-
evenx=length
-
The x-coordinate of the -frame for all even pages on which it is defined, but only if -the document is a two-sided document. - -

-For example, in the PDF version of -this document, I used the commands -

-\setflowframe*{main}{evenx=0.4\textwidth}
-\setdynamicframe*{chaphead}{evenx=0pt}
-
-to switch the positions of the flow frame and dynamic frame containing the document text and chapter headings, respectively, -on even pages. - -

-You can swap the odd and even values using the commands: - -

-\ffswapoddeven{IDN} -

-(for flow frames) - -

-\sfswapoddeven{IDN} -

-(for static frames) or - -

-\dfswapoddeven{IDN} -

-(for dynamic frames). These -commands all have starred versions which take the frame's -IDL instead of its IDN. - -

-

-
eveny=length
-
The y-coordinate of the -frame for all even pages on which it is defined, but only if -the document is a two-sided document. - -

-

-
oddx=length
-
The x-coordinate of the -frame for all odd pages on which it is defined, if the -document is two-sided. - -

-

-
oddy=length
-
The y-coordinate of the -frame for all odd pages on which it is defined, -if the document is two-sided. - -

-

-
valign=pos
-
Change the vertical alignment -of material inside a static or dynamic frame. The value pos -may be one of: c, t or b. -The default for static frames is c, the default -for dynamic frames is t. -This key is not available for flow frames. - -

-

-
label=text
-
Assign an IDL to the frame. -(If you do not specify a label when you first define a frame it will be given a label identical to its IDN.) This key is -provided to allow the user to label frames that have been -generated by certain predefined layout commands described -in Predefined -Layouts. - -

-

-
border=style
-
The style of the border around the -frame, this can take the values: none (no border), -plain (plain border) or the name of a LaTeX -frame making command without the preceding backslash. (I admit -the notation is a little confusing, a frame making command is a command that places some kind of border around its -argument, such as \fbox, or if you are using the -fancybox package: \doublebox, \ovalbox, -\Ovalbox and \shadowbox.) -The value fbox is equivalent to plain. - -

-For example, to make the first static frame have an oval border: -

-\setstaticframe{1}{border=ovalbox}
-
-Or you can define your own border: -
-\newcommand{\greenyellowbox}[1]{\fcolorbox{green}{yellow}{#1}}
-\setstaticframe{1}{border=greenyellowbox}
-
- -

-This next example uses the tikz package to define a fancy -frame, so you need to use: -

-\usepackage{tikz}
-\usetikzlibrary{snakes}
-
-The border command is defined as follows: -
-\newlength\fancywidth
-\newlength\fancyheight
-\newlength\fancydepth
-
-\newcommand{\fancyborder}[1]{%
-\settowidth{\fancywidth}{#1}%
-\settoheight{\fancyheight}{#1}%
-\settodepth{\fancydepth}{#1}%
-\addtolength{\fancyheight}{\fancydepth}%
-\hspace{-\flowframesep}%
-\tikz[baseline=0pt]{%
-\draw[snake=bumps,raise snake=\flowframesep,
-      line width=\flowframerule]
-  (0pt,0pt) rectangle (\fancywidth,\fancyheight);
-}}
-
-This makes a bumpy border, but it uses \flowframesep to -determine the gap between the border and the text and uses -\flowframerule to set the line width. This ensures that -the offset (see below) is correctly computed. - -

-This new border can now be applied to a frame: -

-\setstaticframe{1}{border=fancyborder}
-
- -

-

-
offset=offset
-
The border offset, if it is a -user-defined border. This is the distance from the outer -edge of the left hand border to the left edge of the -bounding box of the text inside the border. The flowfram -package is able to compute the border for the following -known frame making commands: \fbox, \ovalbox, -\Ovalbox, \doublebox and \shadowbox. -For all other borders, the offset is assumed to be --\flowframesep-\flowframerule. -If you define your own frame making command, you may need to -specify the offset explicitly, or the flow/static/dynamic frames -may end up shifted to the right or left. - -

-The above examples can compute their own offsets, however, -if you were to do, for example: -

-\newcommand{\thickgreenyellowbox}[1]{%
-{\setlength{\fboxsep}{5pt}\setlength{\fboxrule}{6pt}%
-\fcolorbox{green}{yellow}{#1}}}
-
-Then you would have to specify the offset. In this example, -the offset is -5pt-6pt=-11pt, -so you would need to do: -
-\setstaticframe{1}{border=thickgreenyellowbox,offset=-11pt}
-
- -

-

-
bordercolor=colour
-
The colour of the border -if you are using a standard frame making command. -The colour can either be specified as, e.g. green, -or including the colour model, e.g. [rgb]{0,1,0}. -For example: -
-\setallflowframes{border=doublebox,bordercolor=[rgb]{1,0,0.5}}
-
- -

-

-
textcolor=colour
-
The text colour for that -frame. Again, the colour can either be specified as, -e.g. green, or including the colour model, -e.g. [rgb]{0,1,0}. - -

-

-
backcolor=colour
-
The background colour for -that frame. Again, the colour can either be specified as, -e.g. green, or including the colour model, -e.g. [rgb]{0,1,0}. Note that the background colour -only extends as far as the bounding box, not the border. -If you want it to extend as far as the border, you -will need to define your own border type (see above). - -

-

-
pages=page list
-
The list of -pages for which the frame should appear. This can either have -the values: all, even, odd or none -(the latter removes the frame from that point on--useful if you -have multiple pages with the same number), or it can be a -comma-separated list of single pages, or -page ranges. -For example: -
-\setdynamicframe{1}{pages=1,5,8-10}
-
- -

-

-
margin=side
-
The side of -the flow frame that its corresponding margin should go on. This -can take the values left, right, -inner or outer. This setting is only available -for flow frames. - -

-

-
clear=boolean
-
If this value is set, the static or dynamic frame will be -cleared at the start of the -next page, otherwise it will only be cleared on the next -occurrence of \setstaticcontents or the -staticcontents environment, or the -\setdynamiccontents, depending on the frame type. -This value is not set by default. This setting is not -available for flow frames. - -

-For example, in the PDF version of this document, I -prevented the chapter heading reappearing on every page using -the command: -

-\setdynamicframe*{chaphead}{clear}
-
- -

-If you want to put \label in a static or dynamic frame, you -should use the clear key to prevent the label from being -multiply defined. - -

-

-
style=cmd
-
This should be -the name of a command without the preceding backslash, -to be applied to the contents of the specified dynamic frame. -The command may either be a declaration, for example: -
-\setalldynamicframes{style=large}
-
-which will set the contents of all the dynamic frames in a -large font, or it can be a command that takes a single argument, -for example: -
-\setalldynamicframes{style=textbf}
-
-which will make the text for all the dynamic frames come out in -bold. To unset a style, do style=none. -This setting is only available for dynamic frames. - -

-

-
angle=n
-
Rotate the contents of the -frame by n degrees (new to -version 1.02). Note that the bounding boxes will not -appear rotated. - -

-

-
shape=shape command
-
Define a shape for -the contents of a static frame or dynamic frame (new -to version 1.03). If shape command is \relax, no -paragraph shape will be applied. See -Non-Rectangular -Frames for further details. -
-
- -

-Top | Index - -

- -

- -
-3.1 Non-Rectangular Frames -

- -

-As from version 1.03, it is now possible to specify -non-rectangular static or -dynamic frames (but not flow frames). Note -that the -bounding box will still appear as a rectangle despite the -frame's shape setting. You may use either TeX's -\parshape command, or the \shapepar -command defined in Donald Arseneau's shapepar -package (if using \shapepar, remember to include -the shapepar package.) - -

-Note that it is better to use \parshape instead -of \shapepar as the latter is more restrictive and -requires more processing. However, \shapepar provides -greater flexibility in the type of shape that can be used. -

-
\parshape
-
With \parshape you can not have cut-outs in the middle, -top or bottom of a frame, however it is possible to have cut-outs -in the left or right side of the frame. When used with the -shape key for static or dynamic frames, the effects of -\par and the sectioning commands are modified to allow -the paragraph shape to extend beyond a single paragraph, and -to allow sectioning commands (but not \chapter -or \part). - -

-

-
\shapepar
-
With \shapepar you may -have cut-outs, but you may not have any sectioning commands, -paragraph breaks, vertical spacing or mathematics. You can -simulate a paragraph break using \simpar, but this -is not recommended. The size of the shape depends on the -amount of text, so the shape will expand or contract as you -add or delete text. See the shapepar documentation for -more details. -
-
- -

-To restore a frame to its default rectangular setting use -shape=\relax. - -

-For those unfamiliar with TeX's \parshape command, -the syntax is as follows: -
-
\parshape=n i1 l1 -i2 l2 ... -in ln -
-
-where n is the number of (ij lj) pairs and -ij specifies the left -indentation for the jth line and -lj specifies the length of -the jth line. - -

-For example, to create a -zigzag shaped static frame (whose IDN is shapedt): - -

-\setstaticframe*{shapedt}{shape={\parshape=20 
-0.6\linewidth 0.4\linewidth 0.5\linewidth 0.4\linewidth
-0.4\linewidth 0.4\linewidth 0.3\linewidth 0.4\linewidth
-0.2\linewidth 0.4\linewidth 0.1\linewidth 0.4\linewidth
-0pt 0.4\linewidth 0.1\linewidth 0.4\linewidth
-0.2\linewidth 0.4\linewidth 0.3\linewidth 0.4\linewidth
-0.4\linewidth 0.4\linewidth 0.5\linewidth 0.4\linewidth
-0.6\linewidth 0.4\linewidth 0.5\linewidth 0.4\linewidth
-0.4\linewidth 0.4\linewidth 0.3\linewidth 0.4\linewidth
-0.2\linewidth 0.4\linewidth 0.1\linewidth 0.4\linewidth
-0pt 0.4\linewidth 0.1\linewidth 0.4\linewidth
-}}
-
- -

- -

-The syntax for \shapepar is more complicated, see -the shapepar documentation for more details. In general: -
-
\shapepar{shape specs} -
-
-The shapepar package has four predefined shapes: -\squareshape, \diamondshape, -\heartshape and \nutshape. - -

-For example, to assign -a heart shape to the static frame whose IDL is shapedb: -

-\setstaticframe*{shapedb}{shape={\shapepar\heartshape}}
-
-To reset the frame back to its original rectangular shape -do: -
-\setstaticframe*{shapedb}{shape=\relax}
-
- -

- - -

-The flowfram package currently does not support any other -paragraph shape making commands. Any other commands would -have to be used explicitly within the contents of the frame. -

-Top | Index - -

- -

-4. Locations and Dimensions -

- -

- -This chapter describes some of the commands provided to -determine the locations and dimensions of frames. -

- -

-This chapter describes some of the commands available that can -be used to determine the locations and dimensions of frames. -See the accompanying document flowfram.pdf for more details of -these commands or for other commands not listed here. -

-Top | Index - -

- -

- -
-4.1 Determining the Location of the Typeblock -

- -

-As mentioned earlier, when you create new frames, -you must specify their location relative to the typeblock, but -what if you want to position a frame a set distance from the -edge of the paper? The flowfram package provides the following -commands that compute the distance from the typeblock to the -paper boundary: - -

- -

-\computeleftedgeodd{length} -

-This computes the position of the left edge of the (odd) page, relative -to the left side of the typeblock, and stores the result in -length. - -

- -

-\computeleftedgeeven{length} -

-As above, but for even pages. - -

- -

-\computetopedge{length} -

-This computes the top edge of the page, relative to the bottom of the -typeblock, and stores the result in length. - -

- -

-\computebottomedge{length} -

-This computes the bottom edge of the page, relative to the bottom of the -typeblock, and stores the result in length. - -

- -

-\computerightedgeodd{length} -

-This computes the position of the right edge of the (odd) page, -relative to the left side of the typeblock, and store the result -in length. - -

- -

-\computerightedgeeven{length} -

-As above, but for even pages. - -

-Note that in all cases length must be a LaTeX length -command. - -

-For example, if you want to create a frame whose bottom -left corner is one inch from the left edge of the page -and half an inch from the bottom edge of the page (this -assumes odd and even pages have the same margins): -

-% define two new lengths to represent the x and y coords
-\newlength{\myX}
-\newlength{\myY}
-% compute the distance from the typeblock to the paper edge
-\computeleftedgeodd{\myX}
-\computebottomedge{\myY}
-% Add the absolute co-ordinates to get co-ordinates
-% relative to the typeblock
-\addtolength{\myX}{1in}
-\addtolength{\myY}{0.5in}
-
- -

-Top | Index - -

- -

-4.2 Determining the Dimensions and Locations of Frames -

- -

-It is possible to determine the dimensions and locations -of a frame using one of the following commands: - -

- -

- -

-For each command, the starred version takes an IDL as the -argument, and the unstarred version takes an IDN as the -argument. Each command stores the relevant information in the -lengths \ffareawidth, \ffareaheight, -\ffareax and \ffareay. - -

-For other related commands, see the section "Determining Dimensions -and Locations" in the accompanying document -flowfram.pdf. -

-Top | Index - -

- -

-4.3 Relative Locations -

- -

-To print the relative location of one frame from another do: - -

-\relativeframelocation{type1}{idn1}{type2}{idn2} -

-where type1 and idn1 indicate the type and IDN of -the first frame, and type2 and idn2 indicate the type -and IDN of the second frame. There is also a starred version: - -

-\relativeframelocation*{type1}{idl1}{type2}{idll} -

-where idl1 and idl2 indicate the IDL of the -first and second frames, respectively. Both the above commands will -print one of the following: - -

- -

- -

-A frame is considered to be above another frame if the bottom edge -of the first frame is higher than the top edge of the second frame. - -

-A frame is considered to be below another frame if the top edge -of the first frame is lower than the bottom edge of the second frame. - -

-A frame is considered to be to the left of another frame if the right -edge of the first frame is to the left of the left edge of the second -frame. - -

-A frame is considered to be to the right of another frame if the left -edge of the first frame is to the right of the right edge of the -second frame. - -

-Note that the relative locations are taken for the current page, -regardless of whether either of the two frames are displayed on that -page. If the current page is odd, then the frame settings for odd pages -will be compared, otherwise the frame settings for even pages will -be compared. However remember that the first paragraph of each page -retains the settings in place at the start of the paragraph, so if the -frames have different locations for odd and even pages, then -\relativeframelocation may use the wrong page settings if it -is used at the start of the page. - -

-For example, the PDF version of this document defined a -flow frame labelled main and a -dynamic frame labelled chaphead which is -used to display the chapter headings. The following code -

-The dynamic frame is 
-\relativeframelocation*{dynamic}{chaphead}{flow}{main}
-of the flow frame.
-
-produces: -The dynamic frame is -on -the left of the flow frame. - -

-There are some short cut commands for frames of the -same type: - -

-\reldynamicloc{idn1}{idn2} -

-This is equivalent to: -
-
\relativeframelocation{dynamic}{idn1}{dynamic}{idn2} - -

-\relstaticloc{idn1}{idn2} -

-This is equivalent to: -
-
\relativeframelocation{static}{idn1}{static}{idn2} - -

-\relflowloc{idn1}{idn2} -

-This is equivalent to: -
-
\relativeframelocation{flow}{idn1}{flow}{idn2} -
-
-Each of the above commands also has a starred version that uses the -IDL instead of the IDN. - -

-These commands may be used in the optional argument of -\continueonframe for frames that are on the same page. -For example: -

-\begin{dynamiccontents}{1}
-Some text in the first dynamic frame that goes on for 
-quite a bit longer than this example.
-\continueonframe[continued \reldynamicloc{2}{1}]{2}
-This text is in the second dynamic frame which is 
-somewhere on the same page.
-\end{dynamiccontents}
-
- -

-For additional commands that determine the relative location of one -frame from another, see the section "Determining the relative -location of one frame from another" in the accompanying document -flowfram.pdf. -

-Top | Index - -

- -

- -
-5. Predefined Layouts -

- -

- -This chapter describes commands that create frames -arranged in a predefined layout. -

- -

-The flowfram package has a number of commands which -create frames in a predefined layout. These commands -may only be used in the preamble. -

-Top | Index - -

- -

-5.1 Column Styles -

- -

-The standard LaTeX commands \onecolumn and -\twocolumn are redefined to create one or two -flow frames that fill the entire typeblock separated -from each other (in the case of \twocolumn) by a -gap of width \columnsep. The height of these -flow frames may not be exactly as high as the typeblock, -as their height is adjusted to make them an integer -multiple of \baselineskip. You can switch off this -automatic adjustment using the command: - -

-\ffvadjustfalse -

- -

-The \onecolumn and \twocolumn commands -also take an optional argument which is the page list for which those flow frames are defined. In addition -to \onecolumn and \twocolumn, the -following commands are also defined: - -

- -

-\Ncolumn[pages]{n} -

-This creates n column flow frames each separated by a -distance of \columnsep. - -

- -

-\onecolumninarea[pages]{width}{height}{x}{y} -

-This creates a single flow frame to fill the given area, -adjusting the height so that it is an integer multiple of -\baselineskip. - -

- -

-\twocolumninarea[pages]{width}{height}{x}{y} -

-This creates two column flow frames separated by a distance -of \columnsep filling the entire area specified, again -adjusting the height so that it is an integer multiple of -\baselineskip. The columns are separated by a gap of -\columnsep. - -

- -

-\Ncolumninarea[pages]{n}{width}{height}{x}{y} -

-This is a more general form of \twocolumninarea making -n flow frames instead of two. -

-Top | Index - -

- -

-5.2 Column Styles with an Additional Frame -

- -

-As well as the column-style flow frames defined -above, it is also possible to define -n columns with an additional frame spanning either -above or below them. There will be a vertical gap of -approximately5.1 -\vcolumnsep between the columns -and the extra frame. In each of the following definitions, -the argument pages is the page list for which -the frames are defined, n is the number of -columns required, type is the type of frame to go -above or below the columns (this may be one of: flow, -static or dynamic). The area in which the -new frames should fill is defined by width, height -(the width and height of the area) and x, y -(the position of the bottom left hand corner of the area -relative to the bottom left hand corner of the typeblock.) - -

-The height of the additional frame at the top or bottom of -the columns is given by H. - -

- -

-\onecolumntopinarea[pages]{type}{H}{width}{height}{x}{y} -

-This creates one flow frame with a type frame above it, filling -the area specified. - -

- -

-\twocolumntopinarea[pages]{type}{H}{width}{height}{x}{y} -

-This creates two column-style flow frames with a type frame -above them, filling the area specified. - -

- -

-\Ncolumntopinarea[pages]{type}{n}{H}{width}{height}{x}{y} -

-This creates n column-style flow frames with a type -frame above them, filling the area specified. - -

- -

-\onecolumnbottominarea[pages]{type}{H}{width}{height}{x}{y} -

-This creates one flow frame with a type frame underneath it, -filling the area specified. - -

- -

-\twocolumnbottominarea[pages]{type}{H}{width}{height}{x}{y} -

-This creates two column-style flow frames with a type frame -below them, filling the area specified. - -

- -

-\Ncolumnbottominarea[pages]{type}{n}{H}{width}{height}{x}{y} -

-This creates n column-style flow frames with a type -frame below them, filling the area specified. - -

-The following commands are special cases of the above: - -

- -

-\onecolumnStopinarea[pages]{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\onecolumntopinarea[pages]{static}{H}{width}{height}{x}{y} - -

- -

-\onecolumnDtopinarea[pages]{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\onecolumntopinarea[pages]{dynamic}{H}{width}{height}{x}{y} - -

- -

-\onecolumntop[pages]{type}{H} -

-As \onecolumntopinarea where the area is the entire -typeblock. - -

- -

-\onecolumnStop[pages]{H} -

-This is equivalent to: -\onecolumntop[pages]{static}{H} - -

- -

-\onecolumnDtop[pages]{H} -

-This is equivalent to: -\onecolumntop[pages]{dynamic}{H} - -

- -

-\twocolumnStopinarea[pages]{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\twocolumntopinarea[pages]{static}{H}{width}{height}{x}{y} - -

- -

-\twocolumnDtopinarea[pages]{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\twocolumntopinarea[pages]{dynamic}{H}{width}{height}{x}{y} - -

- -

-\twocolumntop[pages]{type}{H} -

-As \twocolumntopinarea where the area is the entire -typeblock. - -

- -

-\twocolumnStop[pages]{H} -

-This is equivalent to: -\twocolumntop[pages]{static}{H} - -

- -

-\twocolumnDtop[pages]{H} -

-This is equivalent to: -\twocolumntop[pages]{dynamic}{H} - -

- -

-\NcolumnStopinarea[pages]{n}{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\Ncolumntopinarea[pages]{static}{n}{H}{width}{height}{x}{y} - -

- -

-\NcolumnDtopinarea[pages]{n}{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\Ncolumntopinarea[pages]{dynamic}{n}{H}{width}{height}{x}{y} - -

- -

-\Ncolumntop[pages]{type}{n}{H} -

-As \Ncolumntopinarea where the area is the entire -typeblock. - -

- -

-\NcolumnStop[pages]{n}{H} -

-This is equivalent to: -\Ncolumntop[pages]{static}{n}{H} - -

- -

-\NcolumnDtop[pages]{n}{H} -

-This is equivalent to: -\Ncolumntop[pages]{dynamic}{n}{H} - -

- -

-\onecolumnSbottominarea[pages]{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\onecolumnbottominarea[pages]{static}{H}{width}{height}{x}{y} - -

- -

-\onecolumnDbottominarea[pages]{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\onecolumnbottominarea[pages]{dynamic}{H}{width}{height}{x}{y} - -

- -

-\onecolumnbottom[pages]{type}{H} -

-As \onecolumnbottominarea where the area is the entire -typeblock. - -

- -

-\onecolumnSbottom[pages]{H} -

-This is equivalent to: -\onecolumnbottom[pages]{static}{H} - -

- -

-\onecolumnDbottom[pages]{H} -

-This is equivalent to: -\onecolumnbottom[pages]{dynamic}{H} - -

- -

-\twocolumnSbottominarea[pages]{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\twocolumnbottominarea[pages]{static}{H}{width}{height}{x}{y} - -

- -

-\twocolumnDbottominarea[pages]{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\twocolumnbottominarea[pages]{dynamic}{H}{width}{height}{x}{y} - -

- -

-\twocolumnbottom[pages]{type}{H} -

-As \twocolumnbottominarea where the area is the entire -typeblock. - -

- -

-\twocolumnSbottom[pages]{H} -

-This is equivalent to: -\twocolumnbottom[pages]{static}{H} - -

- -

-\twocolumnDbottom[pages]{H} -

-This is equivalent to: -\twocolumnbottom[pages]{dynamic}{H} - -

- -

-\NcolumnSbottominarea[pages]{n}{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\Ncolumnbottominarea[pages]{static}{n}{H}{width}{height}{x}{y} - -

- -

-\NcolumnDbottominarea[pages]{n}{H}{width}{height}{x}{y} -

-This is equivalent to: -
-\Ncolumnbottominarea[pages]{dynamic}{n}{H}{width}{height}{x}{y} - -

- -

-\Ncolumnbottom[pages]{type}{n}{H} -

-As \Ncolumnbottominarea where the area is the entire -typeblock. - -

- -

-\NcolumnSbottom[pages]{n}{H} -

-This is equivalent to: -\Ncolumnbottom[pages]{static}{n}{H} - -

- -

-\NcolumnDbottom[pages]{n}{H} -

-This is equivalent to: -\Ncolumnbottom[pages]{dynamic}{n}{H} - -

-Top | Index - -

- -

-5.3 Right to Left Columns -

- -

-The default behaviour for the commands defined above is -to create the flow frames from left to right. However if you are -typesetting from right to left, you will probably prefer to -define the flow frames in the reverse order. This can be done -via the package option RL. Alternatively you can use the -command: - -

-\lefttorightcolumnsfalse -

-before using commands such as \twocolumn or -\Ncolumn. Two switch back to left-to-right columns use: - -

-\lefttorightcolumnstrue -

- -

- -

-5.4 Backdrop Effects -

- -

-Static frames can be used to produce a -backdrop. There are a number of commands which create -static frames that can be used as a backdrop. In the -following definitions, pages is the page list for -which those static frames are defined (all is the default). -For the vertical strips: -xoffset is the amount by which the frames should be -shifted horizontally (0pt by default), W1 is the width of the first frame, -with colour specified by C1 and IDL L1, -and so on up to Wn the width of the nth frame -with colour specified by Cn and IDL Ln. -For the vertical strips: -yoffset is the amount by which the frames should be -shifted vertically (0pt by default), H1 is the height of the first frame, -with colour specified by C1 and IDL L1, -and so on up to Hn the height of the nth frame -with colour specified by Cn and IDL Ln. - -

-NOTE: unlike the earlier commands, these commands -are all relative to the actual page, not the typeblock. -So an x offset of 0pt indicates the first vertical -frame is flush with the left hand edge of the page, and a -y offset of 0pt indicates the first horizontal frame -is flush with the bottom edge of the page. This is because backdrops -tend to span the entire page, not just the typeblock. - -

-The colour specification must be completely enclosed in braces, -for example {[rgb]{1,0,1}} not [rgb]{1,0,1}. -

-Top | Index - -

- -

-5.4.1 Vertical stripe effects -

- -

- -

-\vtwotone[pages][xoffset]{W1}{C1}{L1}{W2}{C2}{L2} -

-Defines two static frames to create a two tone vertical strip effect. -(This command was -used to create the coloured background on the title page -of the PDF version of this document.) - -

- -

-\vNtone[pages][xoffset]{n}{W1}{C1}{L1}...{Wn}{Cn}{Ln} -

-This is similar to \vtwotone but with n static frames instead of two. - -

- -

-\vtwotonebottom[pages][xoffset]{H}{W1}{C1}{L1}{W2}{C2}{L2} -

-This is similar to \vtwotone but the static frames are only -H high, instead of the entire height of the page. -The frames are aligned along the bottom edge of the page. - -

- -

-\vtwotonetop[pages][xoffset]{H}{W1}{C1}{L1}{W2}{C2} -
{L2} -

-This is similar to \vtwotone but the static frames are only -H high, instead of the entire height of the page. -The frames are aligned along the top edge of the page. -(This command was used to create the border effect along -the top of every page in the PDF version of this document. -Two \vtwotonetop -commands were used, one for the even pages, and the other -for the odd pages.) - -

- -

-\vNtonebottom[pages][xoffset]{H}{n}{W1}{C1}{L1}... -{Wn}{Cn}{Ln} -

-This is a general version of \vtwotonebottom for -n frames instead of two. - -

- -

-\vNtonetop[pages][xoffset]{H}{n}{W1}{C1}{L1}... -{Wn}{Cn}{Ln} -

-This is a general version of \vtwotonetop for -n frames instead of two. -

-Top | Index - -

- -

-5.4.2 Horizontal stripe effect -

- -

- -

-\htwotone[pages][yoffset]{H1}{C1}{L1}{H2}{C2}{L2} -

-This defines two static frames to create a two tone horizontal strip -effect. - -

- -

-\hNtone[pages][yoffset]{n}{H1}{C1}{L1}... -{Hn}{Cn}{Ln} -

-This is similar to \htwotone but with n static frames instead of two. - -

- -

-\htwotoneleft[pages][yoffset]{W}{H1}{C1}{L1}{H2}{C2}{L2} -

-This is similar to \htwotone but the static frames are only -W wide, instead of the entire width of the page. -The frames are aligned along the left edge of the page. - -

- -

-\htwotoneright[pages][yoffset]{W}{H1}{C1}{L1}{H2}{C2}{L2} -

-This is similar to \htwotone but the static frames are only -W wide, instead of the entire width of the page. -The frames are aligned along the right edge of the page. - -

- -

-\hNtoneleft[pages][yoffset]{W}{n}{H1}{C1}{L1}... -{Hn}{Cn}{Ln} -

-This is a general version of \htwotoneleft for -n frames instead of two. - -

- -

-\hNtoneright[pages][yoffset]{W}{n}{H1}{C1}{L1}... -{Hn}{Cn}{Ln} -

-This is a general version of \htwotoneright for -n frames instead of two. -

-Top | Index - -

- -

-5.4.3 Background Frame -

- -

-To make a single static frame covering the entire page, use: - -

-\makebackgroundframe[pages][IDL] -

-Note that this frame should be created before any other -static frame as it will obscure all other static frames created -before it if it is given a background colour. -

-Top | Index - -

- -

- -
-5.4.4 Vertical and Horizontal Rules -

- -

-You can create vertical or horizontal rules between two -frames using the commands: - -

- -

-\insertvrule[y top][y bottom]{T1}{IDN1}{T2}{IDN2} -

-This creates a new static frame which fits between T1 -frame with IDN IDN1 and T2 frame with IDN IDN2, and places a vertical rule in it -extending from the highest point of the highest frame to -the lowest point of the lowest frame. The first optional -argument y top (default 0pt) extends the rule by that -much above the highest point, and the second optional argument -y bottom (default 0pt) extends the rule by that much -below the lowest point. If either of the optional arguments -are negative, the rule will be shortened instead of extended. -The width of the rule is given by - -

-\ffcolumnseprule -

-Note that this has changed as from version 1.09: versions -prior to 1.09 used \columnseprule. - -

-The vertical rule drawn by \insertvrule is created using -the command: - -

-\ffvrule{offset}{width}{height} -

-This can be redefined if a more ornate rule is required -(see below). - -

- -

-\inserthrule[x left][x right]{T1}{IDN1}{T2}{IDN2} -

-This creates a new static frame which fits between T1 -frame with IDN IDN1 and T2 frame with IDN IDN2, and places a horizontal rule in it -extending from the leftmost point of the left frame to -the rightmost point of the right frame. The first optional -argument x left (default 0pt) extends the rule by that -much before the leftmost point, and the second optional argument -x right (default 0pt) extends the rule by that much -beyond the rightmost point. If either of the optional arguments -are negative, the rule will be shortened instead of extended. -The height of the rule is given by - -

-\ffcolumnseprule -

- -

-The horizontal rule drawn by \inserthrule is created using -the command: - -

-\ffhrule{offset}{width}{height} -

-This can be redefined if a more ornate rule is required (see below). - -

-The default value for \ffcolumnseprule is 2pt. Both -\insertvrule and \inserthrule have starred versions -which allow you to identify the frame by IDL instead of -IDN. The frame types, T1 and T2 can be one -of the following keywords: flow, static or -dynamic. - -

-The command - -

-\ffruledeclarations -

-can be redefined to set declarations that affect how the rule is drawn. -The most likely use of this command is to set the rule colour. -For example: -

-\twocolumnStop{2in}
-
-\renewcommand{\ffruledeclarations}{\color{red}}
-\insertvrule{flow}{1}{flow}{2}
-
-\renewcommand{\ffruledeclarations}{\color{blue}}
-\inserthrule{static}{1}{flow}{1}
-
-This will create a layout with two columns (flow frames 1 and 2) -with a static frame above. A red vertical rule is placed in a -static frame between flow frames 1 and 2, and a blue horizontal -rule is placed between the static frame and the first -flow frame. (However the horizontal rule will span both -flow frames since that is the width of the static frame.) - -

-In the following example, the rules have been redefined -to use a zigzag pattern (which is obtained using the tikz -package): -

-\usepackage{flowfram}
-\usepackage{tikz}
-\usetikzlibrary{snakes}
-
-\twocolumnStop
-
-\renewcommand{\ffvrule}[3]{%
-\hfill
-\tikz{\draw[snake=zigzag,line width=#2,yshift=-#1] (0,0) -- (0pt,#3);}%
-\hfill\mbox{}}
-
-\insertvrule{flow}{1}{flow}{2}
-
-\renewcommand{\ffhrule}[3]{%
-\tikz{\draw[snake=zigzag,line width=#3,xshift=-#1] (0,0) -- (#2,0pt);}}
-
-\inserthrule{static}{1}{flow}{1}
-
- -

-Top | Index - -

- -

-6. Thumbtabs and Minitocs -

- -

- -This chapter describes how to create thumbtabs and minitocs, -such as those used in the PDF version of this document. -

- -

- -

-6.1 Thumbtabs -

- -

-On the right hand side of the odd pages -and on the left hand side of the even pages in the -PDF version of this document, there is a blue rectangle -with the chapter number in it. This is a thumbtab, and it gives -you a rough idea whereabouts in the document you are when you -quickly flick through the pages. Each thumbtab is in fact -a dynamic frame, and you can control whether to make the -number and/or title appear in the thumbtab by using one or -more of the package options: ttbtitle (show -title--default), ttbnotitle (don't show the title), -ttbnum (show the number) and ttbnonum -(don't show the number--default). - -

-If you want thumbtabs in your document, you need to use -the command - -

-\makethumbtabs[y offset]{height}[section type] -

-in the document -preamble. By default, the topmost thumbtab is level with the -top of the typeblock, but can be shifted vertically -using the first optional argument y offset. Each -thumbtab will be height high, and will correspond to the -sectioning type section type. If section type -is omitted, chapters will be used if the \chapter -command is defined, otherwise sections will be used. -The width of the thumbtabs is given by the length - -

-\thumbtabwidth -

-which is 1cm by default. -The command - -

-\thumbtabindex -

-will display the thumbtab index (all thumbtabs) on the current page. -You then need to use - -

-\enablethumbtabs -

-to start the individual thumbtabs and - -

-\disablethumbtabs -

-to make them go away. -You can align the table of contents with the thumbtabs6.1 using -the command - -

-\tocandthumbtabindex -

-instead of -the commands \tableofcontents and -\thumbtabindex. If you are using the hyperref -package, the text on the thumbtab index will be a hyperlink -to the corresponding part of the document. Note that when using -\tocandthumbtabindex you may -need to shift the thumbtabs vertically up or down to make -sure that they align correctly with the table of contents. - -

-The format of the text on the thumbtabs is given by the command - -

-\thumbtabindexformat -

-for the thumbtab index entries, and - -

-\thumbtabformat -

-for the individual thumbtabs. By -default the text on the thumbtabs will be rotated, but as -rotating is not implemented by some previewers, the package option -norotate is provided, which will stack the letters -vertically. This does not look as good as the rotated text. -Note also that some previewers do not put the hyperlink in the -correct place when the link has been rotated, so this may -also cause a problem. - -

-The thumbtab attributes can be changed using - -

-\setthumbtab{n}{key value list} -

-where n is the thumbtab number starting -from 1 (for the top thumbtab) to the value given by the counter -maxthumbtabs -(for the bottom thumbtab). Note that these numbers are not -related to the associated frame IDN. You may also use -the keyword all instead of n to indicate that the -new attributes should apply to all thumbtabs. - -

-To just change the settings for the thumbtab index, use - -

-\setthumbtabindex{n}{key value list} -

-The key value list for both these commands is the same as that -for \setdynamicframe. Again n may either be the -thumbtab index or the keyword all. - -

-By default, the thumbtabs have a grey background. In the PDF -version of this document, I used: -

-\setthumbtab{1}{backcolor=[rgb]{0.15,0.15,1}}
-\setthumbtab{2}{backcolor=[rgb]{0.2,0.2,1}}
-\setthumbtab{3}{backcolor=[rgb]{0.25,0.25,1}}
-\setthumbtab{4}{backcolor=[rgb]{0.3,0.3,1}}
-\setthumbtab{5}{backcolor=[rgb]{0.35,0.35,1}}
-\setthumbtab{6}{backcolor=[rgb]{0.4,0.4,1}}
-\setthumbtab{7}{backcolor=[rgb]{0.45,0.45,1}}
-\setthumbtab{8}{backcolor=[rgb]{0.5,0.5,1}}
-
-to change the thumbtab background colour to shades of blue. - -

-I also changed the style of the thumbtab text using: -

-\newcommand{\thumbtabstyle}[1]{{\hypersetup{linkcolor=white}%
-\textbf{\large\sffamily #1}}}
-\setthumbtab{all}{style=thumbtabstyle,textcolor=white}
-
-Note that the style uses \hypersetup6.2 to change the colour of the hyperlink text, -since the hyperlink overrides the text colour. -

-Top | Index - -

- -

-6.2 Minitocs -

- -

-In the PDF version of this document, after each chapter heading, -there is a mini table of contents for that chapter. To enable minitocs, -use the command - -

-\enableminitoc[section type] -

-The default section type is the same as that used by -the thumbtabs. - -

-If you want the minitocs to appear in a dynamic frame, you -can use - -

-\appenddfminitoc{IDN} -

-where IDN is the IDN of the appropriate dynamic frame. -There is also a starred version available if you want to -use the IDL instead of the IDN. - -

-For example, in the PDF version of this document I -used the command: -

-\appenddfminitoc*{chaphead}
-
-in the preamble, which appended the minitocs to the -dynamic frame with IDL chaphead. - -

-The style of the minitoc text is given by the command - -

-\minitocstyle{contents} -

-where the argument is the contents -of the minitoc. This command may be redefined if you want -to change the minitoc style. The gap before the minitoc -is given by the length - -

-\beforeminitocskip -

-and the gap after the minitoc is given by the length - -

-\afterminitocskip -

-These lengths may be changed using \setlength. -

-Top | Index - -

- -

-7. Global Settings -

- -

- -This section describes style macros, lengths and counters used -by the flowfram package. -

- -

- -

-7.1 Macros -

-The following macros can be changed using \renewcommand: - -

- -

- -

-Top | Index - -

- -

-7.2 Lengths -

-The following are lengths, which can be changed using -\setlength: - -

- -

- -

-Top | Index - -

- -

- -
-7.3 Counters -

-The following are counters that can be accessed via -\value{counter name} or via -\thecounter name. However the value of these counters -should not be modified. - -

-

-
maxflow
-
The total number of flow frames that have -been defined so far. - -

-

-
thisframe
-
Stores the IDN of the current -flow frame. You can label and reference the IDN using - -

-\labelflowid{label} -

-This is analogous to the standard \label command, but will -always refer to the IDN of the current flow frame. It can -then be referenced using \ref{label}. Note that -this will always refer to the current flow frame even when used -in the contents of a static or -dynamic frame. - -

-Don't use more than one instance of \labelflowid in a given -flow frame for a given page or you will get a "multiply defined -references" warning. - -

-

-
displayedframe
-
Stores the index of the currently -displayed flow frame. This will be the same as the IDN if all -flow frames are displayed on the current page, but if some are -hidden, the values may be different. You can label this counter -using - -

-\labelflow{label} -

-and reference it elsewhere in the document using -\ref{label}. For example, if you are using -a column layout, you might want to do something like: -

-This text is about hippos\labelflow{hippos}.
-
-% Somewhere else in the document
-See column~\ref{hippos} on page~\pageref{hippos}
-for information on hippos.
-
-Don't use more than one instance of \labelflow in a given -flow frame for a given page or you will get a "multiply defined -references" warning. Note that -\labelflow will always refer to the current flow frame even when used in the contents of a static or dynamic frame. - -

-

-
maxstatic
-
The total number of static frames that have -been defined so far. - -

-

-
maxdynamic
-
The total number of dynamic frames that -have been defined so far. - -

-

-
maxthumbtabs
-
The total number of thumbtabs. -
-
- -

-Top | Index - -

- -

-8. Troubleshooting -

- -

- -This chapter should be consulted if you experience any -problems using the flowfram package. -

- -

-For an up-to-date list of frequently asked questions, see -the flowfram FAQ. -If you have a query that is not addressed here, please try there -before contacting me. -

-Top | Index - -

- -

-8.1 General Queries -

- -

- -

    -
  1. If all my flow frames are only defined on, say, -pages 1-10, what happens if I then add some extra text so that -the document exceeds 10 pages? - -

    -The output routine will create a new flow frame the size -of the typeblock and use that. - -

    -

  2. -
  3. Can I use the formatted page number in page lists? - -

    -No. - -

    -

  4. -
  5. Why not? - -

    -When the output routine finishes with one flow frame it looks for the -next flow frame defined on that page. If there are none left, it then -searches through the page list of all the defined flow frames to -see if the next page lies in that range. If there are none defined on -that page, it ships out that page, and tries the next page. This gives -rise to two problems: - -

    - -

      -
    1. LaTeX is not clairvoyant. If it is currently -on page 14, and on the next page the page numbering changes -to A, it has no way of knowing this until it has reached -that point, which it hasn't yet. So it is looking for a -flow frame defined on page 15, not on page A. - -

      -

    2. -
    3. How does LaTeX tell if page C lies between -pages A and D? It would require an algorithm that can convert -from a formatted number back to an integer. Given that there -are many different ways of formatting the value of a counter -(besides the standard Roman and alphabetical formats) it -would be impossible to write an algorithm to do this -for some arbitrary format. -
    4. -
    - -

    -

  6. -
  7. Can I have an arbitrarily shaped frame? - -

    -You can assign certain irregular shapes to static or -dynamic frames, -using the shape key (see -Non-Rectangular -Frames). -Note that the bounding box will still appear as a rectangle with -the dimensions of the given frame which may not correspond -to the assigned shape. -This function is not available for flow frames. - -

    -

  8. -
  9. Why has the text from my flow frame appeared in a -static frame or dynamic frame? - -

    -Assuming you haven't inadvertently set that text as the contents -of the static or -dynamic frame, the frames are most likely -overlapping (see Frame -Stacking Order). -In an attempt to clarify what's going on, suppose you have -defined a static frame, a dynamic frame and two flow frames. The -following is an approximate8.1 analogy: TeX has a sheet of -paper on the table, and has pencilled8.2 in a -rectangle denoting the typeblock. The paper is put to one -side for now. TeX also has four rectangular sheets -of transparent paper. The first (which I shall call sheet 1) -represents the static frame, the next two (which I shall call -sheets 2 and 3) represent the flow frames, and the last one -(which I shall call sheet 4) represents the dynamic frame. -TeX starts work on filling sheet 2 with the document text. -Once it has put as much text on that sheet as it considers -possible (according to its views on aesthetics), it puts sheet 2 -into the "in tray", and then continues on sheet 3. While it's -filling in sheets 2 and 3, if it encounters a command or -environment that tells it what to put in the static frame, -it fills in sheet 1 and then puts sheet 1 into the "in tray" and -resumes where it left off on sheet 2 or 3. Similarly, if -it encounters a command that tells it what to put in the -dynamic frame, it stops what it's doing, fills in sheet 4, then -puts sheet 4 into the "in tray", and resumes where it left off. -Only when it has finished sheet 3 (the last flow frame defined -on that page), will it gather together all -the transparent sheets, and fix them onto the page starting -with sheet 1 through to sheet 4, measuring the bottom left hand -corner of each transparent sheet relative to the bottom left hand -corner of the typeblock. TeX will then put that page -aside, and start work on the next page. If two or more of the -transparent sheets overlap, you will see through the top one into -the one below (unless of course the top one has been painted -over, either by setting a background colour, or by adding an -image that has a non-transparent background.) - -

    -Note that it's also possible that the overlap is caused by an -overfull hbox that's causing the text to poke out the side of the -flow frame into a neighbouring frame. Check the log file for -warnings or use the draft option to the document class -which will place a filled rectangle on the end of overfull lines. - -

    -

  10. -
  11. Why do I get lots of overfull hbox messages? - -

    -Probably because you have narrow frames. It's better to use -ragged right formatting when the frames are narrow. - -

    -

  12. -
  13. Why do I keep getting multiply-defined warnings? - -

    -Probably because you have used \label in a static or -dynamic frame that is displayed on more than one page. Try using the clear -key to ensure that the frame is always cleared at the end of each -page. - -

    -

  14. -
  15. What happens if I use a command or environment -that switches to two-column mode (e.g. theindex)? - -

    -As from version 1.01, any \onecolumn or -\twocolumn commands that occur outside of the -preamble will print the contents of the optional argument, -and issue a warning. It is recommended that you set up -your own frames for use in the index. See the source code of this -document, ffuserguide.tex, for an example. - -

    -

  16. -
  17. How do I change the vertical alignment -of material inside a static or -dynamic frame? - -

    -Use the valign key in \setstaticframe or -\setdynamicframe (new to version 1.03). - -

    -

  18. -
  19. How do I compute the distance from the edge -of the page instead of the typeblock? - -

    -See Determining the -Location of the Typeblock. - -

    -

  20. -
  21. Is there a GUI I can use to make it easier to create the -frames? - -

    -Yes, Jpgfdraw which can be downloaded from: -http://theoval.cmp.uea.ac.uk/~nlct/jpgfdraw/ -

  22. -
- -

-Top | Index - -

- -

-8.2 Unexpected Output -

- -

- -

    -
  1. The lines at the beginning of my flow frames are the -wrong width. - -

    -This is a problem that will occur if you have flow frames with different widths, as the change in \hsize -does not come into effect until a paragraph break. So if -you have a paragraph that spans two flow frames, the end -of the paragraph at the beginning of the second flow frame will retain the width it had at the start of the -paragraph at the bottom of the previous flow frame. You can -fix the problem by inserting \framebreak at the -point where the frame break occurs -(see Prematurely Ending a -Flow Frame). - -

    -

  2. -
  3. My frames shift to the right when I add a border. - -

    -This may occur if you use a border that is not recognised -by the flowfram package. You will need to set the -offset using the offset key (see -Modifying Frame -Attributes). - -

    -

  4. -
  5. I have a vertical white strip along the right hand side -of every page. - -

    -This can happen if you have, say, an A4 document, and -ghostscript has letter as the default paper size. You can -change the default paper size by editing the file gs_init.ps. -Change: -

    -% Optionally choose a default paper size other than U.S. letter.
    -% (a4)
    -
    -to: -
    -% Optionally choose a default paper size other than U.S. letter.
    -(a4)
    -
    - -

    -

  6. -
  7. I don't have any output. - -

    -All your flow frames are empty. TeX doesn't put the -frames onto the page until it has finished putting text -into the flow frames. So if there is no text to go in the -flow frames it won't output the page. If you only want the -static frames or dynamic frames filled in, and nothing -outside of them, just do \mbox{}\clearpage. -This will put -an invisible something with zero area into your -flow frame, but it's enough to convince TeX that the -document contains some text. - -

    -

  8. -
  9. The last page hasn't appeared. - -

    -See the previous answer. - -

    -

  10. -
  11. There is no paragraph indentation inside my -static or -dynamic frames. - -

    -The paragraph indentation in static or -dynamic frames is governed -by the length \sdfparindent which is set to 0pt by -default. To make the indentation the same as that used by -flow frames place the following in the preamble: -

    -\setlength{\sdfparindent}{\parindent}
    -
    - -

    -

  12. -
  13. My section numbering is in the wrong order. - -

    -Remember that the contents of the dynamic frames are not set -until the page is shipped out, and the contents will be set -in the order of IDN, so if you have any sectioning commands -occuring within dynamic frames, they may not be set in the same -order as they are in your input file. - -

    -

  14. -
  15. The contents of my static or -dynamic frame have shifted -to the left when I used \parshape. - -

    -This will happen if your \parshape specification -exceeds the linewidth. For example: -

    -\parshape=1 0.4\linewidth 0.7\linewidth
    -
    -This specifies a line with overall length -1.1\linewidth which is too long. - -

    -

  16. -
- -

-Top | Index - -

- -

-8.3 Error Messages -

- -

- -

    -
  1. Illegal unit of measure (pt inserted) - -

    -All lengths must have units. Remember to include the -units when defining new frames. The following -keys require lengths: width, height, -x, y and offset8.3. - -

    -

  2. -
  3. Missing number, treated as zero - -

    -LaTeX is expecting a number. There are a number of -possible causes: - -

    - -

      -
    1. You have used an IDL instead of an IDN. If you -want to refer to a frame by its label, you need to remember -to use the starred versions of the -\settypeframe commands, or when setting -the contents of static frames or dynamic frames. - -

      -

    2. -
    3. When specifying page lists, you have mixed keywords -with page ranges. For example: 1,even is invalid. -
    4. -
    - -

    -

  4. -
  5. Flow frame IDL 'label' already defined - -

    -All IDLs within each frame type must be -unique. There are similar error messages for duplicate -IDLs for static frames and dynamic frames. - -

    -

  6. -
  7. Can't find flow frame id - -

    -You have specified a non-existent flow frame IDL. There are -similar error messages for static frames and dynamic frames. -Check to make sure you have spelt the label correctly, and -check you are using the correct frame type command. -(For example, if a static frame has the IDL mylabel, -and you attempt to do -\setflowframe*{mylabel}{options}, -then you will get this error, because mylabel refers -to a static frame not a flow frame.) - -

    -

  8. -
  9. Key 'clear' is boolean - -

    -The clear key can only have the values true -or false. - -

    -

  10. -
  11. Key 'clear' not available - -

    -The clear key is only available for static or -dynamic frames. - -

    -

  12. -
  13. Key 'style' not available - -

    -The style key is only available for dynamic frames. - -

    -

  14. -
  15. Key 'margin' not available - -

    -The margin key is only available for flow frames. - -

    -

  16. -
  17. Key 'shape' not available - -

    -The shape key is only available for static or -dynamic frames. - -

    -

  18. -
  19. Dynamic frame style 'style' not defined - -

    -The specified style style must be the name of a command -without the preceding backslash. It is possible that you have -mis-spelt the name, or you have forgotten to define the command. - -

    -

  20. -
  21. Argument of \fbox has an extra } - -

    -This error will occur if you do, say, border=\fbox -instead of border=fbox. Remember not to include -the initial backslash. - -

    -

  22. -
  23. Not in outer par mode - -

    -You can not have floats (such as figures, tables or marginal -notes) in static or -dynamic frames. If you want -a figure or table within a static or -dynamic frame -use staticfigure or statictable. - -

    -

  24. -
  25. Somethings wrong---maybe missing \item - -

    -Assuming that all your list type of environments start -with \item, this may be caused by something going -wrong with the toc (table of contents), ttb (thumbtab) -or aux (auxiliary) files in the previous run. Try deleting -them, and try again. - -

    -

  26. -
  27. No room for a new \skip - -

    -You have exceeded TeX's 256 register limit. Use the etex -package. - -

    -

  28. -
  29. \verb illegal in command argument - -

    -As a general rule, you can't use verbatim text in a command -argument. -This rule applies to all the commands defined by the flowfram -package. See also below. - -

    -

  30. -
  31. I get \verb illegal in command argument when using -verbatim text inside the dynamiccontents environment. - -

    -You can not use verbatim text inside either the starred or -unstarred version of the dynamiccontents environment. -(See earlier.) - -

    -Top | Index - -

    -

  32. -
- -

-
- -

-Glossary -

-
-
bounding box
The bounding box of a frame is the area allocated for the -contents of that frame. However the text may not completely fill that -area, and it is possible that the text may overflow that area. 1.1 Draft Option -, 1.2 Frame Stacking Order -, 3. Modifying Frame Attributes -, 3. Modifying Frame Attributes -, 3.1 Non-Rectangular Frames -, 7.1 Macros -, 7.1 Macros -, 7.1 Macros -, 7.2 Lengths -, 7.2 Lengths -, 8.1 General Queries -
dynamic frame
Frames -in which text is fixed in place, but the contents are re-typeset -each time the frame is displayed. 1. Introduction -, 1.1 Draft Option -, 1.2 Frame Stacking Order -, 1.3 HTML -, 2.3 Dynamic Frames -, 2.3.1 Important Notes -, 3. Modifying Frame Attributes -, 3.1 Non-Rectangular Frames -, 4.3 Relative Locations -, 6.2 Minitocs -, 7.2 Lengths -, 7.3 Counters -, 7.3 Counters -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -
flow frame
The frames in a document such that the contents of the -document environment flow from one frame to the next in -the order that they were defined. There must be at least one flow frame -on every page. 1. Introduction -, 1.1 Draft Option -, 1.2 Frame Stacking Order -, 2.1 Flow Frames -, 2.1.1 Prematurely Ending a Flow Frame -, 3. Modifying Frame Attributes -, 3.1 Non-Rectangular Frames -, 4.3 Relative Locations -, 5.1 Column Styles -, 5.2 Column Styles with an Additional Frame -, 5.3 Right to Left Columns -, 5.3 Right to Left Columns -, 5.4.4 Vertical and Horizontal Rules -, 7.2 Lengths -, 7.3 Counters -, 7.3 Counters -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.3 Error Messages -, 8.3 Error Messages -
frame
A rectangular -area of the page in which text can be placed (not to be -confused with a frame making command). There are three types: -flow, static and dynamic. 1. Introduction -, 1.1 Draft Option -, 1.2 Frame Stacking Order -, 1.3 HTML -, 2.1 Flow Frames -, 2.1.1 Prematurely Ending a Flow Frame -, 2.3 Dynamic Frames -, 2.3.1 Important Notes -, 3. Modifying Frame Attributes -, 3.1 Non-Rectangular Frames -, 4. Locations and Dimensions -, 4.1 Determining the Location of the Typeblock -, 4.2 Determining the Dimensions and Locations of Frames -, 4.3 Relative Locations -, 5. Predefined Layouts -, 5.2 Column Styles with an Additional Frame -, 5.4.4 Vertical and Horizontal Rules -, 7.2 Lengths -, 7.2 Lengths -, 7.3 Counters -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -
frame making command
A -LaTeX command which places some kind of border around its -argument. For example: \fbox. 3. Modifying Frame Attributes -, 7.2 Lengths -
identification label -(IDL)
A unique -label which can be assigned to a frame, enabling you to -refer to the frame by label instead of by its -IDN. 1.1 Draft Option -, 2.1 Flow Frames -, 2.2 Static Frames -, 2.3 Dynamic Frames -, 2.3 Dynamic Frames -, 3. Modifying Frame Attributes -, 4.2 Determining the Dimensions and Locations of Frames -, 4.3 Relative Locations -, 4.3 Relative Locations -, 5.4 Backdrop Effects -, 5.4.4 Vertical and Horizontal Rules -, 6.2 Minitocs -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -
identification number -(IDN)
A unique -number assigned to each frame, which you can use to identify -the frame when modifying its appearance. Example: if you -have defined 3 flow frames, 2 static frames and 1 dynamic -frame, the flow frames will have IDNs 1, 2 and 3, the static -frames will have IDNs 1 and 2, and the dynamic frame will -have IDN 1. 1.1 Draft Option -, 1.2 Frame Stacking Order -, 1.2 Frame Stacking Order -, 1.2 Frame Stacking Order -, 2.1 Flow Frames -, 2.2 Static Frames -, 2.3 Dynamic Frames -, 2.3 Dynamic Frames -, 3. Modifying Frame Attributes -, 4.2 Determining the Dimensions and Locations of Frames -, 4.3 Relative Locations -, 4.3 Relative Locations -, 4.3 Relative Locations -, 5.4.4 Vertical and Horizontal Rules -, 5.4.4 Vertical and Horizontal Rules -, 6.1 Thumbtabs -, 6.2 Minitocs -, 7.3 Counters -, 7.3 Counters -, 7.3 Counters -, 8.2 Unexpected Output -, 8.3 Error Messages -
page list
A list of -pages. This can either be a single keyword: all, -odd, even or none, or it can -be a comma-separated list of individual page numbers or -page ranges. For example: <3,5,7-11,>15 -indicates pages 1,2,5,7,8,9,10,11 and all pages after page 15. -Note that these numbers refer to the actual value of the -page counter, not the absolute physical page number. 2.1 Flow Frames -, 2.2 Static Frames -, 3. Modifying Frame Attributes -, 5.1 Column Styles -, 5.2 Column Styles with an Additional Frame -, 5.4 Backdrop Effects -, 8.1 General Queries -, 8.1 General Queries -
page range
Page -ranges can be closed, e.g. 5-10, or open, e.g. -<7 or >9. 2.1 Flow Frames -, 3. Modifying Frame Attributes -
static frame
Frames in which text is fixed in place. The contents are fixed until -explicitly changed or cleared via the \clear key -in \setstaticcontents. 1. Introduction -, 1.1 Draft Option -, 1.2 Frame Stacking Order -, 1.3 HTML -, 2.2 Static Frames -, 2.2.1 Important Notes -, 2.3 Dynamic Frames -, 3. Modifying Frame Attributes -, 3.1 Non-Rectangular Frames -, 5.4 Backdrop Effects -, 5.4.1 Vertical stripe effects -, 5.4.2 Horizontal stripe effect -, 5.4.3 Background Frame -, 5.4.4 Vertical and Horizontal Rules -, 5.4.4 Vertical and Horizontal Rules -, 5.4.4 Vertical and Horizontal Rules -, 7.2 Lengths -, 7.3 Counters -, 7.3 Counters -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.2 Unexpected Output -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -, 8.3 Error Messages -
typeblock
The area of the page where the main body of the text goes. -The width and height of this area are given by -\textwidth and \textheight. 1. Introduction -, 1.1 Draft Option -, 2.1 Flow Frames -, 2.2 Static Frames -, 4.1 Determining the Location of the Typeblock -, 5.1 Column Styles -, 5.2 Column Styles with an Additional Frame -, 5.4 Backdrop Effects -, 6.1 Thumbtabs -, 7.1 Macros -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -, 8.1 General Queries -
- -

-Top | Index - -

- -
- -

-Index -

-
\afterminitocskip -
6.2 - | 7.2 -
\appenddfminitoc -
6.2 -
\appenddynamiccontents -
2.3 -
\appenddynamiccontents* -
2.3 -
\baselineskip -
5.1 - | 5.1 - | 5.1 - | 5.2 - | 7.2 -
\beforeminitocskip -
6.2 - | 7.2 -
\caption -
1. -
\chapter -
2.3 - | 3.1 - | 6.1 -
\clear -
ffuserguide -
\cleardoublepage -
2.1.1 -
\clearpage -
2.1.1 -
color package -
1. -
\columnsep -
5.1 - | 5.1 - | 5.1 - | 5.1 - | 7.2 -
\columnseprule -
5.4.4 -
\computebottomedge -
4.1 -
\computeleftedgeeven -
4.1 -
\computeleftedgeodd -
4.1 -
\computerightedgeeven -
4.1 -
\computerightedgeodd -
4.1 -
\computetopedge -
4.1 -
\continueonframe -
2.2 - | 2.2 - | 2.3 - | 2.3 - | 2.3.1 - | 4.3 -
\dfchaphead -
2.3 -
\dfswapoddeven -
3. -
\diamondshape -
3.1 -
\disablethumbtabs -
6.1 -
displayedframe counter -
7.3 -
document environment -
ffuserguide - | 1. - | 2.1 -
\doublebox -
3. - | 3. -
draft option -
1.1 - | 1.1 - | 1.2 -
dynamiccontents environment -
2.3 - | 2.3 - | 2.3 - | 2.3 - | 2.3.1 - | 8.3 - | 8.3 -
dynamiccontents* environment -
2.3 - | 2.3 - | 2.3 - | 2.3 - | 2.3.1 -
\enableminitoc -
6.2 -
\enablethumbtabs -
6.1 -
etex package -
8.3 -
\evensidemargin -
1. -
fancybox package -
3. -
\fbox -
ffuserguide - | 3. - | 3. - | 7.2 -
\fboxsep -
7.2 -
\FFabove -
4.3 -
\FFaboveleft -
4.3 -
\FFaboveright -
4.3 -
\ffareaheight -
4.2 -
\ffareawidth -
4.2 -
\ffareax -
4.2 -
\ffareay -
4.2 -
\FFbelow -
4.3 -
\FFbelowleft -
4.3 -
\FFbelowright -
4.3 -
\ffcolumnseprule -
5.4.4 - | 5.4.4 - | 5.4.4 - | 7.2 -
\ffcontinuedtextfont -
2.2 - | 2.3 - | 7.1 -
\ffcontinuedtextlayout -
2.2 - | 2.3 -
\ffhrule -
5.4.4 -
\fflabelfont -
7.1 -
\fflabelsep -
7.2 -
\FFleft -
4.3 -
\FFoverlap -
4.3 -
\FFright -
4.3 -
\ffruledeclarations -
5.4.4 - | 7.1 -
\ffswapoddeven -
3. -
\ffvadjustfalse -
5.1 -
\ffvrule -
5.4.4 -
figure environment -
1. - | 1. - | 1. -
figure* environment -
1. -
\flowframerule -
3. - | 7.2 -
\flowframesep -
3. - | 7.2 -
\flowframeshowlayout -
1.1 -
frame settings -
-
angle -
3. -
backcolor -
3. -
border -
3. -
bordercolor -
3. -
clear -
3. - | 3. - | 8.1 -
evenx -
3. -
eveny -
3. -
height -
3. -
label -
3. -
margin -
3. -
oddx -
3. -
oddy -
3. -
offset -
3. -
pages -
3. -
shape -
3. - | 3.1 - | 3.1 - | 8.1 -
style -
3. -
textcolor -
3. -
valign -
3. - | 8.1 -
width -
3. -
x -
3. -
y -
3. -
-
\framebreak -
2.1.1 - | 2.1.1 - | 8.2 -
\getdynamicbounds -
4.2 -
\getdynamicbounds* -
4.2 -
\getdynamicid -
2.3 - | 2.3 -
\getdynamiclabel -
2.3 - | 2.3 -
\getflowbounds -
4.2 -
\getflowbounds* -
4.2 -
\getflowid -
2.1 - | 2.1 -
\getflowlabel -
2.1 - | 2.1 -
\getstaticbounds -
4.2 -
\getstaticbounds* -
4.2 -
\getstaticid -
2.2 - | 2.2 -
\getstaticlabel -
2.2 - | 2.2 -
ghostscript -
8.2 -
\heartshape -
3.1 -
\hNtone -
5.4.2 -
\hNtoneleft -
5.4.2 -
\hNtoneright -
5.4.2 -
\hsize -
2.1.1 - | 8.2 -
html package -
1.3 -
\htwotone -
5.4.2 - | 5.4.2 - | 5.4.2 - | 5.4.2 -
\htwotoneleft -
5.4.2 - | 5.4.2 -
\htwotoneright -
5.4.2 - | 5.4.2 -
hyperref package -
1. - | 6.1 - | 6.1 -
\hypersetup -
6.1 -
\inserthrule -
5.4.4 - | 5.4.4 - | 5.4.4 - | 7.1 - | 7.2 -
\insertvrule -
5.4.4 - | 5.4.4 - | 5.4.4 - | 7.1 - | 7.2 -
\item -
8.3 -
\label -
1. - | 2.2.1 - | 3. - | 7.3 - | 8.1 -
\labelflow -
7.3 - | 7.3 - | 7.3 -
\labelflowid -
7.3 - | 7.3 -
\lefttorightcolumnsfalse -
5.3 -
\lefttorightcolumnstrue -
5.3 -
\makebackgroundframe -
5.4.3 -
\makedfheaderfooter -
2.3 -
\makethumbtabs -
6.1 -
maxdynamic counter -
7.3 -
maxflow counter -
7.3 -
maxstatic counter -
7.3 -
maxthumbtabs counter -
6.1 - | 7.3 -
\minitocstyle -
6.2 -
\Ncolumn -
5.1 - | 5.3 - | 7.2 -
\Ncolumnbottom -
5.2 - | 5.2 - | 5.2 -
\Ncolumnbottominarea -
5.2 - | 5.2 - | 5.2 - | 5.2 -
\NcolumnDbottom -
5.2 -
\NcolumnDbottominarea -
5.2 -
\NcolumnDtop -
5.2 -
\NcolumnDtopinarea -
5.2 -
\Ncolumninarea -
5.1 -
\NcolumnSbottom -
5.2 -
\NcolumnSbottominarea -
5.2 -
\NcolumnStop -
5.2 -
\NcolumnStopinarea -
5.2 -
\Ncolumntop -
5.2 - | 5.2 - | 5.2 - | 7.2 - | 7.2 -
\Ncolumntopinarea -
5.2 - | 5.2 - | 5.2 - | 5.2 -
\newdynamicframe -
2.3 -
\newdynamicframe* -
2.3 -
\newflowframe -
2.1 - | 2.2 - | 2.2 - | 2.3 -
\newflowframe* -
2.1 -
\newpage -
2.1.1 -
\newstaticframe -
2.2 - | 2.3 -
\newstaticframe* -
2.2 -
nocolor option -
1.1 -
norotate option -
1.1 - | 6.1 -
\nutshape -
3.1 -
\oddsidemargin -
1. -
\onecolumn -
5.1 - | 5.1 - | 5.1 - | 8.1 -
\onecolumnbottom -
5.2 - | 5.2 - | 5.2 -
\onecolumnbottominarea -
5.2 - | 5.2 - | 5.2 - | 5.2 -
\onecolumnDbottom -
5.2 -
\onecolumnDbottominarea -
5.2 -
\onecolumnDtop -
5.2 -
\onecolumnDtopinarea -
5.2 -
\onecolumninarea -
5.1 -
\onecolumnSbottom -
5.2 -
\onecolumnSbottominarea -
5.2 -
\onecolumnStop -
5.2 -
\onecolumnStopinarea -
5.2 -
\onecolumntop -
5.2 - | 5.2 - | 5.2 -
\onecolumntopinarea -
5.2 - | 5.2 - | 5.2 - | 5.2 -
\Ovalbox -
3. - | 3. - | 3. - | 3. -
\pagebreak -
2.1.1 -
\par -
3.1 -
\parshape -
3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 8.2 - | 8.2 -
\part -
3.1 -
\ref -
7.3 - | 7.3 -
\relativeframelocation -
4.3 - | 4.3 - | 4.3 - | 4.3 - | 4.3 -
\relativeframelocation* -
4.3 -
\relax -
3. - | 3.1 -
\reldynamicloc -
4.3 -
\relflowloc -
4.3 -
\relstaticloc -
4.3 -
\renewcommand -
7.1 -
RL option -
5.3 -
\sdfparindent -
7.2 - | 8.2 -
\setalldynamicframes -
3. -
\setallflowframes -
3. -
\setallstaticframes -
3. -
\setdynamiccontents -
2.3 - | 2.3.1 - | 3. -
\setdynamiccontents* -
2.3 -
\setdynamicframe -
2.3 - | 2.3 - | 3. - | 6.1 - | 8.1 -
\setdynamicframe* -
3. -
\setffdraftcolor -
7.1 -
\setffdrafttypeblockcolor -
7.1 -
\setflowframe -
2.1 - | 3. -
\setflowframe* -
3. - | 8.3 -
\setlength -
6.2 - | 7.2 -
\setstaticcontents -
ffuserguide - | 2.2 - | 2.2 - | 3. -
\setstaticcontents* -
2.2 - | 2.2 - | 2.2 -
\setstaticframe -
3. - | 8.1 -
\setstaticframe* -
3. -
\setthumbtab -
6.1 -
\setthumbtabindex -
6.1 -
\sfswapoddeven -
3. -
\shadowbox -
3. - | 3. -
shapepar package -
3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 - | 3.1 -
\showframebboxfalse -
1.1 -
\showframebboxtrue -
1.1 -
\showmarginsfalse -
1.1 -
\showmarginstrue -
1.1 -
\showtypeblockfalse -
1.1 -
\showtypeblocktrue -
1.1 -
\simpar -
3.1 -
\squareshape -
3.1 -
staticcontents environment -
2.2 - | 2.2 - | 2.3 - | 3. -
staticcontents* environment -
2.2 - | 2.2 -
staticfigure environment -
1. - | 1. - | 8.3 -
statictable environment -
1. - | 1. - | 8.3 -
table environment -
1. - | 1. - | 1. -
table* environment -
1. -
\tableofcontents -
6.1 -
\textheight -
ffuserguide -
\textwidth -
ffuserguide -
theindex environment -
8.1 -
thisframe counter -
7.3 -
\thumbtabformat -
6.1 -
\thumbtabindex -
6.1 - | 6.1 -
\thumbtabindexformat -
6.1 -
\thumbtabwidth -
6.1 -
tikz package -
3. - | 5.4.4 -
\tocandthumbtabindex -
6.1 - | 6.1 -
ttbnonum option -
6.1 -
ttbnotitle option -
6.1 -
ttbnum option -
6.1 -
ttbtitle option -
6.1 -
\twocolumn -
5.1 - | 5.1 - | 5.1 - | 5.1 - | 5.3 - | 8.1 -
\twocolumnbottom -
5.2 - | 5.2 - | 5.2 -
\twocolumnbottominarea -
5.2 - | 5.2 - | 5.2 - | 5.2 -
\twocolumnDbottom -
5.2 -
\twocolumnDbottominarea -
5.2 -
\twocolumnDtop -
5.2 -
\twocolumnDtopinarea -
5.2 -
\twocolumninarea -
5.1 - | 5.1 -
\twocolumnSbottom -
5.2 -
\twocolumnSbottominarea -
5.2 -
\twocolumnStop -
5.2 -
\twocolumnStopinarea -
5.2 -
\twocolumntop -
5.2 - | 5.2 - | 5.2 -
\twocolumntopinarea -
5.2 - | 5.2 - | 5.2 - | 5.2 -
\value -
7.3 -
\vcolumnsep -
5.2 - | 7.2 -
verbatim text -
2.3 - | 2.3 - | 2.3 - | 2.3.1 - | 8.3 - | 8.3 - | 8.3 -
\vNtone -
5.4.1 -
\vNtonebottom -
5.4.1 -
\vNtonetop -
5.4.1 -
\vtwotone -
5.4.1 - | 5.4.1 - | 5.4.1 - | 5.4.1 -
\vtwotonebottom -
5.4.1 - | 5.4.1 -
\vtwotonetop -
5.4.1 - | 5.4.1 - | 5.4.1 - -
- -

- -

-Top | Index - -

- -


Footnotes

-
-
... -user1.1
-
Can I have arbitrary shaped frames? See -Non-Rectangular Frames - -
-
... environment1.2
-
This is because -of the arbitrary layout of the flow frames. - -
-
... -them.1.3
-
Can I have arbitrary -shaped frames? See -Non-Rectangular -Frames. - -
-
...typeblock2.1
-
See converting from absolute to relative page -co-ordinates - -
-
... counter2.2
-
why can't I use the page number format? -See query 3 - -
-
...flow2.3
-
the -position for the even pages is set using \setflowframe -defined in Modifying -Frame Attributes - -
-
... of.2.4
-
By "neither flows into nor -flows out of" I mean you have to explicitly set the contents of -this frame. Note that it may appear to contain text if another -frame overlaps it, but this text belongs to the other frame. - -
-
... macro.2.5
-
which means that you can have -verbatim text in the body of the staticcontents environment -but not in the body of the dynamiccontents environment - -
-
... -approximately5.1
-
It may not be exact, as the flow frames are adjusted so that their height is an integer multiple -of \baselineskip, which may increase the gap. - -
-
... thumbtabs6.1
-
but -only do this if there is enough room on the page! - -
-
...hypersetup@\hypersetup6.2
-
defined by the -hyperref package - -
-
... approximate8.1
-
The pedantic may point out -that TeX may make several attempts to fill in the flow frames -depending on penalties and so on. - -
-
... pencilled8.2
-
actually it hasn't -drawn anything really, but it has in its mind's eye. - -
-
...offset8.3
-
offset can also have the value compute - -
-
-

- - - diff --git a/Master/texmf-dist/doc/latex/flowfram/ffuserguide.pdf b/Master/texmf-dist/doc/latex/flowfram/ffuserguide.pdf index 595c0cfbbab..49ef7001861 100644 Binary files a/Master/texmf-dist/doc/latex/flowfram/ffuserguide.pdf and b/Master/texmf-dist/doc/latex/flowfram/ffuserguide.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/ffuserguide.tex b/Master/texmf-dist/doc/latex/flowfram/ffuserguide.tex index 37aacadebbc..20059639d4d 100644 --- a/Master/texmf-dist/doc/latex/flowfram/ffuserguide.tex +++ b/Master/texmf-dist/doc/latex/flowfram/ffuserguide.tex @@ -1,5 +1,6 @@ \documentclass[a4paper,twoside]{book} +\usepackage{etoolbox} \usepackage{etex} \usepackage{mathptmx} \usepackage{courier} @@ -35,7 +36,20 @@ \newcommand{\marg}[1]{\texttt{\char`\{#1\char`\}}} \newcommand{\oarg}[1]{\texttt{[#1]}} \newcommand{\appname}[1]{\texttt{#1}\index{#1@\texttt{#1}}} -\newcommand{\pkgopt}[1]{\pkgoptni{#1}\index{#1@\pkgoptni{#1} option}} + +\newcommand{\pkgopt}[2][]{% + \ifstrempty{#1}% + {% + \pkgoptni{#2}\index{#2@\pkgoptni{#2} option}% + }% + {% + \pkgoptni{#2}=\pkgoptni{#1}\index{#2@\pkgoptni{#2} +option!#1@\pkgoptni{#1}}% + }% +} + +\newcommand{\pkgoptval}[2]{\pkgoptni{#2}\index{#1@\pkgoptni{#1} option!#2@\pkgoptni{#2}}} + \newcommand{\key}[1]{#1\index{frame settings!#1}} \newcommand{\dq}[1]{``#1''} \newcommand*{\Index}[1]{#1\index{#1}} @@ -58,8 +72,9 @@ \vskip10pt\noindent\ignorespacesafterend} \newcommand{\chapdesc}[1]{% -\appenddynamiccontents*{chaphead}{\par -\emph{#1}}} + \appenddynamiccontents*{chaphead}{\par + \normalfont\emph{#1}}% +} \newcommand*{\glsindex}[1]{\protect\index{#1}} @@ -105,7 +120,7 @@ on every page}} \newglossaryentry{static}{name=static frame\glsindex{frame!static},% description={Frames in which text is fixed in place. The contents are fixed until -explicitly changed or cleared via the \protect\cmdname{clear} key +explicitly changed or cleared via the \protect\key{clear} key in \protect\cmdname{setstaticcontents}}} \newglossaryentry{dynamic}{name=dynamic frame\glsindex{frame!dynamic},% @@ -134,8 +149,9 @@ pages. This can either be a single keyword: \texttt{all}, be a comma-separated list of individual page numbers or page ranges. For example: \texttt{\textless3,5,7-11,\textgreater15} indicates pages 1,2,5,7,8,9,10,11 and all pages after page 15. -Note that these numbers refer to the actual value of the -page counter, not the absolute physical page number}} +These numbers refer to the decimal value of the page counter by +default. To make them refer to the absolute physical page number use +the package option \pkgopt[absolute]{pages}}} \newglossaryentry{pgrange}{name=page range\glsindex{page range},% description={Page @@ -348,9 +364,9 @@ backcolor=blue,textcolor=white,style=footstyle,pages=none} \begin{document}\label{top} \title{Creating Flow Frames for Posters, Brochures or -Magazines using flowfram.sty v 1.13} +Magazines using flowfram.sty version 1.14} \author{Nicola L. C. Talbot} -\date{23rd January 2010} +\date{2012-11-10} % swap frames around for title page \ffswapoddeven*{main} @@ -365,11 +381,8 @@ Magazines using flowfram.sty v 1.13} \noindent Dr Nicola Talbot\\ -School of Computing Sciences\\ -University of East Anglia\\ -Norwich. Norfolk. NR4 7TJ.\\ -United Kingdom\\ -\url{http://theoval.cmp.uea.ac.uk/~nlct/} +Dickimaw Books\\ +\url{http://www.dickimaw-books.com/} \frontmatter % swap frames back again @@ -391,6 +404,14 @@ United Kingdom\\ \chapdesc{This chapter provides a brief overview of the package, the package options and the various frame types.} +This document is the user manual for the \styni{flowfram} package. +Advanced users wanting further details of the package should read +the documented code \texttt{flowfram.pdf}. Sample files are provided +in the directory \meta{TEXMF}\texttt{/doc/latex/flowfram/samples/} +where \meta{TEXMF} indicates the root \TeX\ installation directory +for this package. (This document is located in +\meta{TEXMF}\texttt{/doc/latex/flowfram/}.) + The \styni{flowfram} package is a \LaTeXe\ package designed to enable you to create text \glspl{frame} in a document such that the contents of the \env{document} environment flow from one @@ -399,6 +420,11 @@ This is useful for creating posters or magazines or any other form of document that does not conform to the standard one or two column layout. +\textbf{The \styni{flowfram} package tries to make \TeX\ do +something it wasn't originally designed to do. It modifies the +output routine and may not always perform as desired. Caveat +emptor---or `you get what you pay for'.} + The \styni{flowfram} package provides three types of \gls*{frame}: \glspl{flow}, \glspl{static} and \glspl{dynamic} with dimensions and positions specified by the @@ -417,10 +443,69 @@ may vary depending on the values of \cmdname{oddsidemargin} and \cmdname{evensidemargin}, and all the \glspl*{frame} will shift accordingly unless otherwise indicated. -Since floats (such as figures and tables) can only go in -\glspl*{flow}, this package provides -the additional environments: -\env{staticfigure} and +This package has only been tested with a limited number of +class files and packages. Since it modifies the output routine, +it is likely to conflict with any other package which also +does this (such as \sty{longtable}). + +You should load \styni{flowfram} \emph{after} \sty{hyperref} and any +colour package (e.g.\ \sty{color}).\htmlnav + +\section{Package Options} + +\begin{description} + + \item[\pkgopt{pages}] Determines whether the \gls{pglist} refers to + the page number as given by the page counter (\pkgopt[relative]{pages}) + or the absolute page number (\pkgopt[absolute]{pages}). The + default is \pkgoptval{pages}{relative} to ensure backward compatibility, + but if you have a document where the page counter is reset it's + best to use \pkgopt[absolute]{pages}. + + \item[\pkgopt{draft}] Switch on draft mode (see + \latexhtml{\autoref{sec:draft}}{\htmlref{Draft Option}{sec:draft}}). + + \item[\pkgopt{final}] Switch off draft mode (default). + + \item[\pkgopt{thumbtabs}] Controls thumbtab contents. See + \latexhtml{\autoref{sec:thumbtabs}}{\htmlref{Thumbtabs}{sec:thumbtabs}} + for details. + + \item[\pkgopt{LR}] When using the column style layouts described in + \latexhtml{\autoref{sec:Ncolumn}}{\htmlref{Column + Styles}{sec:Ncolumn}}, define the \glspl{flow} from left to right. + (Default.) + + \item[\pkgopt{RL}] When using the column style layouts described in + \latexhtml{\autoref{sec:Ncolumn}}{\htmlref{Column + Styles}{sec:Ncolumn}}, define the \glspl{flow} from right to left. + + \item[\pkgopt{rotate}] May have the value \pkgoptval{rotate}{true} + (rotate text in thumbtabs) or \pkgoptval{rotate}{false} + (stack text in thumbtabs). (Default is \pkgoptval{rotate}{true}.) + + \item[\pkgopt{color}] May have the value \pkgoptval{color}{true} + (allow frames to have colour settings) or \pkgoptval{color}{false} + (disable colour in frame settings). The default is \pkgoptval{color}{true}. + + \item[\pkgopt{verbose}] May have the value \pkgoptval{verbose}{true} or + \pkgoptval{verbose}{false}. (Default is \pkgoptval{verbose}{false}.) + Provided to assist debugging. + +\end{description} + +\section{Floats} +\label{sec:floats} + +The standard \env{figure} and \env{table} commands will +behave as usual in the \glspl*{flow}, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}\footnote{This is because +of the arbitrary layout of the flow frames.}. + +Floats (such as figures and tables) can only go in +\glspl*{flow}. However, this package provides +the additional environments: \env{staticfigure} and \env{statictable} which can be used in \glspl*{static} and \glspl*{dynamic}. Unlike their \env{figure} and \env{table} counterparts, they are fixed in place, and @@ -429,22 +514,10 @@ so do not take an optional placement specifier. The be used within \env{staticfigure} and \env{statictable} as usual, but remember that if the frame is displayed on multiple pages, you may end up with multiply defined labels. - -The standard \env{figure} and \env{table} commands will -behave as usual in the \glspl*{flow}, but their starred versions, -\env{figure*} and \env{table*} behave no differently -from \env{figure} and \env{table}\footnote{This is because -of the arbitrary layout of the flow frames.}. - -This package has only been tested with a limited number of -class files and packages. Since it modifies the output routine, -it is likely to conflict with any other package which also -does this. - -You should load \styni{flowfram} \emph{after} \sty{hyperref} and any -colour package (e.g.\ \sty{color}).\htmlnav +\htmlnav \section{Draft Option} +\label{sec:draft} The \styni{flowfram} package has the package option \pkgopt{draft} which will draw the \glspl{bbox} for @@ -497,12 +570,32 @@ the command: \cmdname{flowframeshowlayout} \end{definition} -The \styni{flowfram} package also has the options \pkgopt{nocolor} -and \pkgopt{norotate} for previewers that can not process +The \styni{flowfram} package also has the options \pkgopt[false]{color} +and \pkgopt[false]{rotate} for previewers that can not process colour or rotating specials. (Otherwise you may end up with large black rectangles obscuring your text, instead of the pale background colour you were hoping for.)\htmlnav +\section{Chapters} + +If the \cmdname{chapter} command has been defined, the \styni{flowfram} +package will modify its definition so that it sets the page style to +\cmdname{chapterfirstpagestyle} for the first page of each chapter. This +command defaults to \texttt{plain}, which is the usual page style +for the first page of a chapter. If you want to use a different +style, you will need to redefine \cmdname{chapterfirstpagestyle} to the +name of the relevant page style. A hook +\begin{definition} +\cmdname{ffprechapterhook} +\end{definition} +is used at the start of \cmdname{chapter} definition \emph{before +\cmdname{clearpage} or \cmdname{cleardoublepage} is called.} + +Chapter titles can be placed in a \gls{dynamic} (as in \html{the PDF version of }this document). See +\latexhtml{\autoref{sec:dfchaphead}}{\htmlref{Putting Chapter Titles +in a Dynamic Frame}{sec:dfchaphead}} for further details. +\htmlnav + \section{Frame Stacking Order} \label{sec:stacking} @@ -598,13 +691,19 @@ A \gls*{pgrange} can be a closed range (e.g.\ \verb+2-8+) or an open range (e.g.\ \verb+<10+ or \verb/>5/). For example: \verb'<3,5,7-11,>15' indicates pages 1, 2, 5, 7, 8, 9, 10, 11 and all pages -greater than page 15. These page numbers refer to the value of -the page counter\footnote{why can't I use the page number format? -See query~\ref{itm:whynot}\latex{ on page~\pageref{itm:whynot}}}, -so if you have a page~i and a page~1, they +greater than page 15. These page numbers refer to the integer value of +the page counter\footnote{Why can't I use the page number format? +See query~\ref{itm:whynot}\latex{ on page~\pageref{itm:whynot}}.}\ +by default, so if you have a page~i and a page~1, they will both have the same layout (unless you change the page list setting somewhere between the two pages). +As from version 1.4, if you use the package option +\pkgopt[absolute]{pages} then the numbers in the page list refer to +the absolute page number. In which case page~1 refers to the first +page of the document only, regardless of whether there is another +page~1 or page~i later in the document. + Each \gls*{frame} has its own unique \gls{idn}, corresponding to the order in which it was defined. So the first \gls*{flow} to be defined has \gls*{idn}~1, @@ -687,6 +786,18 @@ paragraph of the previous \gls{frame} has ended. As a result, the end of the paragraph at the beginning of the new \gls*{flow} retains the width of the previous \gls*{flow}. +If a paragraph does span two \glspl*{flow} of unequal width without +using \cmdname{framebreak} a warning will be issued. If a subtle +difference in frame widths is caused by rounding errors (for +example, if the frames were created using Jpgfdraw) you can adjust +the tolerance to suppress these warnings. The default tolerance is +2pt. To change this, set the length register \cmdname{fftolerance} +to the required tolerance. For example, to suppress warnings where +the difference in width is less than 3pt, do +\begin{verbatim} +\setlength{\fftolerance}{3pt} +\end{verbatim} + If you want to start a new page, rather than simply move to the next \gls*{frame}, use the command \cmdname{clearpage}, or for two-sided documents, to start on the next odd page @@ -915,7 +1026,7 @@ To create a new \gls*{dynamic}, use the command: The parameters are exactly the same as for \cmdname{newflowframe} and \cmdname{newstaticframe}. Again, each \gls*{dynamic} has an associated unique \gls{idn}, -starting from 1 for the first \gls*{dynamic} to be defined, and +starting from~1 for the first \gls*{dynamic} to be defined, and a unique \gls{idl}\ can also be set using the final optional argument \meta{label}. @@ -1011,6 +1122,9 @@ or: \cmdname{appenddynamiccontents*}\marg{\meta{label}}\marg{\meta{contents}} \end{definition} +\subsection{Putting Chapter Titles in a Dynamic Frame} +\label{sec:dfchaphead} + If \cmdname{chapter} is defined, you can make the chapter titles appear in a dynamic frame using the command \begin{definition} @@ -1024,6 +1138,36 @@ use the \gls{idl}\ instead of the \gls*{idn}. For example, in \dfchaphead*{chaphead} \end{verbatim} +If you use \cmdname{dfchaphead}, you can adjust the format of the +chapter headings by redefining +\begin{definition} +\cmdname{DFchapterstyle}\marg{\meta{title}} +\end{definition} +for the numbered chapters and +\begin{definition} +\cmdname{DFschapterstyle}\marg{\meta{title}} +\end{definition} +for the unnumbered chapters. For example, this document redefined +those commands as follows: +\begin{verbatim} +\renewcommand{\DFchapterstyle}[1]{% + {\raggedright\sffamily\bfseries\Huge + \color{blue}\thechapter. #1\par + }% +} + +\renewcommand{\DFschapterstyle}[1]{% + {\raggedright\sffamily\bfseries\Huge + \color{blue} #1\par + }% +} +\end{verbatim} +There is no facility for placing other sectional types in a +\gls{dynamic}. +\htmlnav + +\subsection{Putting Headers and Footers in a Dynamic Frame} + The headers and footers can be turned into \glspl*{dynamic} using the command \begin{definition} @@ -1034,6 +1178,9 @@ This will create two \glspl*{dynamic} with \glspl*{idl} usual, but you can then move or resize the header and footer using \cmdname{setdynamicframe} (described \latexhtml{in \autoref{sec:modattr}}{\htmlref{later}{sec:modattr}}). +\htmlnav + +\subsection{Continued Text} In the body of \env{dynamiccontents} or \env{dynamiccontents*}, you can move onto another \gls*{dynamic} using: @@ -1182,7 +1329,9 @@ above keywords or have ranges in \meta{label list}. The \meta{key-val list} argument must be a comma-separated list of \meta{key}=\meta{value} pairs, indicating which -attributes to modify. The available values are as follows: +attributes to modify. \textbf{Make sure you group \meta{value} +if it contains one or more commas or equal signs.} +The available values are as follows: \begin{description} \item[\key{width}=\meta{length}] The width of the \gls*{frame}. @@ -1367,8 +1516,63 @@ comma-separated list of single pages, or \glspl{pgrange}. For example: \begin{verbatim} -\setdynamicframe{1}{pages=1,5,8-10} +\setdynamicframe{1}{pages={1,5,8-10}} +\end{verbatim} +Recall that the numbers in the list either refer to the integer +value of the page counter +(when used with the package option \pkgopt[relative]{pages}) +or the absolute page number (when used with the package option +\pkgopt[absolute]{pages}). + +As from version 1.14, there is also a quick way of setting the page +list that doesn't have the overhead of parsing the +\meta{key}=\meta{value} format of commands such as +\cmdname{setflowframe}: +\begin{definition} +\cmdname{flowsetpagelist}\marg{\meta{idn}}\marg{\meta{page +list}}\newline +\cmdname{dynamicsetpagelist}\marg{\meta{idn}}\marg{\meta{page +list}}\newline +\cmdname{staticsetpagelist}\marg{\meta{idn}}\marg{\meta{page list}} +\end{definition} +\textbf{Note that these commands don't have starred variants. The +first argument must be a single \gls{idn}.} + +See also \latexhtml{\autoref{sec:switch}}{\htmlref{Switching Frames +On and Off On-The-Fly}{sec:switch}}. + +\item[\key{excludepages}=\meta{list}] (New to version~1.14.) +A comma-separated list of page +numbers where the frame should not appear. Note that this overrides +any page given by the \key{pages} key. For this key, \meta{list} may +only contain comma-separated numbers. Ranges are not permitted. For +example: +\begin{verbatim} +\setdynamicframe{1}{excludepages={7}} +\setdynamicframe{1}{pages={1-10}} \end{verbatim} +This will make the dynamic frame appear on pages~1 to~6 and~8 to~10. + +Again, there is also a quick way of setting the exclusion +list that doesn't have the overhead of parsing the +\meta{key}=\meta{value} format of commands such as +\cmdname{setflowframe}: +\begin{definition} +\cmdname{flowsetexclusion}\marg{\meta{idn}}\marg{\meta{list}}\newline +\cmdname{dynamicsetexclusion}\marg{\meta{idn}}\marg{\meta{list}}\newline +\cmdname{staticsetexclusion}\marg{\meta{idn}}\marg{\meta{list}} +\end{definition} +or you can add to an exclusion list using: +\begin{definition} +\cmdname{flowaddexclusion}\marg{\meta{idn}}\marg{\meta{list}}\newline +\cmdname{dynamicaddexclusion}\marg{\meta{idn}}\marg{\meta{list}}\newline +\cmdname{staticaddexclusion}\marg{\meta{idn}}\marg{\meta{list}} +\end{definition} +\textbf{Note that these commands don't have starred variants. The +first argument must be a single \gls{idn}.} + +See also \latexhtml{\autoref{sec:switch}}{\htmlref{Switching Frames +On and Off On-The-Fly}{sec:switch}}. \item[\key{margin}=\meta{side}] The side of the \gls*{flow} that its corresponding margin should go on. This @@ -1483,7 +1687,7 @@ indentation for the \latexhtml{$j$th}{jth} line and the \latexhtml{$j$th}{jth} line. \latexhtml{The \gls*{static} on the top -\ifthenelse{\isodd{page}}{left}{right} +\ifthenelse{\isodd{page}}{right}{left} was assigned a zigzag shape using:}{For example, to create a zigzag shaped static frame (whose \gls*{idn} is \texttt{shapedt}):} \setstaticframe*{shapedb,shapedt}{pages=all} @@ -1548,7 +1752,7 @@ The \sty{shapepar} package has four predefined shapes: \cmdname{heartshape} and \cmdname{nutshape}. \latexhtml{The \gls{static} on the bottom -\ifthenelse{\isodd{page}}{left}{right} +\ifthenelse{\isodd{page}}{right} {left} was assigned a heart shape using the command:}{For example, to assign a heart shape to the static frame whose \gls*{idl} is \texttt{shapedb}:} \begin{verbatim} @@ -1576,6 +1780,173 @@ The \styni{flowfram} package currently does not support any other paragraph shape making commands. Any other commands would have to be used explicitly within the contents of the frame.\htmlnav +\section{Switching Frames On and Off On-The-Fly} +\label{sec:switch} + +Modifying the \gls{pglist} (or the page exclusion list) within the +\env{document} environment is a risky business. This list must +be up-to-date before the output routine looks for the next frame. +To make this a little easier, as from version~1.14 there are +commands that help you do this. \textbf{If you want to use these +commands, it's best to use the package option \pkgopt[absolute]{pages}.} + +The commands described in this section update the \glspl{pglist} +(and possibly the exclusion list) \emph{when the output routine is +next used}. They are designed to switch frames on or off either on +the next page or on the next odd page. You therefore need to take +care where you place these commands. For example, if you have a +two-sided document and you do: +\begin{verbatim} +\dynamicswitchonnextodd{1} +\mainmatter +\chapter{Introduction} +\end{verbatim} +This will set the dynamic frame whose \gls{idn} is~1 to be visible for +the first page of chapter~1. However, if you do +\begin{verbatim} +\mainmatter +\dynamicswitchonnextodd{1} +\chapter{Introduction} +\end{verbatim} +This will have a different effect as \cmdname{mainmatter} issues a +\cmdname{cleardoublepage} so the command to switch on the dynamic +frame is on the same page as the start of chapter~1. This means that +the dynamic frame won't appear until the following odd page +(page~3). + +These commands all have the same syntax with one argument that may +be a comma-separated list. The starred version uses +\glspl{idl} and the unstarred version uses \glspl{idn}. + +\begin{definition} +\cmdname{flowswitchonnext}\marg{\meta{IDN list}}\\ +\cmdname{flowswitchonnext*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{flow} from the following page onwards. +\begin{definition} +\cmdname{flowswitchoffnext}\marg{\meta{IDN list}}\\ +\cmdname{flowswitchoffnext*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{flow} from the following page onwards. +\begin{definition} +\cmdname{flowswitchonnextodd}\marg{\meta{IDN list}}\\ +\cmdname{flowswitchonnextodd*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{flow} from the next odd page onwards. +\begin{definition} +\cmdname{flowswitchoffnextodd}\marg{\meta{IDN list}}\\ +\cmdname{flowswitchoffnextodd*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{flow} from the next odd page onwards. + +\begin{definition} +\cmdname{flowswitchonnextonly}\marg{\meta{IDN list}}\\ +\cmdname{flowswitchonnextonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{flow} just for the following page. +\begin{definition} +\cmdname{flowswitchoffnextonly}\marg{\meta{IDN list}}\\ +\cmdname{flowswitchoffnextonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{flow} just for the following page. +\begin{definition} +\cmdname{flowswitchonnextoddonly}\marg{\meta{IDN list}}\\ +\cmdname{flowswitchonnextoddonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{flow} just for the next odd page. +\begin{definition} +\cmdname{flowswitchoffnextoddonly}\marg{\meta{IDN list}}\\ +\cmdname{flowswitchoffnextoddonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{flow} just for the next odd page. + +\begin{definition} +\cmdname{dynamicswitchonnext}\marg{\meta{IDN list}}\\ +\cmdname{dynamicswitchonnext*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{dynamic} from the following page onwards. +\begin{definition} +\cmdname{dynamicswitchoffnext}\marg{\meta{IDN list}}\\ +\cmdname{dynamicswitchoffnext*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{dynamic} from the following page onwards. +\begin{definition} +\cmdname{dynamicswitchonnextodd}\marg{\meta{IDN list}}\\ +\cmdname{dynamicswitchonnextodd*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{dynamic} from the next odd page onwards. +\begin{definition} +\cmdname{dynamicswitchoffnextodd}\marg{\meta{IDN list}}\\ +\cmdname{dynamicswitchoffnextodd*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{dynamic} from the next odd page onwards. + +\begin{definition} +\cmdname{dynamicswitchonnextonly}\marg{\meta{IDN list}}\\ +\cmdname{dynamicswitchonnextonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{dynamic} just for the following page. +\begin{definition} +\cmdname{dynamicswitchoffnextonly}\marg{\meta{IDN list}}\\ +\cmdname{dynamicswitchoffnextonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{dynamic} just for the following page. +\begin{definition} +\cmdname{dynamicswitchonnextoddonly}\marg{\meta{IDN list}}\\ +\cmdname{dynamicswitchonnextoddonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{dynamic} just for the next odd page. +\begin{definition} +\cmdname{dynamicswitchoffnextoddonly}\marg{\meta{IDN list}}\\ +\cmdname{dynamicswitchoffnextoddonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{dynamic} just for the next odd page. + +\begin{definition} +\cmdname{staticswitchonnext}\marg{\meta{IDN list}}\\ +\cmdname{staticswitchonnext*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{static} from the following page onwards. +\begin{definition} +\cmdname{staticswitchoffnext}\marg{\meta{IDN list}}\\ +\cmdname{staticswitchoffnext*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{static} from the following page onwards. +\begin{definition} +\cmdname{staticswitchonnextodd}\marg{\meta{IDN list}}\\ +\cmdname{staticswitchonnextodd*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{static} from the next odd page onwards. +\begin{definition} +\cmdname{staticswitchoffnextodd}\marg{\meta{IDN list}}\\ +\cmdname{staticswitchoffnextodd*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{static} from the next odd page onwards. + +\begin{definition} +\cmdname{staticswitchonnextonly}\marg{\meta{IDN list}}\\ +\cmdname{staticswitchonnextonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{static} just for the following page. +\begin{definition} +\cmdname{staticswitchoffnextonly}\marg{\meta{IDN list}}\\ +\cmdname{staticswitchoffnextonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{static} just for the following page. +\begin{definition} +\cmdname{staticswitchonnextoddonly}\marg{\meta{IDN list}}\\ +\cmdname{staticswitchonnextoddonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch on the listed \glspl{static} just for the next odd page. +\begin{definition} +\cmdname{staticswitchoffnextoddonly}\marg{\meta{IDN list}}\\ +\cmdname{staticswitchoffnextoddonly*}\marg{\meta{IDL list}} +\end{definition}% +Switch off the listed \glspl{static} just for the next odd page. + +The \styni{flowfram} package comes with a sample file +\texttt{sample-pages.tex} that uses some of these commands. + \chapter{Locations and Dimensions} \chapdesc{This chapter describes some of the commands provided to determine the locations and dimensions of frames.} @@ -1805,6 +2176,7 @@ create \glspl{frame} in a predefined layout. These commands may only be used in the preamble.\htmlnav \section{Column Styles} +\label{sec:Ncolumn} The standard \LaTeX\ commands \cmdname{onecolumn} and \cmdname{twocolumn} are redefined to create one or two @@ -2167,6 +2539,7 @@ This is equivalent to: \htmlnav \section{Right to Left Columns} +\label{sec:RL} The default behaviour for the commands defined above is to create the \glspl{flow} from left to right. However if you are @@ -2467,6 +2840,7 @@ package): such as those used in \html{the PDF version of }this document.} \section{Thumbtabs} +\label{sec:thumbtabs} On the right hand side of \latexhtml{this page}{the odd pages and on the left hand side of the even pages in the @@ -2475,11 +2849,13 @@ with the chapter number in it. This is a thumbtab, and it gives you a rough idea whereabouts in the document you are when you quickly flick through the pages. Each thumbtab is in fact a dynamic frame, and you can control whether to make the -number and/or title appear in the thumbtab by using one or -more of the package options: \pkgopt{ttbtitle} (show -title---default), \pkgopt{ttbnotitle} (don't show the title), -\pkgopt{ttbnum} (show the number) and \pkgopt{ttbnonum} -(don't show the number---default). +number and/or title appear in the thumbtab by using +the package option \pkgopt{thumbtabs}. This is a key=value option, +where the value may be one of \pkgoptval{thumbtabs}{title} +(show the title but not the number---default), +\pkgoptval{thumbtabs}{number} (show the number but not the title), +\pkgoptval{thumbtabs}{both} (show the number and the title) +and \pkgoptval{thumbtabs}{none} (don't show the number or title). If you want thumbtabs in your document, you need to use the command @@ -2743,6 +3119,12 @@ This is the vertical distance before the minitoc. \item \cmdname{afterminitocskip} This is the vertical distance after the minitoc. + +\item \cmdname{fftolerance} + +The output routine will issue a warning when a paragraph spans two +\glspl{flow} of unequal width, unless the difference in width is +less than the value of \cmdname{fftolerance}. \end{itemize} \htmlnav @@ -2751,7 +3133,7 @@ This is the vertical distance after the minitoc. The following are counters that can be accessed via \cmdname{value}\marg{\meta{counter name}} or via \verb|\the|\meta{counter name}. However the value of these counters -should not be modified. +\emph{should not be modified}. \begin{description} \item[\ctr{maxflow}] The total number of \glspl{flow} that have @@ -2803,6 +3185,8 @@ been defined so far. have been defined so far. \item[\ctr{maxthumbtabs}] The total number of thumbtabs. + +\item[\ctr{absolutepage}] The absolute page number. \end{description} \htmlnav @@ -2812,9 +3196,20 @@ problems using the \styni{flowfram} package.} For an up-to-date list of frequently asked questions, see \latexhtml{% -\url{http://theoval.cmp.uea.ac.uk/~nlct/latex/packages/faq/flowframfaq.html}}{the \htmladdnormallink{flowfram FAQ}{http://theoval.cmp.uea.ac.uk/~nlct/latex/packages/faq/flowframfaq.html}}. -If you have a query that is not addressed here, please try there -before contacting me.\htmlnav +\url{http://www.dickimaw-books.com/faqs/flowframfaq.html}}{the +\htmladdnormallink{flowfram +FAQ}{http://www.dickimaw-books.com/faqs/flowframfaq.html}}. If you +have a query that is not addressed here, please try there first. If +that doesn't answer your query, try posting a message to the \LaTeX\ +Community Forum (\url{http://latex-community.org/forum/}), \TeX\ on +StackExchange (\url{http://tex.stackexchange.com/}) or the +\texttt{comp.text.tex} newsgroup. I generally answer questions in +those places much quicker than queries that are emailed to me. + +Bugs can be reported using the \latexhtml{form at +\url{http://www.dickimaw-books.com/bug-report.html}}{\htmladdnormallink{bug +report form}{http://www.dickimaw-books.com/bug-report.html}} +\htmlnav \section{General Queries} @@ -2847,7 +3242,7 @@ that point, which it hasn't yet. So it is looking for a \gls{flow} defined on page~15, not on page~A. \item How does \LaTeX\ tell if page C lies between -pages A and D? It would require an algorithm that can convert +pages A and D\@? It would require an algorithm that can convert from a formatted number back to an integer. Given that there are many different ways of formatting the value of a counter (besides the standard Roman and alphabetical formats) it @@ -2954,7 +3349,7 @@ Location of the Typeblock}{sec:typeblockloc}}. \glspl{frame}? Yes, Jpgfdraw which can be downloaded from: -\url{http://theoval.cmp.uea.ac.uk/~nlct/jpgfdraw/} +\url{http://www.dickimaw-books.com/apps/jpgfdraw/} \end{enumerate} \htmlnav @@ -3175,9 +3570,9 @@ unstarred version of the \env{dynamiccontents} environment. \htmlnav -\clearpage +\ifthenelse{\isodd{page}}{}{\clearpage\mbox{}} % have a backcover: \setdynamicframe*{footer}{pages=none} \setstaticframe*{lastbackleft,lastbackright}{pages=even} -\mbox{}\clearpage +\clearpage\mbox{} \end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/ffuserguideidx.ist b/Master/texmf-dist/doc/latex/flowfram/ffuserguideidx.ist new file mode 100644 index 00000000000..1ed1dadb531 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/ffuserguideidx.ist @@ -0,0 +1,3 @@ +headings_flag 1 +heading_prefix "\\idxgroupheading\{" +heading_suffix "\}" diff --git a/Master/texmf-dist/doc/latex/flowfram/flowfram.pdf b/Master/texmf-dist/doc/latex/flowfram/flowfram.pdf index b4ebe1d54cf..67085cab743 100644 Binary files a/Master/texmf-dist/doc/latex/flowfram/flowfram.pdf and b/Master/texmf-dist/doc/latex/flowfram/flowfram.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/brochure.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/brochure.pdf deleted file mode 100644 index 4e37ce2e49b..00000000000 Binary files a/Master/texmf-dist/doc/latex/flowfram/samples/brochure.pdf and /dev/null differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/brochure.tex b/Master/texmf-dist/doc/latex/flowfram/samples/brochure.tex deleted file mode 100644 index d0434139854..00000000000 --- a/Master/texmf-dist/doc/latex/flowfram/samples/brochure.tex +++ /dev/null @@ -1,362 +0,0 @@ -\documentclass[a4paper]{report} - -\usepackage[landscape,margin=1in]{geometry} -\usepackage{color} -\usepackage{flowfram} -\usepackage[colorlinks]{hyperref} - -% Use sans-serif font as default font -\renewcommand{\familydefault}{cmss} - -% adjust \textheight so that it is an integer multiple of -% \baselineskip -\adjustheight{\textheight} - -% set up pagelayout. One column for title page -% two columns for the rest. -\onecolumninarea[1,2]{0.6\textwidth}{\textheight}{0.4\textwidth}{0pt} -\twocolumninarea[>2]{0.6\textwidth}{\textheight}{0.4\textwidth}{0pt} - -% Set up dynamic frame on the left. This is where -% the headings will go. - -\newdynamicframe{0.4\textwidth}{\textheight}{0pt}{0pt}[left] - -% put the chapter headings in this frame -\dfchaphead*{left} -% Modify the default style -\renewcommand{\DFchapterstyle}[1]{% -\raggedright\Huge\slshape\MakeUppercase{#1}\par} - -% Make static frames for background (only for page 1) -\vtwotone[1]{0.6\paperwidth}{[cmyk]{0.65,0.13,0,0}}{backleft}% -{0.4\paperwidth}{[cmyk]{0.94,0.54,0,0}}{backright} - -% Make a border along the top of each page -\vtwotonetop{1cm}{0.6\paperwidth}{[cmyk]{0.65,0.13,0,0}}{topleft}% -{0.4\paperwidth}{[cmyk]{0.94,0.54,0,0}}{topright} - -% make a static frame for the logo -\newstaticframe{0.2\textwidth}{0.25\textheight}{0pt}{0pt}[logo] - -% empty page style, because I am going to make my own -\pagestyle{empty} - -% Each new chapter sets \thispagestyle{\chapterfirstpagestyle}, change this empty as well -\renewcommand{\chapterfirstpagestyle}{empty} - -% Now make a frame in which to put my own customized footer -\newdynamicframe[>1]{\textwidth}{\headheight}{0pt}{-\footskip}[footer] - -% set the contents of the frame: -\setdynamiccontents*{footer}{% -School of Computing Sciences, University of East Anglia\hfill -http://www.cmp.uea.ac.uk/\hfill -page \thepage\ of \pageref*{lastpage}} - - -\newcommand{\env}[1]{\texttt{#1}} -\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} -\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} - -\begin{document} - -% not a very interesting logo -\setstaticcontents*{logo}{\sffamily{\Huge\slshape FLF} Flowfram} - -{\noindent -\slshape\Huge\MakeUppercase{A Sample Brochure}\par -\vskip0.5in -\noindent\large\MakeUppercase{Nicola Talbot}\\ -} - - -\chapter{Introduction} - -The \textsl{flowfram} package is designed to enable you to create -frames in a document such that the -contents of the \env{document} environment flow from one -frame to the next in the order that they were defined. -This is useful for creating posters -or magazines or any other form of document that does not -conform to the standard one or two column layout. - -This is a modified version of the manual for the \textsl{flowfram} package. -It is intended to illustrated what can be done. See the full -manual (ffuserguide.pdf) for -a comprehensive description, as some parts of this document -may now be out of date. -If the columns are very narrow, it may be better to -use \cmdname{raggedright}, otherwise \TeX\ may have a -problem working out the line breaks. - -This is column~\thedisplayedframe. - -The main type of frame is the flow frame. This is described on -column~\ref{flow:flowframe} on page~\pageref{flow:flowframe}. -The order used to draw the contents of each frame on the page -is described in column~\ref{flow:stacking} on -page~\pageref{flow:stacking}. Floats are describe in -column~\ref{flow:floats} on page~\pageref{flow:floats}. - -\chapter{Setting up Frames} - -This is column~\thedisplayedframe. - -The \textsl{flowfram} package provides three types of frame: -{flow frames}, {static -frames} and {dynamic frames}. - -\section*{Flow Frames} - -\labelflow{flow:flowframe} -The flow frame is the principle type of frame. -The text of the \env{document} environment will flow from -one frame to the next in order of definition. Each -flow frame has an associated width, height, -position on the page, and optionally a border. - -It is recommended that all the flow frames in a document -have the same width, otherwise problems may occur -when a paragraph spans to flow frames of unequal -widths. This is because \TeX's output routine does not -register the change in \cmdname{hsize} until it reaches -a paragraph break. If it is absolutely necessary for -flow frames to have unequal widths, judicious use of -\cmdname{framebreak} is required. - -\section*{Static Frames} - -A static frame is a rectangular area in which text neither -flows into, nor flows out of. The contents must be set -explicitly, and once set, the contents of the static frame will -remain the same on each page until it is explicitly -changed. Thus, a static frame can be used, for example, to make -a company logo appear in the same place on every page. - -\section*{Dynamic Frames} - -A dynamic frame is similar to a static frame, but its contents -are re-typeset on each page. (A static frame stores its -contents in a savebox, whereas a dynamic frame stores its -contents in a macro). - -This is column~\thedisplayedframe. - -\chapter{Frame Attributes} -\label{sec:modattr} - -Once you have defined the {flow frames}, {static frames} and -{dynamic frames}, their attributes can be changed. -The three types of frame mostly have the -same set of attributes, but some are specific to a certain type. -The available attributes are as follows -(\textsuperscript{\textbf{F}} indicates the key is -only available for {flow frames}, -\textsuperscript{\textbf{S}} indicates the key is only available -for {static frames} -and \textsuperscript{\textbf{D}} indicates the key -is only available for {dynamic frames}): - -\begin{description} -\item[width=\meta{length}]\mbox{}\par The width of the frame. - -\item[height=\meta{length}]\mbox{}\par The height of the frame. - -\item[x=\meta{length}]\mbox{}\par The x-coordinate of the frame. - -\item[y=\meta{length}]\mbox{}\par The y-coordinate of the frame. - -\item[border=\meta{style}]\mbox{}\par The style of the border around the -frame, this can take the values: \texttt{none} (no border), -\texttt{plain} (plain border) or the name of a \LaTeX\ -frame making command without the preceding backslash. -The value \texttt{fbox} is equivalent to \texttt{plain}. - -\item[offset=\meta{offset}]\mbox{}\par The border offset, if it is a -user-defined border. This is the distance from the outer -edge of the left hand border to the left edge of the -bounding box of the text inside the border. The \textsl{flowfram} -package is able to compute the border for -known frame making commands. -If you define your own frame making command, you may need to -specify the offset explicitly, or the frames -may end up shifted to the right or left. - -\item[bordercolor=\meta{colour}]\mbox{}\par The colour of the border -if you are using a standard frame making command. -The colour can either be specified as, e.g.\ \texttt{green}, -or including the colour model, for example -\verb/[rgb]{0,1,0}/. - -\item[textcolor=\meta{colour}]\mbox{}\par The text colour for that -frame. Again, the colour can either be specified as, -e.g.\ \texttt{green}, or including the colour model, -for example \verb/[rgb]{0,1,0}/. - -\item[pages=\meta{page list}]\mbox{}\par The {list of -pages} for which the frame -should appear. This can either have the values: \texttt{all}, -\texttt{even}, \texttt{odd} or \texttt{none} (the latter -removes the frame from that point on---useful if you -have multiple pages with the same number), or it can be a -comma-separated list of single pages, or -{page ranges}. - -\item[margin=\meta{side}\textsuperscript{F}]\mbox{}\par The side of -the flow frame that its corresponding margin should go on. This -can take the values \texttt{left} or \texttt{right}. - -\item[clear=\meta{boolean}\textsuperscript{S}] If this value -is set, the static frame will be cleared at the start of the -next page. - -\item[style=\meta{cmd}\textsuperscript{D}]\mbox{}\par This should be -the name of a command \emph{without} the preceding backslash, -to be applied to the contents of the specified dynamic frame. -The command may either be a declaration, for example \verb/style=large/ -which will set the contents of all the dynamic frames in a -large font, or it can be a command that takes a single argument, -for example \verb/style=textbf/ -which will make the text for all the dynamic frames come out in -bold. To unset a style, do \verb/style=none/. - -\end{description} - -\chapter{Miscellaneous} - -\section*{Page Layout} - -The \textsl{flowfram} package has the package option \texttt{draft} -which will draw the {bounding boxes} for -each frame defined. At the bottom right of each -bounding box (except for the bounding box denoting the -typeblock), a marker will be shown to indictate the type -of frame, its IDN and its IDL. - -You can see the layout for the current page (irrespective of -whether or not the \texttt{draft} option has been set) using -the command:\newline -\cmdname{flowframeshowlayout} - -The headers and footers will appear as usual (but will not -be shown in draft mode), according to the format given by -\cmdname{pagestyle}. - -\section*{Frame Stacking Order} - -\labelflow{flow:stacking} -The material on each page is placed in the following order: -\begin{enumerate} -\item Each static frame defined for that page in ascending -order of IDN. - -\item Each flow frame defined for that page in ascending -order of IDN. - -\item Each dynamic frame defined for that page in ascending -order of IDN. - -\item {Bounding boxes} if the \texttt{draft} -package option has been used. -\end{enumerate} - -This ordering can be used to determine if you want something -to overlay or underlay everything else on the page. - -\section*{Prematurely Ending a Flow Frame} - -You can force text to move immediately to the next defined -flow frame using one of the standard \LaTeX\ page breaking commands -which work in an analogous way to the way they -work in standard two column mode. - -The command \cmdname{framebreak} is provided for situations -where a paragraph spans two flow frames -of different widths, as \TeX's output routine does not -adjust to the new value of \cmdname{hsize} until the last -paragraph of the previous frame has ended. As a -result, the end of the paragraph at the beginning of the new -flow frame retains the width of the previous flow frame. - -If you want to start a new page, rather than simply move to the -next frame, use the command\newline -\cmdname{finishthispage}. - -\section*{Floats} - -\labelflow{flow:floats} -Since floats (such as figures and tables) can only go in -{flow frames}, this package provides -the additional environments: -\env{staticfigure} and -\env{statictable} which can be used in static frames -and dynamic frames. Unlike their \env{figure} and -\env{table} counterparts, they are fixed in place, and -so do not take an optional placement specifier. The -\cmdname{caption} and \cmdname{label} commands can -be used within \env{staticfigure} and \env{statictable} as -usual. - -The standard \env{figure} and \env{table} commands will -behave as usual in the flow frames, but their starred versions, -\env{figure*} and \env{table*} behave no differently -from \env{figure} and \env{table}. - -\section*{Global Values} - -The following macros can be changed using\linebreak \cmdname{renewcommand}: - -\begin{itemize} -\item \cmdname{setffdraftcolor} - -This sets the colour of the bounding box -when it is displayed in draft mode. - -\item -\cmdname{setffdrafttypeblockcolor} - -This sets the colour of -the bounding box of the typeblock when it is displayed -in draft mode. - -\item \cmdname{fflabelfont} - -This sets the font size for the bounding box markers in -draft mode. - -\end{itemize} - -The following are lengths, which can be changed using -\cmdname{setlength}: - -\begin{itemize} -\item \cmdname{fflabelsep} - -This is the distance from the right hand side of the -bounding box at which to place the bounding box marker. - -\item \cmdname{flowframesep} - -This is the gap between the text of the frame and -its border, for the standard border types. - -\item \cmdname{flowframerule} - -This is the width of the frame's border, if using -a border given by a frame making command that uses \cmdname{fboxsep} -to set its border width. - -\item \cmdname{columnsep} - -This is the horizontal distance between flow frames when using one of the -\cmdname{Ncolumn} type of commands - -\item \cmdname{vcolumnsep} - -This is the vertical distance between the flow frames and the static or -dynamic frame when using one of the \cmdname{Ncolumntop} type of commands. -\end{itemize} - -\label{lastpage} -\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/news.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/news.pdf deleted file mode 100644 index d36d46ddccd..00000000000 Binary files a/Master/texmf-dist/doc/latex/flowfram/samples/news.pdf and /dev/null differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/news.tex b/Master/texmf-dist/doc/latex/flowfram/samples/news.tex deleted file mode 100644 index a8ff83b3922..00000000000 --- a/Master/texmf-dist/doc/latex/flowfram/samples/news.tex +++ /dev/null @@ -1,204 +0,0 @@ -\documentclass{article} - -\usepackage{color} -\usepackage{flowfram} -\usepackage[a5paper,top=10mm,bottom=10mm,margin=10mm]{geometry} -\usepackage{graphicx} - -% define lengths to help compute positions -\newlength\leftX -\newlength\leftY -\newlength\leftH -\newlength\leftW - -\newlength\rightX -\newlength\rightY -\newlength\rightH -\newlength\rightW - -% Create a static frame to put title in -\setlength{\leftH}{2cm} -\setlength{\leftY}{\textheight} -\addtolength{\leftY}{-\leftH} - -\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[title] - -% First flow frame. - -\setlength{\leftH}{7cm} -\adjustheight{\leftH} -\addtolength{\leftY}{-\leftH} -\setlength{\leftW}{0.5\textwidth} - -\newflowframe[1]{\leftW}{\leftH}{0pt}{\leftY} - -\setlength{\rightH}{\leftH} -\setlength{\rightY}{\leftY} - -% Second flow frame - -\setlength{\leftH}{3.5cm} -\adjustheight{\leftH} -\addtolength{\leftY}{-\leftH} - -\newflowframe[1]{\textwidth}{\leftH}{0pt}{\leftY} - -% Right hand flow frame - -\setlength{\rightX}{\leftW} -\addtolength{\rightX}{\columnsep} -\setlength{\rightW}{\textwidth} -\addtolength{\rightW}{-\rightX} - -\newflowframe[1]{\rightW}{\rightH}{\rightX}{\rightY} - -% insert vertical line between left and right flow frames - -\insertvrule{flow}{1}{flow}{3} - -% insert horizontal line between flow frames 2 and 3 -% don't want it to go under frame 1 so shift the starting -% position - -\addtolength{\rightX}{-0.5\columnsep} -\addtolength{\rightX}{-0.5\columnseprule} -\inserthrule[-\rightX]{flow}{3}{flow}{2} - -% egg picture - -\addtolength{\rightY}{\rightH} -\addtolength{\rightY}{-10mm} -\setlength{\rightW}{0.75in} -\setlength{\rightH}{0.8in} -\addtolength{\rightY}{-\rightH} -\setlength{\rightX}{\textwidth} -\addtolength{\rightX}{-\rightW} -\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[egg] - -% set contents -\setstaticcontents*{egg}{\includegraphics[scale=0.75]{egg}} - -% middle heading - -\setlength{\leftH}{2cm} -\addtolength{\leftY}{-\leftH} - -\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[midhead] - -% insert horizontal line -\inserthrule*{flow}{2}{static}{midhead} - -% bottom left flow frame - -\setlength{\leftH}{\leftY} -\adjustheight{\leftH} -\setlength{\leftW}{0.6\textwidth} - -\newflowframe[1]{\leftW}{\leftH}{0pt}{0pt} - -% bottom right flow frame - -\setlength{\rightX}{\leftW} -\addtolength{\rightX}{\columnsep} -\setlength{\rightW}{\textwidth} -\addtolength{\rightW}{-\rightX} - -\newflowframe[1]{\rightW}{\leftH}{\rightX}{0pt} - -% static frame for sheep picture - -\newstaticframe[1]{0.8in}{0.8in}{0pt}{0pt}[sheep] - -% set contents -\setstaticcontents*{sheep}{\includegraphics[scale=0.75]{sheep}} - -\onecolumn[>1] % for any text that falls off the last page - -\setcounter{secnumdepth}{0} -\pagestyle{empty} - -\begin{document} - -\begin{staticcontents*}{title} -\begin{center} -\bfseries\Huge -Fairy Tale Times -\end{center} -\hfill Issue 1. 20 November 2005. -\end{staticcontents*} - -\section{Killer Wolf on the Loose} - -The authorites are warning of a killer wolf on the -loose. He has so far devoured an old grandmother and -two pig brothers. He is described as being furry with -big eyes and big teeth. - -On Monday this week he broke into a house, and devoured -an old lady. He then disguised himself as the old lady -in order to deceive her granddaughter. Luckily for the little -girl a woodsman arrived in time to rescue her. Parents are -being cautioned not to let their children wander about on -their own, and to remind them not to talk to strangers.\par -\framebreak - -The next day the wolf struck again, this time targeting two -pig brothers who had most incautiously made their dwellings -on the cheap using inadequate materials. The wolf also made -an attempt on the third pig brother, but was unable to break -into his house. - -Police are appealing to the public for witnesses and remind -people to keep their doors securely fastened at all times. - -``Always ask to see identification,'' said one police advisor, -``and invest in improving the general security of your property.'' - -\framebreak -\section{Tragic Wall Accident} - -{\parshape=6 0pt 13em 0pt 13em 0pt 11em 0pt 11em 0pt 13em -0pt 17em -An egg person tragically fell from a six foot wall yesterday -afternoon and was smash\-ed to pieces. The king's cavalry rushed -to the scene, but regretted that they were unable to help him. -\par} - -Humpty Dumpty was believed to be sitting -on the wall when he fell. Police have ruled out foul play, but -are advising people not to play on high walls, particularly -those vulnerable members of the population suffering from -eggshell syndrome. - -\begin{staticcontents*}{midhead} -\section{Relief as Missing Sheep Finally Return Home} -\end{staticcontents*} - -\framebreak -There was much celebration yesterday morning when Little Bo -Peep's sheep finally returned home. They had been missing -for more than a week. - -{\parshape=8 0pt \linewidth 0pt \linewidth 0pt \linewidth -0pt \linewidth 40pt 180pt 36pt 184pt 29pt 191pt -0pt \linewidth -``I just didn't know where to find them,'' the shepherdess -stated, ``but I was told to leave them alone and they'd come -home.'' Unusual advice perhaps, but it seems to have worked -as they did indeed come home. Eye witnesses reported that their -tails were wagging behind them. -``I'm just so happy they've come home,'' Little Bo Peep said -in a press conference yesterday\framebreak}afternoon. -The sheep themselves made no comment, and police are still -trying to determine what happened to them. - -\noindent\hrulefill - -This is a sample document illustrating the -flowfram package. It uses \TeX's \verb|\parshape| command -to create irregularly shaped paragraphs. - -\hfill Nicola Talbot -\framebreak - -\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/news2.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/news2.pdf deleted file mode 100644 index 62df0e2b448..00000000000 Binary files a/Master/texmf-dist/doc/latex/flowfram/samples/news2.pdf and /dev/null differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/news2.tex b/Master/texmf-dist/doc/latex/flowfram/samples/news2.tex deleted file mode 100644 index 125d5d3cd58..00000000000 --- a/Master/texmf-dist/doc/latex/flowfram/samples/news2.tex +++ /dev/null @@ -1,231 +0,0 @@ -\documentclass[12pt]{article} - -\usepackage{graphicx} -\usepackage{color} -\usepackage{flowfram} -\usepackage[a4paper,margin=20mm]{geometry} - -% define lengths to help compute positions -\newlength\leftX -\newlength\leftY -\newlength\leftH -\newlength\leftW - -\newlength\rightX -\newlength\rightY -\newlength\rightH -\newlength\rightW - -% Create a static frame to put title in -\setlength{\leftH}{3cm} -\setlength{\leftY}{\textheight} -\addtolength{\leftY}{-\leftH} - -\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[title] - -% Create left hand frame. This will have an L shape - -\setlength{\leftH}{13cm} -\adjustheight{\leftH} -\addtolength{\leftY}{-\leftH} - -\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[L] -\setstaticframe*{L}{shape={\parshape=24 -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt 0.5\linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -}} - -% egg picture - -\addtolength{\rightY}{\leftY} -\addtolength{\rightY}{73mm} -\setlength{\rightW}{0.9in} -\setlength{\rightH}{1.5in} -\setlength{\rightX}{\textwidth} -\addtolength{\rightX}{-\rightW} -\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[egg] - -% set contents -\setstaticcontents*{egg}{\includegraphics[scale=0.9]{egg}} - -% Right hand static frame - -\setlength{\rightX}{0.5\textwidth} -\addtolength{\rightX}{\columnsep} -\setlength{\rightW}{\textwidth} -\addtolength{\rightW}{-\rightX} -\setlength{\rightY}{\leftY} -\addtolength{\rightY}{2.8cm} -\setlength{\rightH}{\leftH} -\addtolength{\rightH}{-2.8cm} - -\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[right] - -\setstaticframe*{right}{shape={\parshape=15 -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt 0.75\linewidth -0pt 0.65\linewidth -0pt 0.75\linewidth -0pt 0.8\linewidth -0pt 0.8\linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -0pt \linewidth -}} - -% insert vertical and horizontal rules, can't use -% \insertrule as left hand -% frame is actually the width of the typeblock -\addtolength{\rightX}{-0.5\columnsep} -\newstaticframe[1]{0pt}{\rightH}{\rightX}{\rightY}[Lrule] -\setstaticcontents*{Lrule}{\makebox[0pt][l]{% -\rule{\columnseprule}{\rightH}\rule{\rightW}{\columnseprule}}} - -% middle heading - -\setlength{\leftH}{2cm} -\addtolength{\leftY}{-\leftH} - -\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[midhead] - -% insert horizontal rule -\inserthrule*{static}{L}{static}{midhead} - -% flow frames -\twocolumninarea{\textwidth}{\leftY}{0pt}{0pt} - -% static frame for sheep picture - -\newstaticframe[1]{1.6in}{1.6in}{0pt}{0pt}[sheep] - -% set contents -\setstaticcontents*{sheep}{\includegraphics[scale=1.2]{sheep}} - -\setcounter{secnumdepth}{0} -\setlength{\sdfparindent}{\parindent} - -\begin{document} -\begin{staticcontents*}{title} -\begin{center} -\bfseries\Huge -Fairy Tale Times -\end{center} -\hfill Issue 2. 7 December 2005. -\end{staticcontents*} - -\begin{staticcontents*}{L} -\section{Killer Wolf on the Loose} - -The authorites are warning of a killer wolf on the -loose. He has so far devoured an old grandmother and -two pig brothers. He is described as being furry with -big eyes and big teeth. - -On Monday this week he broke into a house, and devoured -an old lady. He then disguised himself as the old lady -in order to deceive her granddaughter. Luckily for the little -girl a woodsman arrived in time to rescue her. Parents are -being cautioned not to let their children wander about on -their own, and to remind them not to talk to strangers. - -The next day the wolf struck again, this time targeting two -pig brothers who had most incautiously made their dwellings -on the cheap using inadequate materials. The wolf also made -an attempt on the third pig brother, but was unable to break -into his house. - -Police are appealing to the public for witnesses and remind -people to keep their doors securely fastened at all times. -``Always ask to see identification,'' said one police advisor, -``and invest in improving the general security of your property.'' -\end{staticcontents*} - -\begin{staticcontents*}{right} -\section{Tragic Wall Accident} - -An egg person tragically fell from a six foot wall yesterday -afternoon and was smash\-ed to pieces. The king's cavalry rushed -to the scene, but regretted that they were unable to help him. - -Humpty Dumpty was believed to be sitting on the wall when he fell. Police have ruled out foul play, but -are advising people not to play on high walls, particularly -those vulnerable members of the population suffering from -eggshell syndrome. - -\small\em -%Wall related incidents this year: page 3 -% -Exclusive interview with one of the King's men on page 6 -\end{staticcontents*} - -\begin{staticcontents*}{midhead} -\section{Relief as Missing Sheep Finally Return Home} -\end{staticcontents*} - -There was much celebration yesterday morning when Little Bo -Peep's sheep finally returned home. They had been missing -for more than a week. - -``I just didn't know where to find them,'' the shepherdess -stated, ``but I was told to leave them alone and they'd come -home.'' - -\parshape=8 -0pt \linewidth -0pt \linewidth -0.3\linewidth 0.7\linewidth -0.3\linewidth 0.7\linewidth -0.25\linewidth 0.75\linewidth -0.25\linewidth 0.75\linewidth -0pt \linewidth -0pt \linewidth -Unusual advice perhaps, but it seems to have worked -as they did indeed come home. Eye witnesses reported that their -tails were wagging behind them. -``I'm just so happy they've come home,'' Little Bo Peep said -in a press conference yesterday afternoon. -The sheep themselves made no comment, and police are% -\framebreak\parshape=0 -still trying to determine what happened to them. -The big bad wolf is reportedly helping them with their inquiries. - -\noindent\hrulefill - -This is a sample document illustrating the -flowfram package. It uses \TeX's \verb|\parshape| command -to create irregularly shaped paragraphs. This can be a complicated -and somewhat tiresome task, and is generally not recommended. -Using the shapepar package provides you with more intricate -shapes, but as its documentation says, it is not intended -for use in large documents. - -\hfill Nicola Talbot -\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/poster.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/poster.pdf deleted file mode 100644 index ea499d7b56f..00000000000 Binary files a/Master/texmf-dist/doc/latex/flowfram/samples/poster.pdf and /dev/null differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/poster.tex b/Master/texmf-dist/doc/latex/flowfram/samples/poster.tex deleted file mode 100644 index 05fe2131f7d..00000000000 --- a/Master/texmf-dist/doc/latex/flowfram/samples/poster.tex +++ /dev/null @@ -1,363 +0,0 @@ -\documentclass[a0]{a0poster} - -\usepackage{color} -\usepackage{times} -\usepackage{courier} -\usepackage{helvet} -\usepackage{flowfram} - -% set up frames - -\setlength{\columnsep}{2cm} - -% Base the page layout on 4 column with static header. -% The static frame has height = 0.2\textheight -\NcolumnStop{4}{0.2\textheight} -% give the static frame a label to make it easier to keep track of -\setstaticframe{\value{maxstatic}}{label={title},backcolor=[cmyk]{0.64,0,0.95,0.40},textcolor=white} - -% Insert a vertical line between flow frames 2 and 3: -\insertvrule{flow}{2}{flow}{3} - -% On the first page, replace last two columns with -% 2 columns and a static underneath -\setflowframe{3,4}{pages={>1}} - -\computeflowframearea{3,4} -\twocolumnSbottominarea[1]{0.5\ffareaheight}{\ffareawidth}{\ffareaheight}{\ffareax}{\ffareay} -\setstaticframe{\value{maxstatic}}{label={info},backcolor=[cmyk]{0.26,0,0.76,0},clear} - -% insert a horizontal rule between flow frame 5 and static -% frame 5 -\inserthrule*[0.5\columnsep]{flow}{5}{static}{info} - -\setallflowframes{backcolor=[cmyk]{0.15,0,0.69,0}} - -\newcommand{\sty}[1]{\textsf{#1}} -\newcommand{\env}[1]{\textsf{#1}} -\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} -\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} - -%\raggedright -%\setlength{\parindent}{15pt} - -\begin{document} -\begin{staticcontents*}{title} -\begin{center} -\bfseries\veryHuge flowframe.sty : Creating Posters, Magazines or Brochures in \LaTeX -\vskip1cm -\huge Nicola L. C. Talbot -\vskip2ex -\normalsize \verb"http://theoval.cmp.uea.ac.uk/~nlct/" -\end{center} -\end{staticcontents*} - -\pagestyle{empty} - -\begin{staticcontents*}{info} -\begin{staticfigure} - -\begin{verbatim} - % Make the distance between columns = 1.5cm - \setlength{\columnsep}{2cm} - - % Make a 4 column layout with a static frame on top. - % The static frame has height = 0.2\textheight - \NcolumnStop{4}{0.2\textheight} - - % give the static frame a label to make it easier to keep track of - \setstaticframe{\value{maxstatic}}{label={title},backcolor=[cmyk]{0.64,0,0.95,0.40},textcolor=white} - - % On the first page, replace the 3rd and 4th columns - % with two shorter columns with a static frame underneath - \setflowframe{3,4}{pages={>1}} - - % The area taken up by the 3rd and 4th columns is given by - \computeflowframearea{3,4} - - % Set up new frames in this area - \twocolumnSbottominarea[1]{0.5}{\ffareawidth}{\ffareaheight}{\ffareax}{\ffareay} - - % Assign a label to the last static frame to be created, and set background colour - \setstaticframe{\value{maxstatic}}{label={info},backcolor=[cmyk]{0.26,0,0.76,0}} - - % Set the background colour for all flow frames - \setallflowframes{backcolor=[cmyk]{0.15,0,0.69,0}} -\end{verbatim} - -\caption{The commands used to define the frames for this document} -\protect\label{fig:thisdoc} -\end{staticfigure} -\end{staticcontents*} - -This is a modified version of the manual for the \sty{flowfram} -package. It is intended to illustrated what can be done. See the -full manual (ffuserguide.pdf) for -a comprehensive description, as this may now be out of date. The commands used to define the frames for -this document are shown in Figure~\ref{fig:thisdoc}. -If the columns are very narrow, it may be better to -use \cmdname{raggedright}, otherwise \TeX\ may have a -problem working out the line breaks. - -\section{Introduction} - -The \sty{flowfram} package is designed to enable you to create -frames in a document such that the -contents of the \env{document} environment flow from one -frame to the next in the order that they were defined. -This is useful for creating posters -or magazines or any other form of document that does not -conform to the standard one or two column layout. - -\section{Setting up Frames} - -The \sty{flowfram} package provides three types of frame: -{flow frames}, {static -frames} and {dynamic frames}. - -\subsection{Flow Frames} - -The flow frame is the principle type of frame. -The text of the \env{document} environment will flow from -one frame to the next in order of definition. Each -flow frame has an associated width, height, -position on the page, and optionally a border. - -It is recommended that all the flow frames in a document -have the same width, otherwise problems may occur -when a paragraph spans to flow frames of unequal -widths. This is because \TeX's output routine does not -register the change in \cmdname{hsize} until it reaches -a paragraph break. If it is absolutely necessary for -flow frames to have unequal widths, judicious use of -\cmdname{framebreak} is required. - -\subsection{Static Frames} - -A static frame is a rectangular area in which text neither -flows into, nor flows out of. The contents must be set -explicitly, and once set, the contents of the static frame will -remain the same on each page until it is explicitly -changed. Thus, a static frame can be used, for example, to make -a company logo appear in the same place on every page. - -\subsection{Dynamic Frames} - -A dynamic frame is similar to a static frame, but its contents -are re-typeset on each page. (A static frame stores its -contents in a savebox, whereas a dynamic frame stores its -contents in a macro). - -\section{Frame Attributes} -\label{sec:modattr} - -Once you have defined the {flow frames}, {static frames} and -{dynamic frames}, their attributes can be changed. -The three types of frame mostly have the -same set of attributes, but some are specific to a certain type. -The available attributes are as follows -(\textsuperscript{\textbf{F}} indicates the key is -only available for {flow frames}, -\textsuperscript{\textbf{S}} indicates the key is only available -for {static frames} -and \textsuperscript{\textbf{D}} indicates the key -is only available for {dynamic frames}): - -\begin{description} -\item[width=\meta{length}] The width of the frame. - -\item[height=\meta{length}] The height of the frame. - -\item[x=\meta{length}] The x-coordinate of the frame. - -\item[y=\meta{length}] The y-coordinate of the frame. - -\item[border=\meta{style}] The style of the border around the -frame, this can take the values: \texttt{none} (no border), -\texttt{plain} (plain border) or the name of a \LaTeX\ -frame making command without the preceding backslash. -The value \texttt{fbox} is equivalent to \texttt{plain}. - -\item[offset=\meta{offset}] The border offset, if it is a -user-defined border. This is the distance from the outer -edge of the left hand border to the left edge of the -bounding box of the text inside the border. The \sty{flowfram} -package is able to compute the border for -known frame making commands. -If you define your own frame making command, you may need to -specify the offset explicitly, or the frames -may end up shifted to the right or left. - -\item[bordercolor=\meta{colour}] The colour of the border -if you are using a standard frame making command. -The colour can either be specified as, e.g.\ \texttt{green}, -or including the colour model, e.g. \verb/[rgb]{0,1,0}/. - -\item[textcolor=\meta{colour}] The text colour for that -frame. Again, the colour can either be specified as, -e.g.\ \texttt{green}, or including the colour model, -e.g. \verb/[rgb]{0,1,0}/. - -\item[pages=\meta{page list}] The {list of -pages} for which the frame -should appear. This can either have the values: \texttt{all}, -\texttt{even}, \texttt{odd} or \texttt{none} (the latter -removes the frame from that point on---useful if you -have multiple pages with the same number), or it can be a -comma-separated list of single pages, or -{page ranges}. - -\item[margin=\meta{side}\textsuperscript{F}] The side of -the flow frame that its corresponding margin should go on. This -can take the values \texttt{left} or \texttt{right}. - -\item[clear=\meta{boolean}\textsuperscript{S}] If this value -is set, the static frame will be cleared at the start of the -next page. - -\item[style=\meta{cmd}\textsuperscript{D}] This should be -the name of a command \emph{without} the preceding backslash, -to be applied to the contents of the specified dynamic frame. -The command may either be a declaration, for example \verb/style=large/ -which will set the contents of all the dynamic frames in a -large font, or it can be a command that takes a single argument, -for example \verb/style=textbf/ -which will make the text for all the dynamic frames come out in -bold. To unset a style, do \verb/style=none/. - -\end{description} - -\section{Miscellaneous} - -\subsection{Page Layout} - -The \sty{flowfram} package has the package option \texttt{draft} -which will draw the {bounding boxes} for -each frame defined. At the bottom right of each -bounding box (except for the bounding box denoting the -typeblock), a marker will be shown to indictate the type -of frame, its IDN and its IDL. - -You can see the layout for the current page (irrespective of -whether or not the \texttt{draft} option has been set) using -the command:\newline -\cmdname{flowframeshowlayout} - -The headers and footers will appear as usual (but will not -be shown in draft mode), according to the format given by -\cmdname{pagestyle}. - -\subsection{Frame Stacking Order} - -The material on each page is placed in the following order: -\begin{enumerate} -\item Each static frame defined for that page in ascending -order of IDN. - -\item Each flow frame defined for that page in ascending -order of IDN. - -\item Each dynamic frame defined for that page in ascending -order of IDN. - -\item {Bounding boxes} if the \texttt{draft} -package option has been used. -\end{enumerate} - -This ordering can be used to determine if you want something -to overlay or underlay everything else on the page. - -\subsection{Prematurely Ending a Flow Frame} - -You can force text to move immediately to the next defined -flow frame using one of the standard \LaTeX\ page breaking commands -which work in an analogous way to the way they -work in standard two column mode. - -The command \cmdname{framebreak} is provided for situations -where a paragraph spans two flow frames -of different widths, as \TeX's output routine does not -adjust to the new value of \cmdname{hsize} until the last -paragraph of the previous frame has ended. As a -result, the end of the paragraph at the beginning of the new -flow frame retains the width of the previous flow frame. - -If you want to start a new page, rather than simply move to the -next frame, use the command\newline -\cmdname{finishthispage}. - -\subsection{Floats} - -Since floats (such as figures and tables) can only go in -{flow frames}, this package provides -the additional environments: -\env{staticfigure} and -\env{statictable} which can be used in static frames -and dynamic frames. Unlike their \env{figure} and -\env{table} counterparts, they are fixed in place, and -so do not take an optional placement specifier. The -\cmdname{caption} and \cmdname{label} commands can -be used within \env{staticfigure} and \env{statictable} as -usual. - -The standard \env{figure} and \env{table} commands will -behave as usual in the flow frames, but their starred versions, -\env{figure*} and \env{table*} behave no differently -from \env{figure} and \env{table}. - -\subsection{Global Values} - -The following macros can be changed using \cmdname{renewcommand}: - -\begin{itemize} -\item \cmdname{setffdraftcolor} - -This sets the colour of the bounding box -when it is displayed in draft mode. - -\item -\cmdname{setffdrafttypeblockcolor} - -This sets the colour of -the bounding box of the typeblock when it is displayed -in draft mode. - -\item \cmdname{fflabelfont} - -This sets the font size for the bounding box markers in -draft mode. - -\end{itemize} - -The following are lengths, which can be changed using -\cmdname{setlength}: - -\begin{itemize} -\item \cmdname{fflabelsep} - -This is the distance from the right hand side of the -bounding box at which to place the bounding box marker. - -\item \cmdname{flowframesep} - -This is the gap between the text of the frame and -its border, for the standard border types. - -\item \cmdname{flowframerule} - -This is the width of the frame's border, if using -a border given by a frame making command that uses \cmdname{fboxsep} -to set its border width. - -\item \cmdname{columnsep} - -This is the horizontal distance between flow frames when using one of the -\cmdname{Ncolumn} type of commands - -\item \cmdname{vcolumnsep} - -This is the vertical distance between the flow frames and the static or -dynamic frame when using one of the \cmdname{Ncolumntop} type of commands. -\end{itemize} - -\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-article.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample-article.pdf new file mode 100644 index 00000000000..02743025742 Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample-article.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-article.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample-article.tex new file mode 100644 index 00000000000..ba165bd9bee --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample-article.tex @@ -0,0 +1,283 @@ + % This file is public domain. + +\documentclass[a4paper]{article} + +\usepackage[margin=1in,top=1in,bottom=1in]{geometry} +\usepackage{url} +\usepackage{color} +\usepackage{flowfram} + +\newcommand{\sty}[1]{\textsf{#1}} +\newcommand{\env}[1]{\textsf{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + + +\twocolumnStop[1]{2in} +\setstaticframe{1}{label=title} + +\twocolumn[>1] + +\begin{document} +\begin{staticcontents*}{title} +\title{Creating Flow Frames for Posters or Magazines} +\author{Nicola L. C. Talbot\\[1cm]\url{http://www.dickimaw-books.com/}} +\date{} +\maketitle +\end{staticcontents*} + +This document is a sample document, see \linebreak +\texttt{ffuserguide.pdf} for +an up-to-date guide on how to use the \sty{flowfram} package. + +\section{Introduction} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters\marginpar{A marginal note} +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +\subsection{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\subsubsection{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border\footnote{A +footnote!}. + +\subsubsection{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\subsubsection{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\section{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\section{Miscellaneous} + +\subsection{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\subsection{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\subsection{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\subsection{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\subsection{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: +\marginpar{Another marginal note} + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. +\end{itemize} + +\section*{Contact Details} + +Dr Nicola Talbot\\ +Dickimaw Books\\ +\url{http://www.dickimaw-books.com/} + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-blanks.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample-blanks.tex new file mode 100644 index 00000000000..6296b14f576 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample-blanks.tex @@ -0,0 +1,19 @@ + % This file is public domain. + +\documentclass{article} + +\usepackage{lipsum} +\usepackage[draft]{flowfram} + +\onecolumn[odd] + +\newdynamicframe{1in}{1in}{-1in}{-1in} +\setdynamiccontents{1}{\arabic{absolutepage}-\arabic{page}} + +\begin{document} + +\lipsum[1-4] + +\lipsum[1-4] + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-brochure.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample-brochure.pdf new file mode 100644 index 00000000000..f94e4e2451a Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample-brochure.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-brochure.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample-brochure.tex new file mode 100644 index 00000000000..c1b499a0248 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample-brochure.tex @@ -0,0 +1,345 @@ + % This file is public domain. + +\documentclass[a4paper]{report} + +\usepackage[landscape,margin=1in]{geometry} +\usepackage{color} +\usepackage{flowfram} +\usepackage[colorlinks]{hyperref} + +\renewcommand{\familydefault}{cmss} + +\adjustheight{\textheight} + +\onecolumninarea[1,2]{0.6\textwidth}{\textheight}{0.4\textwidth}{0pt} +\twocolumninarea[>2]{0.6\textwidth}{\textheight}{0.4\textwidth}{0pt} + + +\newdynamicframe{0.4\textwidth}{\textheight}{0pt}{0pt}[left] + +\dfchaphead*{left} +\renewcommand{\DFchapterstyle}[1]{% +\raggedright\Huge\slshape\MakeUppercase{#1}\par} + +\vtwotone[1]{0.6\paperwidth}{[cmyk]{0.65,0.13,0,0}}{backleft}% +{0.4\paperwidth}{[cmyk]{0.94,0.54,0,0}}{backright} + +\vtwotonetop{1cm}{0.6\paperwidth}{[cmyk]{0.65,0.13,0,0}}{topleft}% +{0.4\paperwidth}{[cmyk]{0.94,0.54,0,0}}{topright} + +\newstaticframe{0.2\textwidth}{0.25\textheight}{0pt}{0pt}[logo] + +\pagestyle{empty} + +\renewcommand{\chapterfirstpagestyle}{empty} + +\newdynamicframe[>1]{\textwidth}{\headheight}{0pt}{-\footskip}[footer] + +\setdynamiccontents*{footer}{% +School of Computing Sciences, University of East Anglia\hfill +http://www.cmp.uea.ac.uk/\hfill +page \thepage\ of \pageref*{lastpage}} + +\newcommand{\env}[1]{\texttt{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + +\begin{document} + +\setstaticcontents*{logo}{\sffamily{\Huge\slshape FLF} Flowfram} + +{\noindent +\slshape\Huge\MakeUppercase{A Sample Brochure}\par +\vskip0.5in +\noindent\large\MakeUppercase{Nicola Talbot}\\ +} + +\chapter{Introduction} + +The \textsl{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +This is a modified version of the manual for the \textsl{flowfram} package. +It is intended to illustrated what can be done. See the full +manual (ffuserguide.pdf) for +a comprehensive description, as some parts of this document +may now be out of date. +If the columns are very narrow, it may be better to +use \cmdname{raggedright}, otherwise \TeX\ may have a +problem working out the line breaks. + +This is column~\thedisplayedframe. + +The main type of frame is the flow frame. This is described on +column~\ref{flow:flowframe} on page~\pageref{flow:flowframe}. +The order used to draw the contents of each frame on the page +is described in column~\ref{flow:stacking} on +page~\pageref{flow:stacking}. Floats are describe in +column~\ref{flow:floats} on page~\pageref{flow:floats}. + +\chapter{Setting up Frames} + +This is column~\thedisplayedframe. + +The \textsl{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\section*{Flow Frames} + +\labelflow{flow:flowframe} +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border. + +It is recommended that all the flow frames in a document +have the same width, otherwise problems may occur +when a paragraph spans to flow frames of unequal +widths. This is because \TeX's output routine does not +register the change in \cmdname{hsize} until it reaches +a paragraph break. If it is absolutely necessary for +flow frames to have unequal widths, judicious use of +\cmdname{framebreak} is required. + +\section*{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\section*{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +This is column~\thedisplayedframe. + +\chapter{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}]\mbox{}\par The width of the frame. + +\item[height=\meta{length}]\mbox{}\par The height of the frame. + +\item[x=\meta{length}]\mbox{}\par The x-coordinate of the frame. + +\item[y=\meta{length}]\mbox{}\par The y-coordinate of the frame. + +\item[border=\meta{style}]\mbox{}\par The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}]\mbox{}\par The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \textsl{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}]\mbox{}\par The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, for example +\verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}]\mbox{}\par The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +for example \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}]\mbox{}\par The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}]\mbox{}\par The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}]\mbox{}\par This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\chapter{Miscellaneous} + +\section*{Page Layout} + +The \textsl{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\section*{Frame Stacking Order} + +\labelflow{flow:stacking} +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\section*{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\section*{Floats} + +\labelflow{flow:floats} +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\section*{Global Values} + +The following macros can be changed using\linebreak \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. + +\item \cmdname{columnsep} + +This is the horizontal distance between flow frames when using one of the +\cmdname{Ncolumn} type of commands + +\item \cmdname{vcolumnsep} + +This is the vertical distance between the flow frames and the static or +dynamic frame when using one of the \cmdname{Ncolumntop} type of commands. +\end{itemize} + +\label{lastpage} +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-news.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample-news.pdf new file mode 100644 index 00000000000..bfbd33ee0d2 Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample-news.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-news.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample-news.tex new file mode 100644 index 00000000000..d3f98184ff9 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample-news.tex @@ -0,0 +1,189 @@ + % This file is public domain. + +\documentclass{article} + +\usepackage{color} +\usepackage{flowfram} +\usepackage[a5paper,top=10mm,bottom=10mm,margin=10mm]{geometry} +\usepackage{graphicx} + +\newlength\leftX +\newlength\leftY +\newlength\leftH +\newlength\leftW + +\newlength\rightX +\newlength\rightY +\newlength\rightH +\newlength\rightW + +\setlength{\leftH}{2cm} +\setlength{\leftY}{\textheight} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[title] + + +\setlength{\leftH}{7cm} +\adjustheight{\leftH} +\addtolength{\leftY}{-\leftH} +\setlength{\leftW}{0.5\textwidth} + +\newflowframe[1]{\leftW}{\leftH}{0pt}{\leftY} + +\setlength{\rightH}{\leftH} +\setlength{\rightY}{\leftY} + + +\setlength{\leftH}{3.5cm} +\adjustheight{\leftH} +\addtolength{\leftY}{-\leftH} + +\newflowframe[1]{\textwidth}{\leftH}{0pt}{\leftY} + + +\setlength{\rightX}{\leftW} +\addtolength{\rightX}{\columnsep} +\setlength{\rightW}{\textwidth} +\addtolength{\rightW}{-\rightX} + +\newflowframe[1]{\rightW}{\rightH}{\rightX}{\rightY} + + +\insertvrule{flow}{1}{flow}{3} + + +\addtolength{\rightX}{-0.5\columnsep} +\addtolength{\rightX}{-0.5\columnseprule} +\inserthrule[-\rightX]{flow}{3}{flow}{2} + + +\addtolength{\rightY}{\rightH} +\addtolength{\rightY}{-10mm} +\setlength{\rightW}{0.75in} +\setlength{\rightH}{0.8in} +\addtolength{\rightY}{-\rightH} +\setlength{\rightX}{\textwidth} +\addtolength{\rightX}{-\rightW} +\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[egg] + +\setstaticcontents*{egg}{\includegraphics[scale=0.75]{egg}} + + +\setlength{\leftH}{2cm} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[midhead] + +\inserthrule*{flow}{2}{static}{midhead} + + +\setlength{\leftH}{\leftY} +\adjustheight{\leftH} +\setlength{\leftW}{0.6\textwidth} + +\newflowframe[1]{\leftW}{\leftH}{0pt}{0pt} + + +\setlength{\rightX}{\leftW} +\addtolength{\rightX}{\columnsep} +\setlength{\rightW}{\textwidth} +\addtolength{\rightW}{-\rightX} + +\newflowframe[1]{\rightW}{\leftH}{\rightX}{0pt} + + +\newstaticframe[1]{0.8in}{0.8in}{0pt}{0pt}[sheep] + +\setstaticcontents*{sheep}{\includegraphics[scale=0.75]{sheep}} + +\onecolumn[>1] % for any text that falls off the last page + +\setcounter{secnumdepth}{0} +\pagestyle{empty} + +\begin{document} + +\begin{staticcontents*}{title} +\begin{center} +\bfseries\Huge +Fairy Tale Times +\end{center} +\hfill Issue 1. 20 November 2005. +\end{staticcontents*} + +\section{Killer Wolf on the Loose} + +The authorites are warning of a killer wolf on the +loose. He has so far devoured an old grandmother and +two pig brothers. He is described as being furry with +big eyes and big teeth. + +On Monday this week he broke into a house, and devoured +an old lady. He then disguised himself as the old lady +in order to deceive her granddaughter. Luckily for the little +girl a woodsman arrived in time to rescue her. Parents are +being cautioned not to let their children wander about on +their own, and to remind them not to talk to strangers.\par +\framebreak + +The next day the wolf struck again, this time targeting two +pig brothers who had most incautiously made their dwellings +on the cheap using inadequate materials. The wolf also made +an attempt on the third pig brother, but was unable to break +into his house. + +Police are appealing to the public for witnesses and remind +people to keep their doors securely fastened at all times. + +``Always ask to see identification,'' said one police advisor, +``and invest in improving the general security of your property.'' + +\framebreak +\section{Tragic Wall Accident} + +{\parshape=6 0pt 13em 0pt 13em 0pt 11em 0pt 11em 0pt 13em +0pt 17em +An egg person tragically fell from a six foot wall yesterday +afternoon and was smash\-ed to pieces. The king's cavalry rushed +to the scene, but regretted that they were unable to help him. +\par} + +Humpty Dumpty was believed to be sitting +on the wall when he fell. Police have ruled out foul play, but +are advising people not to play on high walls, particularly +those vulnerable members of the population suffering from +eggshell syndrome. + +\begin{staticcontents*}{midhead} +\section{Relief as Missing Sheep Finally Return Home} +\end{staticcontents*} + +\framebreak +There was much celebration yesterday morning when Little Bo +Peep's sheep finally returned home. They had been missing +for more than a week. + +{\parshape=8 0pt \linewidth 0pt \linewidth 0pt \linewidth +0pt \linewidth 40pt 180pt 36pt 184pt 29pt 191pt +0pt \linewidth +``I just didn't know where to find them,'' the shepherdess +stated, ``but I was told to leave them alone and they'd come +home.'' Unusual advice perhaps, but it seems to have worked +as they did indeed come home. Eye witnesses reported that their +tails were wagging behind them. +``I'm just so happy they've come home,'' Little Bo Peep said +in a press conference yesterday\framebreak}afternoon. +The sheep themselves made no comment, and police are still +trying to determine what happened to them. + +\noindent\hrulefill + +This is a sample document illustrating the +flowfram package. It uses \TeX's \verb|\parshape| command +to create irregularly shaped paragraphs. + +\hfill Nicola Talbot +\framebreak + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-news2.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample-news2.pdf new file mode 100644 index 00000000000..792b51492a1 Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample-news2.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-news2.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample-news2.tex new file mode 100644 index 00000000000..8752e95a771 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample-news2.tex @@ -0,0 +1,217 @@ + % This file is public domain. + +\documentclass[12pt]{article} + +\usepackage{graphicx} +\usepackage{color} +\usepackage{flowfram} +\usepackage[a4paper,margin=20mm]{geometry} + +\newlength\leftX +\newlength\leftY +\newlength\leftH +\newlength\leftW + +\newlength\rightX +\newlength\rightY +\newlength\rightH +\newlength\rightW + +\setlength{\leftH}{3cm} +\setlength{\leftY}{\textheight} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[title] + + +\setlength{\leftH}{13cm} +\adjustheight{\leftH} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[L] +\setstaticframe*{L}{shape={\parshape=24 +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +}} + + +\addtolength{\rightY}{\leftY} +\addtolength{\rightY}{73mm} +\setlength{\rightW}{0.9in} +\setlength{\rightH}{1.5in} +\setlength{\rightX}{\textwidth} +\addtolength{\rightX}{-\rightW} +\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[egg] + +\setstaticcontents*{egg}{\includegraphics[scale=0.9]{egg}} + + +\setlength{\rightX}{0.5\textwidth} +\addtolength{\rightX}{\columnsep} +\setlength{\rightW}{\textwidth} +\addtolength{\rightW}{-\rightX} +\setlength{\rightY}{\leftY} +\addtolength{\rightY}{2.8cm} +\setlength{\rightH}{\leftH} +\addtolength{\rightH}{-2.8cm} + +\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[right] + +\setstaticframe*{right}{shape={\parshape=15 +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt 0.75\linewidth +0pt 0.65\linewidth +0pt 0.75\linewidth +0pt 0.8\linewidth +0pt 0.8\linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +}} + +\addtolength{\rightX}{-0.5\columnsep} +\newstaticframe[1]{0pt}{\rightH}{\rightX}{\rightY}[Lrule] +\setstaticcontents*{Lrule}{\makebox[0pt][l]{% +\rule{\columnseprule}{\rightH}\rule{\rightW}{\columnseprule}}} + + +\setlength{\leftH}{2cm} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[midhead] + +\inserthrule*{static}{L}{static}{midhead} + +\twocolumninarea{\textwidth}{\leftY}{0pt}{0pt} + + +\newstaticframe[1]{1.6in}{1.6in}{0pt}{0pt}[sheep] + +\setstaticcontents*{sheep}{\includegraphics[scale=1.2]{sheep}} + +\setcounter{secnumdepth}{0} +\setlength{\sdfparindent}{\parindent} + +\begin{document} +\begin{staticcontents*}{title} +\begin{center} +\bfseries\Huge +Fairy Tale Times +\end{center} +\hfill Issue 2. 7 December 2005. +\end{staticcontents*} + +\begin{staticcontents*}{L} +\section{Killer Wolf on the Loose} + +The authorites are warning of a killer wolf on the +loose. He has so far devoured an old grandmother and +two pig brothers. He is described as being furry with +big eyes and big teeth. + +On Monday this week he broke into a house, and devoured +an old lady. He then disguised himself as the old lady +in order to deceive her granddaughter. Luckily for the little +girl a woodsman arrived in time to rescue her. Parents are +being cautioned not to let their children wander about on +their own, and to remind them not to talk to strangers. + +The next day the wolf struck again, this time targeting two +pig brothers who had most incautiously made their dwellings +on the cheap using inadequate materials. The wolf also made +an attempt on the third pig brother, but was unable to break +into his house. + +Police are appealing to the public for witnesses and remind +people to keep their doors securely fastened at all times. +``Always ask to see identification,'' said one police advisor, +``and invest in improving the general security of your property.'' +\end{staticcontents*} + +\begin{staticcontents*}{right} +\section{Tragic Wall Accident} + +An egg person tragically fell from a six foot wall yesterday +afternoon and was smash\-ed to pieces. The king's cavalry rushed +to the scene, but regretted that they were unable to help him. + +Humpty Dumpty was believed to be sitting on the wall when he fell. Police have ruled out foul play, but +are advising people not to play on high walls, particularly +those vulnerable members of the population suffering from +eggshell syndrome. + +\small\em +Exclusive interview with one of the King's men on page 6 +\end{staticcontents*} + +\begin{staticcontents*}{midhead} +\section{Relief as Missing Sheep Finally Return Home} +\end{staticcontents*} + +There was much celebration yesterday morning when Little Bo +Peep's sheep finally returned home. They had been missing +for more than a week. + +``I just didn't know where to find them,'' the shepherdess +stated, ``but I was told to leave them alone and they'd come +home.'' + +\parshape=8 +0pt \linewidth +0pt \linewidth +0.3\linewidth 0.7\linewidth +0.3\linewidth 0.7\linewidth +0.25\linewidth 0.75\linewidth +0.25\linewidth 0.75\linewidth +0pt \linewidth +0pt \linewidth +Unusual advice perhaps, but it seems to have worked +as they did indeed come home. Eye witnesses reported that their +tails were wagging behind them. +``I'm just so happy they've come home,'' Little Bo Peep said +in a press conference yesterday afternoon. +The sheep themselves made no comment, and police are% +\framebreak\parshape=0 +still trying to determine what happened to them. +The big bad wolf is reportedly helping them with their inquiries. + +\noindent\hrulefill + +This is a sample document illustrating the +flowfram package. It uses \TeX's \verb|\parshape| command +to create irregularly shaped paragraphs. This can be a complicated +and somewhat tiresome task, and is generally not recommended. +Using the shapepar package provides you with more intricate +shapes, but as its documentation says, it is not intended +for use in large documents. + +\hfill Nicola Talbot +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-pages.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample-pages.pdf new file mode 100644 index 00000000000..4e8532796e9 Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample-pages.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-pages.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample-pages.tex new file mode 100644 index 00000000000..38e52856a4c --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample-pages.tex @@ -0,0 +1,104 @@ + % This file is public domain. + +\documentclass{book} + +\usepackage[demo]{graphicx} +\usepackage{lipsum} +\usepackage{color} +\usepackage[ + draft, + verbose, + pages=absolute + ]{flowfram} + +\onecolumn + +\setflowframe{1}{label=single} + +\twocolumnDtop[none]{2in} + +\setdynamicframe{1}{label=title} +\setflowframe{2}{label=shortleft} +\setflowframe{3}{label=shortright} + +\twocolumn[none] + +\setflowframe{4}{label=left} +\setflowframe{5}{label=right} + +\newdynamicframe[none]{\textwidth}{\textheight}{0pt}{0pt}[image] + +\setdynamicframe*{image}{valign=c} + +\title{Sample Document} +\author{A.N. Other} + +\begin{document}\raggedright +\maketitle + +\frontmatter +\tableofcontents +\chapter{Acknowledgements} + +\lipsum[1] + +\flowswitchoffnextodd*{single}% +\flowswitchonnextoddonly*{shortleft,shortright}% +\dynamicswitchonnextoddonly*{title}% +\dfchaphead*{title} + +\mainmatter +\chapter{Sample} + +\flowswitchonnext*{left,right}% +\renewcommand{\ffprechapterhook}{% + \flowswitchoffnextoddonly*{left,right}% + \flowswitchonnextoddonly*{shortleft,shortright}% + \dynamicswitchonnextoddonly*{title}% +} + +\lipsum + +\lipsum + +\chapter{Another Sample Chapter} + +\lipsum[1-20] + + +\flowswitchoffnextonly*{left,right} +\flowswitchonnextonly*{single} + +\clearpage + +\begin{figure}[p] +\centering + \includegraphics{image1} +\caption{A Sample Figure} +\label{fig:sample} +\end{figure} + +\clearpage + +\lipsum[21-30] + +\chapter{Here's Another Chapter} + +\lipsum[1-20] + + +\flowswitchoffnextonly*{left,right} +\dynamicswitchonnextonly*{image} + +\setdynamiccontents*{image}{% + \begin{staticfigure} + \centering + \includegraphics{image2} + \caption{Another Sample Figure} + \label{fig:sample2} + \end{staticfigure} +} + +\lipsum[21-40] + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-poster.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample-poster.pdf new file mode 100644 index 00000000000..9097577037b Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample-poster.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-poster.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample-poster.tex new file mode 100644 index 00000000000..c8d2784525e --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample-poster.tex @@ -0,0 +1,355 @@ + % This file is public domain. + +\documentclass[a0]{a0poster} + +\usepackage{color} +\usepackage{mathptmx} +\usepackage{courier} +\usepackage[scaled=0.92]{helvet} +\usepackage{url} +\usepackage{flowfram} + + +\setlength{\columnsep}{2cm} + +\NcolumnStop{4}{0.2\textheight} +\setstaticframe{\value{maxstatic}}{label={title},backcolor=[cmyk]{0.64,0,0.95,0.40},textcolor=white} + +\insertvrule{flow}{2}{flow}{3} + +\setflowframe{3,4}{pages={>1}} + +\computeflowframearea{3,4} +\twocolumnSbottominarea[1]{0.5\ffareaheight}{\ffareawidth}{\ffareaheight}{\ffareax}{\ffareay} +\setstaticframe{\value{maxstatic}}{label={info},backcolor=[cmyk]{0.26,0,0.76,0},clear} + +\inserthrule*[0.5\columnsep]{flow}{5}{static}{info} + +\setallflowframes{backcolor=[cmyk]{0.15,0,0.69,0}} + +\newcommand{\sty}[1]{\textsf{#1}} +\newcommand{\env}[1]{\textsf{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + + +\begin{document} +\begin{staticcontents*}{title} +\begin{center} +\bfseries\veryHuge flowframe.sty : Creating Posters, Magazines or Brochures in \LaTeX +\vskip1cm +\huge Nicola L. C. Talbot +\vskip2ex +\normalsize \url{http://www.dickimaw-books.com/} +\end{center} +\end{staticcontents*} + +\pagestyle{empty} + +\begin{staticcontents*}{info} +\begin{staticfigure} + +\begin{verbatim} + % Make the distance between columns = 1.5cm + \setlength{\columnsep}{2cm} + + % Make a 4 column layout with a static frame on top. + % The static frame has height = 0.2\textheight + \NcolumnStop{4}{0.2\textheight} + + % give the static frame a label to make it easier to keep track of + \setstaticframe{\value{maxstatic}}{label={title},backcolor=[cmyk]{0.64,0,0.95,0.40},textcolor=white} + + % On the first page, replace the 3rd and 4th columns + % with two shorter columns with a static frame underneath + \setflowframe{3,4}{pages={>1}} + + % The area taken up by the 3rd and 4th columns is given by + \computeflowframearea{3,4} + + % Set up new frames in this area + \twocolumnSbottominarea[1]{0.5}{\ffareawidth}{\ffareaheight}{\ffareax}{\ffareay} + + % Assign a label to the last static frame to be created, and set background colour + \setstaticframe{\value{maxstatic}}{label={info},backcolor=[cmyk]{0.26,0,0.76,0}} + + % Set the background colour for all flow frames + \setallflowframes{backcolor=[cmyk]{0.15,0,0.69,0}} +\end{verbatim} + +\caption{The commands used to define the frames for this document} +\protect\label{fig:thisdoc} +\end{staticfigure} +\end{staticcontents*} + +This is a modified version of the manual for the \sty{flowfram} +package. It is intended to illustrated what can be done. See the +full manual (ffuserguide.pdf) for +a comprehensive description, as this may now be out of date. The commands used to define the frames for +this document are shown in Figure~\ref{fig:thisdoc}. +If the columns are very narrow, it may be better to +use \cmdname{raggedright}, otherwise \TeX\ may have a +problem working out the line breaks. + +\section{Introduction} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +\section{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\subsection{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border. + +It is recommended that all the flow frames in a document +have the same width, otherwise problems may occur +when a paragraph spans to flow frames of unequal +widths. This is because \TeX's output routine does not +register the change in \cmdname{hsize} until it reaches +a paragraph break. If it is absolutely necessary for +flow frames to have unequal widths, judicious use of +\cmdname{framebreak} is required. + +\subsection{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\subsection{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\section{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\section{Miscellaneous} + +\subsection{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\subsection{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\subsection{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\subsection{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\subsection{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. + +\item \cmdname{columnsep} + +This is the horizontal distance between flow frames when using one of the +\cmdname{Ncolumn} type of commands + +\item \cmdname{vcolumnsep} + +This is the vertical distance between the flow frames and the static or +dynamic frame when using one of the \cmdname{Ncolumntop} type of commands. +\end{itemize} + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-rot.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample-rot.pdf new file mode 100644 index 00000000000..88dc5e0b92e Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample-rot.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample-rot.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample-rot.tex new file mode 100644 index 00000000000..f62944db3ae --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample-rot.tex @@ -0,0 +1,49 @@ + % This file is public domain. + +\documentclass[a4paper]{article} + +\usepackage[draft]{flowfram} +\usepackage{supertabular} + +\newflowframe{0.3\textwidth}{0.25\textheight}{0.5\textwidth}{0.5\textheight} + +\newflowframe{0.3\textwidth}{0.2\textheight}{0pt}{0.1\textheight} + +\newflowframe{0.3\textwidth}{0.2\textheight}{0.5\textwidth}{0.1\textheight} + +\setflowframe{1}{angle=45} +\setflowframe{3}{angle=90} + +\begin{document} + +This is a sample document illustrating the use of the +flowfram package. The first flow frame has been rotated +by an angle of 45 degrees. There is an asterisk in the +margin\marginpar{*}. There is also a +footnote\footnote{down here.}. + +\framebreak +\begin{supertabular}{rl} +1 & A\\ +2 & B\\ +3 & C\\ +4 & D\\ +5 & E\\ +6 & F\\ +7 & G\\ +8 & H\\ +9 & I\\ +10 & J\\ +11 & K\\ +12 & L\\ +13 & M\\ +14 & N\\ +15 & O\\ +16 & P\\ +17 & Q\\ +18 & R\\ +19 & S\\ +20 & T\\ +\end{supertabular} + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample.pdf new file mode 100644 index 00000000000..4a47a3bedb5 Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample.tex new file mode 100644 index 00000000000..1bf6ccf6293 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample.tex @@ -0,0 +1,379 @@ + % This file is public domain. + +\documentclass[a4paper,twoside]{book} + +\usepackage{times} +\usepackage{courier} +\usepackage{helvet} +\usepackage[margin=1in,top=1in,bottom=1in]{geometry} +\usepackage[colorlinks, + linkcolor=black, + urlcolor=black, + plainpages=false, + pdfpagelabels=true]{hyperref} +\usepackage{fancybox} +\usepackage{color} +\usepackage{flowfram} + +\newcommand{\sty}[1]{\textsf{#1}} +\newcommand{\env}[1]{\textsf{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + +\newlength{\leftwidth} +\newlength{\rightwidth} + +\computeleftedgeodd{\leftwidth} +\setlength{\leftwidth}{-\leftwidth} +\addtolength{\leftwidth}{0.4\textwidth} +\setlength{\rightwidth}{\paperwidth} +\addtolength{\rightwidth}{-\leftwidth} +\vtwotone[1]{\leftwidth}{magenta}{backleft}{\rightwidth}{[cmyk]{0,0.48,0,0}}{backright} + +\vtwotone[none]{\rightwidth}{[cmyk]{0,0.48,0,0}}{lastbackright}{\leftwidth}{magenta}{lastbackleft} + +\vtwotonetop[odd]{1cm}{\leftwidth}{magenta}{oddtopleft}{\rightwidth}{[cmyk]{0,0.48,0,0}}{oddtopright} +\vtwotonetop[even]{1cm}{\rightwidth}{[cmyk]{0,0.48,0,0}}{eventopleft}{\leftwidth}{magenta}{eventopright} + +\setlength{\marginparwidth}{2cm} + +\newflowframe{0.6\textwidth}{\textheight}{0pt}{0pt}[main] +\newdynamicframe{0.38\textwidth}{\textheight}{0.62\textwidth}{0pt}[chaphead] + +\setflowframe*{main}{evenx=0.4\textwidth} +\setdynamicframe*{chaphead}{evenx=0pt} + +\setflowframe*{main}{margin=inner} + +\dfchaphead*{chaphead} + +\appenddfminitoc*{chaphead} + + +\renewcommand{\DFchapterstyle}[1]{% +\raggedright\sffamily\bfseries\Huge\color{blue}#1\par +} + +\renewcommand{\DFschapterstyle}[1]{\raggedright\sffamily\bfseries\Huge\color{blue} #1\par +} + + +\makethumbtabs{2in} +\enableminitoc + +\setthumbtab{1}{backcolor=[rgb]{0.15,0.15,1}} +\setthumbtab{2}{backcolor=[rgb]{0.2,0.2,1}} +\setthumbtab{3}{backcolor=[rgb]{0.25,0.25,1}} +\setthumbtab{4}{backcolor=[rgb]{0.3,0.3,1}} + +\newcommand{\thumbtabstyle}[1]{\textsc{\sffamily #1}} +\setthumbtab{all}{style=thumbtabstyle,textcolor=white} + + +\pagestyle{plain} + +\makedfheaderfooter + +\newlength{\xoffset} +\computerightedgeodd{\xoffset} +\addtolength{\xoffset}{-2cm} +\newlength{\yoffset} +\computebottomedge{\yoffset} + +\newcommand{\footstyle}[1]{\bfseries\LARGE #1} + + +\setdynamicframe*{footer}{oddx=\xoffset,y=\yoffset,width=2cm,height=2cm, +backcolor=blue,textcolor=white,style=footstyle,pages=none} + + +\computeleftedgeeven{\xoffset} +\setdynamicframe*{footer}{evenx=\xoffset} + +\begin{document} +\ffswapoddeven*{main}% swap odd and even position of frame for the title page +\dfswapoddeven*{chaphead} +\title{Creating Flow Frames for Posters or Magazines} +\author{Nicola L. C. Talbot\\[1cm]\url{http://www.dickimaw-books.com/}} +\date{} +\pagenumbering{alph} +\maketitle + +\cleardoublepage +\setstaticframe*{backleft}{pages=none} +\setstaticframe*{backright}{pages=none} + +\frontmatter +\tocandthumbtabindex +\setdynamicframe*{footer}{pages=all} + +\clearpage +\dfswapoddeven*{chaphead} +\ffswapoddeven*{main}% swap back again + +\mainmatter +\chapter{Introduction} +\enablethumbtabs +\pagenumbering{arabic} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters\marginpar{A marginal note} +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +This document has \themaxflow\ flow +\ifthenelse{\value{maxflow}=1}{frame}{frames}, \themaxstatic\ static +\ifthenelse{\value{maxstatic}=1}{frame}{frames} and +\themaxdynamic\ dynamic \ifthenelse{\value{maxdynamic}=1}{frame}{frames}. + +\chapter{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\section{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border\footnote{A +footnote!}. + +\section{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\section{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\chapter{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\chapter{Miscellaneous} + +\section{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\section{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\section{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\section{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\section{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: +\marginpar{Another marginal note} + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. +\end{itemize} + +\chapter*{Contact Details} +\disablethumbtabs + +Dr Nicola Talbot\\ +School of Computing Sciences\\ +University of East Anglia\\ +Norwich. Norfolk. NR4 7TJ. UK\\ +\url{http://theoval.cmp.uea.ac.uk/~nlct/} + +\finishthispage\mbox{} +\setdynamiccontents*{chaphead}{} +\setdynamicframe*{footer}{pages=none} +\setstaticframe*{lastbackleft,lastbackright}{pages=even} +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample1.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample1.pdf new file mode 100644 index 00000000000..f1798b9c6a6 Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample1.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample1.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample1.tex new file mode 100644 index 00000000000..6fd4d999fc4 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample1.tex @@ -0,0 +1,305 @@ + % This file is public domain. + +\documentclass[a4paper]{article} + +\usepackage[a4paper,landscape,margin=1in]{geometry} +\usepackage{fancybox} +\usepackage{color} +\usepackage{flowfram} + +\showframebboxtrue +\showtypeblocktrue + + +\NcolumnStop{4}{1in} + +\setflowframe{3,4}{pages={>1}} +\twocolumnSbottominarea[1]{1in}{0.5\textwidth}{\flowframeheight{3}}{0.5\textwidth}{0pt} + +\begin{staticcontents}{2} +The page layout for this document was obtained with +the following commands: +\begin{verbatim} +\NcolumnStop{4}{1in} +\setflowframe{3,4}{pages={>1}} +\twocolumnSbottominarea[1]{1in}{0.5\textwidth}{flowframeheight{3}} +{0.5\textwidth}{0pt} +\end{verbatim} +\end{staticcontents} + +\newcommand{\sty}[1]{\textsf{#1}} +\newcommand{\env}[1]{\textsf{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + +\raggedright + +\begin{document} + +\begin{staticcontents}{1} +\title{Creating Flow Frames for Posters or Magazines} +\author{Nicola L. C. Talbot} +\date{} +\maketitle +\end{staticcontents} + +This is a modified version of the manual for the \sty{flowfram} package. +It is intended to illustrated what can be done. See the full manual for +a comprehensive description. + +If the columns are very narrow, it may be better to +use \cmdname{raggedright}, otherwise \TeX\ may have a +problem working out the line breaks. + +\section{Introduction} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +\section{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\subsection{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border. + +It is recommended that all the flow frames in a document +have the same width, otherwise problems may occur +when a paragraph spans to flow frames of unequal +widths. This is because \TeX's output routine does not +register the change in \cmdname{hsize} until it reaches +a paragraph break. If it is absolutely necessary for +flow frames to have unequal widths, judicious use of +\cmdname{framebreak} is required. + +\subsection{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\subsection{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\section{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\section{Miscellaneous} + +\subsection{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\subsection{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\subsection{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\subsection{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\subsection{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. +\end{itemize} + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample2.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample2.pdf new file mode 100644 index 00000000000..06633932a57 Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample2.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample2.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample2.tex new file mode 100644 index 00000000000..d1ca0992234 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample2.tex @@ -0,0 +1,272 @@ + % This file is public domain. + +\documentclass[a4paper,twoside]{report} + +\usepackage{url} + +\newcommand{\cmdname}[1]{\texttt{\char`\\#1}} +\newcommand{\sty}[1]{\texttt{#1}} +\newcommand{\env}[1]{\texttt{#1}} +\newcommand{\meta}[1]{$\langle$\emph{#1}$\rangle$} + +\begin{document} + +\title{Creating Flow Frames for Posters or Magazines} +\author{Nicola L. C. Talbot\\[1cm]\url{http://www.dickimaw-books.com/}} +\date{} +\pagenumbering{alph} +\maketitle + +\pagenumbering{roman} +\tableofcontents + +\chapter{Introduction} +\pagenumbering{arabic} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +\chapter{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\section{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border. + +\section{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\section{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\chapter{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\chapter{Miscellaneous} + +\section{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\section{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\section{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\section{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\section{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. +\end{itemize} + +\chapter*{Contact Details} + +Dr Nicola Talbot\\ +Dickimaw Books\\ +\url{http://www.dickimaw-books.com/} + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample3.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sample3.pdf new file mode 100644 index 00000000000..f22dd7c2af4 Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sample3.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sample3.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sample3.tex new file mode 100644 index 00000000000..56bfcf79813 --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sample3.tex @@ -0,0 +1,65 @@ + % This file is public domain. + +\documentclass{article} + +\usepackage{color} +\usepackage[draft]{flowfram} +\usepackage{tikz} +\usetikzlibrary{snakes} + +\newstaticframe[1,2]{3in}{3in}{0pt}{0pt}[sf1] +\newdynamicframe[1,3]{2in}{3in}{0.5\textwidth}{0.5\textheight}[df1] + +\newstaticframe[2]{3in}{3in}{0.5\textwidth}{0.5\textheight}[sf2] + +\newdynamicframe[3]{2in}{2in}{0.5\textwidth}{0pt}[df2] + +\setlength{\sdfparindent}{\parindent} + +\onecolumn + +\newlength\fancywidth +\newlength\fancyheight +\newlength\fancydepth + +\newcommand{\fancyframe}[1]{% +\settowidth{\fancywidth}{#1}% +\settoheight{\fancyheight}{#1}% +\settodepth{\fancydepth}{#1}% +\addtolength{\fancyheight}{\fancydepth}% +\hspace{-\flowframesep}% +\tikz[baseline=0pt]{% +\draw[snake=bumps,raise snake=\flowframesep,line width=\flowframerule] + (0pt,0pt) + rectangle (\fancywidth,\fancyheight); +}} + +\begin{document} +\setstaticframe{1,2}{valign=t} +\setstaticframe{1}{border=fancyframe} +\setstaticcontents{1}{Top\par +\vfill +Bottom} + + +\mbox{} + +\newpage\mbox{} + +\begin{staticcontents*}{sf1} +Some text on the left static frame. +\continueonframe[continued \relativeframelocation{static}{2}{static}{1}]{sf2} +Some more text on the right static frame, and +some more text to pad it out a bit. +\end{staticcontents*} + +\newpage\mbox{} + +\begin{dynamiccontents}{1} +Some text in the first dynamic frame. +\continueonframe[continued \reldynamicloc*{df2}{df1}]{2} +Some more text in the second dynamic frame, and +some more text to pad it out a bit. +\end{dynamiccontents} + +\end{document} diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sampleRL.pdf b/Master/texmf-dist/doc/latex/flowfram/samples/sampleRL.pdf new file mode 100644 index 00000000000..079ae70299e Binary files /dev/null and b/Master/texmf-dist/doc/latex/flowfram/samples/sampleRL.pdf differ diff --git a/Master/texmf-dist/doc/latex/flowfram/samples/sampleRL.tex b/Master/texmf-dist/doc/latex/flowfram/samples/sampleRL.tex new file mode 100644 index 00000000000..48f4f5e615d --- /dev/null +++ b/Master/texmf-dist/doc/latex/flowfram/samples/sampleRL.tex @@ -0,0 +1,16 @@ + % This file is public domain. + +\documentclass{article} + +\usepackage{lipsum} +\usepackage[RL,draft]{flowfram} + +\twocolumn + +\begin{document} +This is the start of the text. + +\lipsum + +This is the end of the text. +\end{document} diff --git a/Master/texmf-dist/scripts/flowfram/flowfram.perl b/Master/texmf-dist/scripts/flowfram/flowfram.perl new file mode 100644 index 00000000000..45fefe81c83 --- /dev/null +++ b/Master/texmf-dist/scripts/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); + + "$text$_" +} + +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($_) = @_; + + "

$_" +} + +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; diff --git a/Master/texmf-dist/source/latex/flowfram/flowfram.dtx b/Master/texmf-dist/source/latex/flowfram/flowfram.dtx index 8a2584d9301..61890ddf0e7 100644 --- a/Master/texmf-dist/source/latex/flowfram/flowfram.dtx +++ b/Master/texmf-dist/source/latex/flowfram/flowfram.dtx @@ -1,12 +1,19 @@ %\iffalse % flowfram.dtx generated using makedtx version 0.94b (c) Nicola Talbot % Command line args: +% -macrocode "flowfram\.perl" +% -macrocode ".*\.tex" +% -setambles "flowfram\.perl=>\nopreamble\nopostamble" +% -setambles ".*\.tex=>\nopreamble\nopostamble" +% -comment "flowfram\.perl" +% -comment ".*\.tex" % -src "flowfram.sty\Z=>flowfram.sty" +% -src "(sample.*\.tex)\Z=>\1" +% -src "(flowfram\.perl)\Z=>\1" % -doc "docstub.tex" % -author "Nicola Talbot" -% -dir "source" % flowfram -% Created on 2010/1/23 11:35 +% Created on 2012/11/10 22:19 %\fi %\iffalse %<*package> @@ -29,13 +36,15 @@ %\fi % \iffalse % Doc-Source file to use with LaTeX2e -% Copyright (C) 2010 Nicola Talbot, all rights reserved. +% Copyright (C) 2012 Nicola Talbot, all rights reserved. % \fi % \iffalse %<*driver> -\documentclass{ltxdoc} +\documentclass[widecs]{nlctdoc} +\addtolength{\marginparwidth}{10pt} +\addtolength{\oddsidemargin}{20pt} -\CheckSum{9520} +\CheckSum{12608} \PageIndex \usepackage{url} @@ -47,12 +56,13 @@ pdftitle={Documented Source Code for flowfram.sty}]{hyperref} \newglossary[slg]{secondary}{sgi}{sgo}{Glossary} \renewcommand{\acronymtype}{secondary} +\doxitem{Option}{option}{package options} +\doxitem{Counter}{counter}{flowfram counters} + \MakeShortVerb" \DeleteShortVerb| -\newcommand{\sty}[1]{\textsf{#1}} -\newcommand{\env}[1]{\textsf{#1}} - +\iffalse \renewcommand{\usage}[1]{\textit{\hyperpage{#1}}} \renewcommand{\main}[1]{\hyperpage{#1}} \newcommand{\see}[2]{\emph{see} #1} @@ -60,6 +70,7 @@ pdftitle={Documented Source Code for flowfram.sty}]{hyperref} \def\index@prologue{\section*{Index} \addcontentsline{toc}{section}{Index}} \makeatother +\fi \newglossaryentry{typeblock}{name=typeblock,description={The @@ -132,9 +143,9 @@ IDN}]{idl}{IDL}{identification label} \end{document} % %\fi -%\title{Documented Source Code for flowfram.sty v1.13} +%\title{Documented Source Code for flowfram.sty v1.14} %\author{Nicola L. C. Talbot} -%\date{23rd January 2010} +%\date{2012-11-10} %\maketitle % %This is the documented source code for the flowfram package. @@ -144,7 +155,8 @@ IDN}]{idl}{IDL}{identification label} % %\printglossary[type=secondary] % -%\StopEventually{\PrintIndex} +%\StopEventually{\clearpage\phantomsection +%\addcontentsline{toc}{section}{Index}\PrintIndex} % % %\section{The Code} @@ -157,14 +169,24 @@ IDN}]{idl}{IDL}{identification label} % Declare package, and identify it as a \LaTeXe\ package. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{flowfram}[2010/01/23 v1.13] +\ProvidesPackage{flowfram}[2012/11/10 v1.14 (NLCT)] % \end{macrocode} % Load packages needed by this package % \begin{macrocode} \RequirePackage{ifthen} -\RequirePackage{keyval} +% \end{macrocode} +%\changes{1.14}{2012-11-10}{now loading xkeyval instead of keyval} +% \begin{macrocode} +\RequirePackage{xkeyval} \RequirePackage{graphics} \RequirePackage{afterpage} +% \end{macrocode} +%\changes{1.14}{2012-11-10}{now loading xfor and etoolbox} +% \begin{macrocode} +\RequirePackage{xfor} +\RequirePackage{etoolbox} +% \end{macrocode} +% \begin{macrocode} \@ifundefined{@ldc@l@r}{\RequirePackage{color}}{} % \end{macrocode} % The colour of the \gls{bbox} borders when the draft @@ -201,9 +223,9 @@ IDN}]{idl}{IDL}{identification label} % Set all draft settings. % \begin{macrocode} \newcommand*{\@ffdraft}{% -\showtypeblocktrue -\showmarginstrue -\showframebboxtrue + \showtypeblocktrue + \showmarginstrue + \showframebboxtrue } % \end{macrocode} %\end{macro} @@ -211,9 +233,9 @@ IDN}]{idl}{IDL}{identification label} % Unset all draft settings. % \begin{macrocode} \newcommand*{\@ffnodraft}{% -\showtypeblockfalse -\showmarginsfalse -\showframebboxfalse + \showtypeblockfalse + \showmarginsfalse + \showframebboxfalse } % \end{macrocode} %\end{macro} @@ -221,10 +243,13 @@ IDN}]{idl}{IDL}{identification label} % Draw \gls{bbox}. % \begin{macrocode} \newcommand*{\@fr@meifdraft}[3][\setffdraftcolor]{% -\def\ff@backcol{{none}}% -\@ifundefined{color}{\frame{#2}}{#1\frame{#2}}% -\ifthenelse{\equal{#3}{}}{}{% -\makebox[0pt][l]{\hskip\fflabelsep\fflabelfont{[#3]}}}}% + \def\ff@backcol{{none}}% + \@ifundefined{color}{\frame{#2}}{#1\frame{#2}}% + \ifthenelse{\equal{#3}{}}{}% + {% + \makebox[0pt][l]{\hskip\fflabelsep\fflabelfont{[#3]}}% + }% +}% % \end{macrocode} %\end{macro} % Colour setting commands, do nothing by default: @@ -241,82 +266,284 @@ IDN}]{idl}{IDL}{identification label} \newcommand*{\@ffbackground}[1]{#1} % \end{macrocode} %\end{macro} -% Now declare the options. If draft, switch to draft definitions. +% Now declare the options. +%\begin{option}{draft} +% If draft, switch to draft definitions. % \begin{macrocode} -\DeclareOption{draft}{\@ffdraft} +\DeclareOptionX{draft}{\@ffdraft} % \end{macrocode} +%\end{option} +%\begin{option}{final} % If not draft, reset commands so that no \glspl{bbox} % are drawn. % \begin{macrocode} -\DeclareOption{final}{\@ffnodraft} +\DeclareOptionX{final}{\@ffnodraft} +% \end{macrocode} +%\end{option} +% Set the default to \pkgopt{final}: +% \begin{macrocode} +\@ffnodraft +% \end{macrocode} +% +%\begin{option}{verbose} +%\changes{1.14}{2012-11-10}{new} +% Verbose mode is primarily for debug messages. +% \begin{macrocode} +\define@choicekey{flowfram.sty}% + {verbose}[\val\nr]% + {true,false}[true]% + {% + \ifcase\nr\relax + \renewcommand*{\flf@doifverbose}[1]{##1}% + \renewcommand*{\flf@message}[1]{\PackageInfo{flowfram}{##1}}% + \or + \renewcommand*{\flf@doifverbose}[1]{}% + \renewcommand*{\flf@message}[1]{}% + \fi + } +% \end{macrocode} +%\end{option} +%\begin{macro}{\flf@message} +% Messaging system (to help debugging): +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\flf@message}[1]{% + \flf@doifverbose + {% + \PackageInfo{flowfram}{##1}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\flf@doifverbose} +%\changes{1.14}{2012-11-10}{new} +% Initialise: +% \begin{macrocode} +\newcommand*{\flf@doifverbose}[1]{} % \end{macrocode} -%\begin{macro}{\if@ttb@rotate} +%\end{macro} +% +%\begin{option}{rotate} % Allow provision to prevent rotation in the thumbtabs. % If no rotation, thumbtab text will be stacked vertically. % This will also affect whether or not to rotate \glspl{frame}. +%\changes{1.14}{2012-11-10}{changed to boolean key} % \begin{macrocode} -\newif\if@ttb@rotate +\define@boolkey{flowfram.sty}[@ttb@]{rotate}[true]{} \@ttb@rotatetrue -\DeclareOption{rotate}{\@ttb@rotatetrue} -\DeclareOption{norotate}{\@ttb@rotatefalse} % \end{macrocode} -%\end{macro} +%\end{option} +%\begin{option}{norotate} +% Provide \pkgopt{norotate} option for backward compatibility +% \begin{macrocode} +\DeclareOptionX{norotate}{\@ttb@rotatefalse} +% \end{macrocode} +%\end{option} %\begin{macro}{\rotateframe} % Define command that will only rotate box if rotate option % set. % \begin{macrocode} -\newcommand{\rotateframe}[2]{\if@ttb@rotate -\rotatebox{#1}{#2}% -\else -#2\relax -\fi} +\newcommand{\rotateframe}[2]{% + \if@ttb@rotate + \rotatebox{#1}{#2}% + \else + #2% + \fi +} % \end{macrocode} %\end{macro} % Should the thumbtabs include number, title, both or % neither? +%\begin{macro}{\if@ttb@num} % \begin{macrocode} \newif\if@ttb@num -\newif\if@ttb@title \@ttb@numfalse +% \end{macrocode} +%\end{macro} +%\begin{macro}{\if@ttb@title} +% \begin{macrocode} +\newif\if@ttb@title \@ttb@titletrue -\DeclareOption{ttbtitle}{\@ttb@titletrue} -\DeclareOption{ttbnotitle}{\@ttb@titlefalse} -\DeclareOption{ttbnum}{\@ttb@numtrue} -\DeclareOption{ttbnonum}{\@ttb@numfalse} % \end{macrocode} -% If color option specified, set up the default colours +%\begin{option}{thumbtabs} +%\changes{1.14}{2012-11-10}{new} +% The \pkgopt{thumbtabs} option replaces the \pkgopt{ttbtitle}, +% \pkgopt{ttbnotitle}, \pkgopt{ttbnum} and \pkgopt{ttbnonum} +% options. +% \begin{macrocode} +\define@choicekey{flowfram.sty}% + {thumbtabs}[\val\nr]% + {title,number,both,none}[title]% + {% + \ifcase\nr\relax +% \end{macrocode} +% Thumbtabs to only include title +% \begin{macrocode} + \@ttb@numfalse + \@ttb@titletrue + \or +% \end{macrocode} +% Thumbtabs to only include number +% \begin{macrocode} + \@ttb@numtrue + \@ttb@titlefalse + \or +% \end{macrocode} +% Thumbtabs to include title and number +% \begin{macrocode} + \@ttb@numtrue + \@ttb@titletrue + \or +% \end{macrocode} +% Thumbtabs don't have title or number +% \begin{macrocode} + \@ttb@numfalse + \@ttb@titlefalse + \fi + } +% \end{macrocode} +%\end{option} +% Provide old options for backward compatibility: +%\begin{option}{ttbtitle} +% \begin{macrocode} +\DeclareOptionX{ttbtitle}{\@ttb@titletrue} +% \end{macrocode} +%\end{option} +%\begin{option}{ttbnotitle} +% \begin{macrocode} +\DeclareOptionX{ttbnotitle}{\@ttb@titlefalse} +% \end{macrocode} +%\end{option} +%\begin{option}{ttbnum} +% \begin{macrocode} +\DeclareOptionX{ttbnum}{\@ttb@numtrue} +% \end{macrocode} +%\end{option} +%\begin{option}{ttbnonum} +% \begin{macrocode} +\DeclareOptionX{ttbnonum}{\@ttb@numfalse} +% \end{macrocode} +%\end{option} +% +%\begin{option}{pages} +%\changes{1.14}{2012-11-10}{new} +% Determine whether the pages key when defining frames refers to the +% page number as given by \ics{c@page} or the absolute +% page number as given by \ics{c@absolutepage}. +% \begin{macrocode} +\define@choicekey{flowfram.sty}{pages}[\val\nr]% + {relative,absolute}% + {% + \ifcase\nr\relax +% \end{macrocode} +% Relative (use \cs{c@page}): +% \begin{macrocode} + \renewcommand*{\@ff@pages@countreg}{\c@page}% + \or +% \end{macrocode} +% Absolute (use \cs{c@absolutepage}): +% \begin{macrocode} + \renewcommand*{\@ff@pages@countreg}{\c@absolutepage}% + \fi + } +% \end{macrocode} +%\end{option} +%\begin{macro}{\@ff@pages@countreg} +%\changes{1.14}{2012-11-10}{new} +% The default is relative (for backwards compatibility). +% \begin{macrocode} +\newcommand*{\@ff@pages@countreg}{\c@page} +% \end{macrocode} +%\end{macro} +%\begin{counter}{absolutepage} +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcounter{absolutepage} +% \end{macrocode} +%\end{counter} +% +%\begin{option}{color} +%\changes{1.14}{2012-11-10}{changed to boolean option} +% If \pkgopt[true]{color} option specified, set up the default colours % for the borders and text for all \gls{frame} types. Note that % the colour name has to be grouped within the definition -% of "\flowframecol" and "\flowframetextcol". This +% of \ics{flowframecol} and \ics{flowframetextcol}. This % was done so that you could do, for example, % "\renewcommand{\flowframecol}{[rgb]{1,1,0}}" so that % you can specify the colour model as well. -% The commands "\@s@tffcol" and "\@s@tfftextcol" +% The commands \ics{@s@tffcol} and \ics{@s@tfftextcol} % switch to the border and text colour, respectively. They -% both assume that "\ff@col" has been set to the +% both assume that \ics{ff@col} has been set to the % relevant colour before use. % \begin{macrocode} -\DeclareOption{color}{% -\def\flowframecol{{black}}\def\flowframetextcol{{black}} -\renewcommand*\@s@tffcol{\ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\color\ff@col}} -\renewcommand*\@s@tfftextcol{\ifthenelse{\equal{\ff@txtcol}{}}{}{% -\expandafter\color\ff@txtcol}} -\renewcommand*{\@ffbackground}[1]{% -\ifthenelse{\equal{\ff@backcol}{{none}}}{% -#1}{{\fboxsep=0pt\expandafter\colorbox\ff@backcol{#1}}}} +\define@choicekey{flowfram.sty}{color}[\val\nr]{true,false}[true]{% + \ifcase\nr\relax +% \end{macrocode} +% Option set to true: +% \begin{macrocode} + \@ff@enablecolor + \or +% \end{macrocode} +% Option set to false, ensure that the colour changing +% commands do nothing: +% \begin{macrocode} + \@ff@disablecolor + \fi +} +% \end{macrocode} +%\end{option} +% Provide \pkgopt{nocolor} option for backward compatibility: +% \begin{macrocode} +\DeclareOptionX{nocolor}{% + \@ff@disablecolor } % \end{macrocode} -% If nocolor is specified, ensure that the colour changing -% commands do nothing. +%\begin{macro}{\@ff@enablecolor} +%\changes{1.14}{2012-11-10}{new} +% Enable colour commands. +% \begin{macrocode} +\newcommand*{\@ff@enablecolor}{% + \def\flowframecol{{black}}% + \def\flowframetextcol{{black}}% + \renewcommand*\@s@tffcol{% + \ifthenelse{\equal{\ff@col}{}}% + {}% + {% + \expandafter\color\ff@col}% + }% + \renewcommand*\@s@tfftextcol{% + \ifthenelse{\equal{\ff@txtcol}{}}% + {}% + {% + \expandafter\color\ff@txtcol + }% + }% + \renewcommand*{\@ffbackground}[1]{% + \ifthenelse{\equal{\ff@backcol}{{none}}}% + {% + ##1% + }% + {% + {\fboxsep=0pt\expandafter\colorbox\ff@backcol{##1}}% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@disablecolor} +%\changes{1.14}{2012-11-10}{new} +% Disable colour commands. % \begin{macrocode} -\DeclareOption{nocolor}{% -\def\flowframetextcol{}% -\def\flowframecol{}% -\renewcommand{\@s@tffcol}{}\renewcommand{\@s@tfftextcol}{} -\renewcommand{\@ffbackground}[1]{#1} +\newcommand*{\@ff@disablecolor}{% + \def\flowframetextcol{}% + \def\flowframecol{}% + \renewcommand{\@s@tffcol}{}\renewcommand{\@s@tfftextcol}{}% + \renewcommand{\@ffbackground}[1]{##1}% } % \end{macrocode} +%\end{macro} +% %\begin{macro}{\iflefttorightcolumns} % Determine whether to define the Ncolumn style frames from left % to right or from right to left. @@ -327,82 +554,131 @@ IDN}]{idl}{IDL}{identification label} % \end{macrocode} %\end{macro} % Define options that set the direction: +%\begin{option}{LR} % \begin{macrocode} -\DeclareOption{LR}{\lefttorightcolumnstrue} -\DeclareOption{RL}{\lefttorightcolumnsfalse} +\DeclareOptionX{LR}{\lefttorightcolumnstrue} % \end{macrocode} -% Check to see if the document class has the draft option -% set. The easiest way to do this is to check the length -% of "\overfullrule" (the marker that indicates overfull -% hboxes). -% \begin{macrocode} -\ifdim\overfullrule=0pt -\ExecuteOptions{final} -\else -\ExecuteOptions{draft} -\fi +%\end{option} +%\begin{option}{RL} +% \begin{macrocode} +\DeclareOptionX{RL}{\lefttorightcolumnsfalse} % \end{macrocode} -% If the "\normalcolor" command is something other than -% "\relax", then implement -% the color option as the default, otherwise implement the -% nocolor option as the default. +%\end{option} +% If the \ics{normalcolor} command is something other than +% \cs{relax}, then implement +% the \pkgopt[true]{color} option as the default, otherwise implement the +% \pkgopt[false]{color} option as the default. % \begin{macrocode} \ifx\normalcolor\relax -\ExecuteOptions{nocolor} + \@ff@disablecolor \else -\ExecuteOptions{color} + \@ff@enablecolor \fi % \end{macrocode} % Now the defaults have all been set, the package options % specified by the user can be processed: % \begin{macrocode} -\ProcessOptions +\ProcessOptionsX % \end{macrocode} -% If color option has been specified, but no color +% If \pkgopt[true]{color} option has been specified, but no color % package has been loaded yet, load color.sty % \begin{macrocode} \ifx\normalcolor\relax -\ifthenelse{\equal{\flowframetextcol}{}}{}{% -\RequirePackage{color}} + \ifthenelse{\equal{\flowframetextcol}{}}% + {}% + {% + \RequirePackage{color}% + } \fi % \end{macrocode} +% +% \begin{macrocode} +\@ifundefined{chapter}{}% +{% +% \end{macrocode} +%\begin{macro}{\chapterfirstpagestyle} % User may want a non standard style for the first page of % each chapter, so modify chapter commands to take this into -% account.\DescribeMacro{\chapterfirstpagestyle} +% account. +% \begin{macrocode} + \newcommand*{\chapterfirstpagestyle}{plain}% +% \end{macrocode} +%\end{macro} +% +% \begin{macrocode} + \let\@ff@OLD@chapter\@chapter + \let\@ff@OLD@schapter\@schapter + \renewcommand{\@chapter}{% + \thispagestyle{\chapterfirstpagestyle}% + \@ff@OLD@chapter + }% + \renewcommand{\@schapter}{% + \thispagestyle{\chapterfirstpagestyle}% + \@ff@OLD@schapter + }% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\ffprechapterhook} +%\changes{1.14}{2012-11-10}{new} +% Hook at start of chapter (before page break issued) +% \begin{macrocode} + \newcommand*{\ffprechapterhook}{} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\chapter} +% Modify \cs{chapter} so the hook is called at the start: +% \begin{macrocode} + \let\@ff@OLD@ch@pter\chapter + \renewcommand{\chapter}{% + \ffprechapterhook + \@ff@OLD@ch@pter + } +% \end{macrocode} +%\end{macro} +% +% End of test if \cs{chapter} defined: % \begin{macrocode} -\@ifundefined{chapter}{}{% -\newcommand*{\chapterfirstpagestyle}{plain} -\let\@ff@OLD@chapter\@chapter -\let\@ff@OLD@schapter\@schapter -\renewcommand{\@chapter}{% -\thispagestyle{\chapterfirstpagestyle}\@ff@OLD@chapter} -\renewcommand{\@schapter}{% -\thispagestyle{\chapterfirstpagestyle}\@ff@OLD@schapter} } % \end{macrocode} +% +%\begin{counter}{maxflow} % Now get on with the package. First we need to set up % a register to store the number of \glspl{flow} that have been defined: % \begin{macrocode} \newcounter{maxflow} \c@maxflow=0\relax % \end{macrocode} +%\end{counter} +% +%\begin{counter}{thisframe} % 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}}}{} +\@ifpackageloaded{hyperref} +{% + \def\theHthisframe{\thepage.\arabic{thisframe}}% +}% +{} % \end{macrocode} +%\end{counter} %\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}}} + {% + \def\@currentlabel{\thethisframe}% + \label{#1}% + }% +} % \end{macrocode} %\end{macro} +%\begin{counter}{displayedframe} % 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 @@ -411,28 +687,41 @@ IDN}]{idl}{IDL}{identification label} % \begin{macrocode} \newcounter{displayedframe} \c@displayedframe=0 -\@ifpackageloaded{hyperref}{% -\def\theHdisplayedframe{\thepage.\arabic{displayedframe}}}{} +\@ifpackageloaded{hyperref}% +{% + \def\theHdisplayedframe{\thepage.\arabic{displayedframe}}% +}% +{} % \end{macrocode} +%\end{counter} +% %\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}}} + {% + \def\@currentlabel{\thedisplayedframe}% + \label{#1}% + }% +} % \end{macrocode} %\end{macro} +%\begin{counter}{maxstatic} % Define a counter to store the total number of \glspl{static}: % \begin{macrocode} \newcounter{maxstatic} \c@maxstatic=0\relax % \end{macrocode} +%\end{counter} +%\begin{counter}{maxdynamic} % Define a counter to store the total number of \glspl{dynamic}: % \begin{macrocode} \newcounter{maxdynamic} \c@maxdynamic=0\relax % \end{macrocode} +%\end{counter} % Define some temporary variables % \begin{macrocode} \newcount\@colN @@ -475,8 +764,11 @@ IDN}]{idl}{IDL}{identification label} %\DescribeMacro{\flowframeshowlayout} % \begin{macrocode} \newcommand*{\flowframeshowlayout}{% -\finishthispage -{\@ffdraft\mbox{}\finishthispage\clearpage}} + \finishthispage + {% + \@ffdraft\mbox{}\finishthispage\clearpage + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\framebreak} @@ -487,41 +779,78 @@ IDN}]{idl}{IDL}{identification label} % Provides an optional argument that is passed to % "\pagebreak". Make sure it is grouped to localise % the change in "\parfillskip" and "\parskip". +%\changes{1.14}{2012-11-10}{made change to switch global} % \begin{macrocode} \newif\ifusedframebreak \newcommand{\framebreak}[1][4]{% -\usedframebreaktrue -{\parfillskip=0pt\pagebreak[#1]\parskip=0pt\par\noindent}} + \global\usedframebreaktrue + {% + \parfillskip=0pt\pagebreak[#1]\parskip=0pt\par\noindent + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\finishthispage} -% The commands "\newpage" and -% "\pagebreak" can be used to move on to the next +% The commands \ics{newpage} and +% \ics{pagebreak} can be used to move on to the next % \gls{flow}, but to finish the entire page, use -% "\finishthispage". +% "\finishthispage". This is (loosely) based on the code for +% \ics{clearpage}. (\cs{@dbltopnum} not required as we can't have +% column-spanning floats.) +%\changes{1.14}{2012-11-10}{change \cs{c@page} to +%\cs{@ff@pages@countreg}} % \begin{macrocode} \newcommand{\finishthispage}{% -\@colN=\c@thisframe -\newpage -\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\@ff@chckifthispg{\c@page}{\@colN}% -\if@notthiscol\else -\mbox{}\newpage% -\fi -}} + \ifvmode + \@colN=\c@thisframe\relax + \count@=\c@absolutepage\relax + \ifdim \pagetotal<\topskip + \hbox{}% + \fi + \newpage \write \m@ne {}\vbox {}\penalty -\@Mi +% \end{macrocode} +% If that was the last \gls{flow} on the page, then we're done, +% otherwise iterate through the remaining \glspl{flow}. +% \begin{macrocode} + \ifnum\count@=\c@absolutepage\relax + \whiledo{\@colN<\c@maxflow \OR \@colN=\c@maxflow}% + {% + \@ff@chckifthispg{\@ff@pages@countreg}{\@colN}% + \if@notthiscol + \else + \c@thisframe=\@colN\relax + \hbox{}\newpage + \fi + \advance\@colN by 1\relax + }% + \fi + \fi +} % \end{macrocode} %\end{macro} %\begin{macro}{\cleardoublepage} % Modify the definition of "\cleardoublepage". This may % or may not be defined so use "\def". % \begin{macrocode} -\def\cleardoublepage{\finishthispage -\if@twoside -\ifodd\c@page -\else -\hbox{}\finishthispage -\fi -\fi} +\def\cleardoublepage{% + \clearpage + \if@twoside + \ifodd\c@page + \else + \hbox{}% + \clearpage + \fi + \fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\newpage} +% Modify the definition of \cs{newpage} so that it sets the +% "usedframebreak" flag. +%\changes{1.14}{2012-11-10}{Modified definition of \cs{newpage}} +% \begin{macrocode} +\preto\newpage{\global\usedframebreaktrue} % \end{macrocode} %\end{macro} % Disable "@twocolumn" flag, as it makes no sense. @@ -538,9 +867,17 @@ IDN}]{idl}{IDL}{identification label} % need the effect to be global. % \begin{macrocode} \newcommand{\globalreversemargin}{% -\global\@mparbottom\z@\global\@reversemargintrue} + \global\@mparbottom\z@ + \global\@reversemargintrue +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\globalnormalmargin} +% \begin{macrocode} \newcommand{\globalnormalmargin}{% -\global\@mparbottom\z@\global\@reversemarginfalse} + \global\@mparbottom\z@\global + \@reversemarginfalse +} % \end{macrocode} %\end{macro} %\begin{macro}{\@getmarginpos} @@ -553,21 +890,27 @@ IDN}]{idl}{IDL}{identification label} % is finished, the setting is stored in "\ff@margin". % \begin{macrocode} \newcommand{\@getmarginpos}[1]{% -\ifthenelse{\equal{#1}{inner}}{% -\if@twoside -\ifodd\c@page\def\ff@margin{left}\else\def\ff@margin{right}\fi -\else -\def\ff@margin{left}% -\fi -}{% -\ifthenelse{\equal{#1}{outer}}{% -\if@twoside -\ifodd\c@page\def\ff@margin{right}\else\def\ff@margin{left}\fi -\else -\def\ff@margin{right}% -\fi -}{% -\def\ff@margin{#1}}}% + \ifthenelse{\equal{#1}{inner}}% + {% + \if@twoside + \ifodd\c@page\def\ff@margin{left}\else\def\ff@margin{right}\fi + \else + \def\ff@margin{left}% + \fi + }% + {% + \ifthenelse{\equal{#1}{outer}}% + {% + \if@twoside + \ifodd\c@page\def\ff@margin{right}\else\def\ff@margin{left}\fi + \else + \def\ff@margin{right}% + \fi + }% + {% + \def\ff@margin{#1}% + }% + }% } % \end{macrocode} %\end{macro} @@ -575,10 +918,13 @@ IDN}]{idl}{IDL}{identification label} % Set the margin for current \gls{flow}. % \begin{macrocode} \newcommand{\setmargin}{% -\@getmarginpos{% -\csname @ff@margin@\romannumeral\c@thisframe\endcsname}% -\ifthenelse{\equal{\ff@margin}{left}}% -{\globalreversemargin}{\globalnormalmargin}% + \@getmarginpos + {% + \csname @ff@margin@\romannumeral\c@thisframe\endcsname + }% + \ifthenelse{\equal{\ff@margin}{left}}% + {\globalreversemargin}% + {\globalnormalmargin}% } % \end{macrocode} %\end{macro} @@ -610,10 +956,10 @@ IDN}]{idl}{IDL}{identification label} %\begin{macro}{\@n@wflowframe} % \begin{macrocode} \newcommand{\@n@wflowframe}{% -\global\advance\c@maxflow by 1\relax -\expandafter\global\expandafter -\newif\csname ifcolumnframe\romannumeral\c@maxflow\endcsname -\@ifstar\@snewflowframe\@newflowframe + \global\advance\c@maxflow by 1\relax + \expandafter\global\expandafter + \newif\csname ifcolumnframe\romannumeral\c@maxflow\endcsname + \@ifstar\@snewflowframe\@newflowframe } % \end{macrocode} %\end{macro} @@ -621,9 +967,10 @@ IDN}]{idl}{IDL}{identification label} % Starred version sets boolean flag to indicate a border % \begin{macrocode} \newcommand{\@snewflowframe}{% -\expandafter\global\expandafter -\let\csname ifcolumnframe\romannumeral\c@maxflow\endcsname\iftrue -\@@newflowframe} + \expandafter\global\expandafter + \let\csname ifcolumnframe\romannumeral\c@maxflow\endcsname\iftrue + \@@newflowframe +} % \end{macrocode} %\end{macro} %\begin{macro}{\@newflowframe} @@ -631,9 +978,10 @@ IDN}]{idl}{IDL}{identification label} % no border. % \begin{macrocode} \newcommand{\@newflowframe}{% -\expandafter\global\expandafter -\let\csname ifcolumnframe\romannumeral\c@maxflow\endcsname\iffalse -\@@newflowframe} + \expandafter\global\expandafter + \let\csname ifcolumnframe\romannumeral\c@maxflow\endcsname\iffalse + \@@newflowframe +} % \end{macrocode} %\end{macro} %\begin{macro}{\@@newflowframe} @@ -642,69 +990,90 @@ IDN}]{idl}{IDL}{identification label} % can override this. % \begin{macrocode} \newcommand{\@@newflowframe}[5][all]{% -\expandafter\global\expandafter -\newbox\csname column\romannumeral\c@maxflow\endcsname -\expandafter\global\expandafter -\newlength\csname colwidth\romannumeral\c@maxflow\endcsname -\expandafter\global\expandafter -\newlength\csname colheight\romannumeral\c@maxflow\endcsname -\expandafter\global\expandafter -\newlength\csname col@\romannumeral\c@maxflow @posx\endcsname -\expandafter\global\expandafter -\newlength\csname col@\romannumeral\c@maxflow @posy\endcsname -\expandafter\global\expandafter -\setlength\csname colwidth\romannumeral\c@maxflow\endcsname{#2} -\expandafter\global\expandafter -\setlength\csname colheight\romannumeral\c@maxflow\endcsname{#3} -\expandafter\global\expandafter -\setlength\csname col@\romannumeral\c@maxflow @posx\endcsname{#4} -\expandafter\global\expandafter -\setlength\csname col@\romannumeral\c@maxflow @posy\endcsname{#5} -\expandafter\global\expandafter -\newlength\csname col@\romannumeral\c@maxflow @evenx\endcsname -\expandafter\global\expandafter -\newlength\csname col@\romannumeral\c@maxflow @eveny\endcsname -\expandafter\global\expandafter -\setlength\csname col@\romannumeral\c@maxflow @evenx\endcsname{#4} -\expandafter\global\expandafter -\setlength\csname col@\romannumeral\c@maxflow @eveny\endcsname{#5} -\expandafter -\gdef\csname @ff@frametype@\romannumeral\c@maxflow\endcsname{fbox}% -\expandafter -\gdef\csname @ff@col@\romannumeral\c@maxflow\endcsname{\flowframecol} -\expandafter -\gdef\csname @ff@txtcol@\romannumeral\c@maxflow\endcsname{% -\flowframetextcol} -\expandafter -\gdef\csname @ff@backcol@\romannumeral\c@maxflow\endcsname{{none}} -\expandafter -\gdef\csname @ff@pages@\romannumeral\c@maxflow\endcsname{#1} -\expandafter -\gdef\csname @ff@offset@\romannumeral\c@maxflow\endcsname{compute} -\expandafter -\gdef\csname @ff@angle@\romannumeral\c@maxflow\endcsname{0}% -\expandafter -\gdef\csname @ff@margin@\romannumeral\c@maxflow\endcsname{right} -\ifnum\c@thisframe=0\relax -\ifthenelse{\equal{#1}{all}\TE@or\equal{#1}{odd}}{% -\c@thisframe=\c@maxflow -\global\setlength{\hsize}{#2}% -\global\usedframebreaktrue -}{\ifthenelse{\equal{#1}{even}\TE@or\equal{#1}{none}}{}{% -\def\ff@pages{#1}% -\@for\@ff@pp:=\ff@pages\do{% -\def\@ff@numstart{0}\def\@ff@numend{0}% -\@ff@getrange{\@ff@pp}% -\ifnum\@ff@numstart=0\def\@ff@numstart{1}\fi -\ifnum\@ff@numstart=1\relax -\c@thisframe=\c@maxflow -\global\setlength{\hsize}{#2}% -\global\usedframebreaktrue -\fi -}}}% -\fi -\@ifnextchar[{\@s@tflowframeid{\c@maxflow}}{% -\@s@tflowframeid{\c@maxflow}[\number\c@maxflow]}} + \expandafter\global\expandafter + \newbox\csname column\romannumeral\c@maxflow\endcsname + \expandafter\global\expandafter + \newlength\csname colwidth\romannumeral\c@maxflow\endcsname + \expandafter\global\expandafter + \newlength\csname colheight\romannumeral\c@maxflow\endcsname + \expandafter\global\expandafter + \newlength\csname col@\romannumeral\c@maxflow @posx\endcsname + \expandafter\global\expandafter + \newlength\csname col@\romannumeral\c@maxflow @posy\endcsname + \expandafter\global\expandafter + \setlength\csname colwidth\romannumeral\c@maxflow\endcsname{#2} + \expandafter\global\expandafter + \setlength\csname colheight\romannumeral\c@maxflow\endcsname{#3} + \expandafter\global\expandafter + \setlength\csname col@\romannumeral\c@maxflow @posx\endcsname{#4} + \expandafter\global\expandafter + \setlength\csname col@\romannumeral\c@maxflow @posy\endcsname{#5} + \expandafter\global\expandafter + \newlength\csname col@\romannumeral\c@maxflow @evenx\endcsname + \expandafter\global\expandafter + \newlength\csname col@\romannumeral\c@maxflow @eveny\endcsname + \expandafter\global\expandafter + \setlength\csname col@\romannumeral\c@maxflow @evenx\endcsname{#4} + \expandafter\global\expandafter + \setlength\csname col@\romannumeral\c@maxflow @eveny\endcsname{#5} + \expandafter + \gdef\csname @ff@frametype@\romannumeral\c@maxflow\endcsname{fbox}% + \expandafter + \gdef\csname @ff@col@\romannumeral\c@maxflow\endcsname{\flowframecol} + \expandafter + \gdef\csname @ff@txtcol@\romannumeral\c@maxflow\endcsname{% + \flowframetextcol + } + \expandafter + \gdef\csname @ff@backcol@\romannumeral\c@maxflow\endcsname{{none}} + \expandafter + \gdef\csname @ff@pages@\romannumeral\c@maxflow\endcsname{#1}% +% \end{macrocode} +% Page exclusion list: +%\changes{1.14}{2012-11-10}{added page exclusion list} +% \begin{macrocode} + \expandafter + \gdef\csname @ff@xpages@\romannumeral\c@maxflow\endcsname{}% + \expandafter + \gdef\csname @ff@offset@\romannumeral\c@maxflow\endcsname{compute} + \expandafter + \gdef\csname @ff@angle@\romannumeral\c@maxflow\endcsname{0}% + \expandafter + \gdef\csname @ff@margin@\romannumeral\c@maxflow\endcsname{right} + \ifnum\c@thisframe=0\relax + \ifthenelse{\equal{#1}{all}\TE@or\equal{#1}{odd}}% + {% + \c@thisframe=\c@maxflow + \global\setlength{\hsize}{#2}% + \global\usedframebreaktrue + }% + {% + \ifthenelse{\equal{#1}{even}\TE@or\equal{#1}{none}}% + {}% + {% + \def\ff@pages{#1}% + \@for\@ff@pp:=\ff@pages\do + {% + \def\@ff@numstart{0}\def\@ff@numend{0}% + \@ff@getrange{\@ff@pp}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numstart=1\relax + \c@thisframe=\c@maxflow + \global\setlength{\hsize}{#2}% + \global\usedframebreaktrue + \fi + }% + }% + }% + \fi + \@ifnextchar[% + {\@s@tflowframeid{\c@maxflow}}% + {% + \@s@tflowframeid{\c@maxflow}[\number\c@maxflow]% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@s@tflowframeid} @@ -713,10 +1082,10 @@ IDN}]{idl}{IDL}{identification label} % the \gls{flow} number. % \begin{macrocode} \def\@s@tflowframeid#1[#2]{% -\edef\ff@label{#2}% -\@ff@checkuniqueidl{#1}{\ff@label}% -\expandafter -\xdef\csname @col@id@\romannumeral#1\endcsname{\ff@label}% + \edef\ff@label{#2}% + \@ff@checkuniqueidl{#1}{\ff@label}% + \expandafter + \xdef\csname @col@id@\romannumeral#1\endcsname{\ff@label}% } % \end{macrocode} %\end{macro} @@ -724,18 +1093,33 @@ IDN}]{idl}{IDL}{identification label} % Check \gls{idl} "#2" for \gls{flow} "#1" is unique % \begin{macrocode} \newcommand*{\@ff@checkuniqueidl}[2]{% -{\@colN=0\relax -\whiledo{\@colN<\c@maxflow}{% -\advance\@colN by 1\relax -\ifnum\@colN=#1\relax -\else -\ifthenelse{\equal{#2}{% -\csname @col@id@\romannumeral\@colN\endcsname}}{% -\PackageError{flowfram}{Flow frame IDL '#2' already defined}{% -You can't assign this label, as it is already defined -for flow frame \number\@colN}}{}% -\fi -}}} + {% + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \ifnum\@colN=#1\relax + \else + \ifthenelse + {% + \equal{#2}% + {% + \csname @col@id@\romannumeral\@colN\endcsname + }% + }% + {% + \PackageError{flowfram}% + {Flow frame IDL '#2' already defined}% + {% + You can't assign this label, as it is already defined + for flow frame \number\@colN + }% + }% + {}% + \fi + }% + }% +} % \end{macrocode} %\end{macro} % @@ -746,7 +1130,8 @@ for flow frame \number\@colN}}{}% % \gls{idn}. % \begin{macrocode} \newcommand*{\getflowlabel}[1]{% -\csname @col@id@\romannumeral#1\endcsname} + \csname @col@id@\romannumeral#1\endcsname +} % \end{macrocode} %\end{macro} % @@ -758,7 +1143,9 @@ for flow frame \number\@colN}}{}% % sequence. % \begin{macrocode} \newcommand*{\getflowid}[2]{% -\@flowframeid{#2}\edef#1{\number\ff@id}} + \@flowframeid{#2}% + \edef#1{\number\ff@id}% +} % \end{macrocode} %\end{macro} % @@ -769,16 +1156,29 @@ for flow frame \number\@colN}}{}% % rather than their \gls{idl}. % The \gls{idn} stored in "\ff@id". % \begin{macrocode} -\newcommand*{\@flowframeid}[1]{\@colN=0\relax -\ff@id=0\relax -\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\ifthenelse{% -\equal{#1}{\csname @col@id@\romannumeral\@colN\endcsname}}{% -\ff@id=\@colN\relax -% break out of loop -\@colN=\c@maxflow}{}}% -\ifnum\ff@id=0\relax -\PackageError{flowfram}{Can't find flow frame id '#1'}{}\fi} +\newcommand*{\@flowframeid}[1]{% + \@colN=0\relax + \ff@id=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \ifthenelse + {% + \equal{#1}{\csname @col@id@\romannumeral\@colN\endcsname}% + }% + {% + \ff@id=\@colN\relax +% \end{macrocode} +% Break out of loop +% \begin{macrocode} + \@colN=\c@maxflow + }% + {}% + }% + \ifnum\ff@id=0\relax + \PackageError{flowfram}{Can't find flow frame id '#1'}{}% + \fi +} % \end{macrocode} %\end{macro} % Set up the keys for use with "\setflowframe", @@ -786,63 +1186,117 @@ for flow frame \number\@colN}}{}% % % Frame width is stored in "\ff@width". % \begin{macrocode} -\define@key{flowframe}{width}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'width' key}{}}{}% -\def\ff@width{#1}} +\define@key{flowframe}{width}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'width' key}{}% + }% + {}% + \def\ff@width{#1}% +} % \end{macrocode} % Frame height is stored in "\ff@height". % \begin{macrocode} -\define@key{flowframe}{height}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'height' key}{}}{}% -\def\ff@height{#1}} +\define@key{flowframe}{height}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'height' key}{}% + }% + {}% + \def\ff@height{#1}% +} % \end{macrocode} % Frame $x$ co-ordinate (odd and even pages) is stored % in "\ff@x". % \begin{macrocode} -\define@key{flowframe}{x}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'x' key}{}}{}% -\def\ff@x{#1}} +\define@key{flowframe}{x}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'x' key}{}% + }% + {}% + \def\ff@x{#1}% +} % \end{macrocode} % Frame $y$ co-ordinate (odd and even pages) is stored % in "\ff@y". % \begin{macrocode} -\define@key{flowframe}{y}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'y' key}{}}{}% -\def\ff@y{#1}} +\define@key{flowframe}{y}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'y' key}{}% + }% + {}% + \def\ff@y{#1}% +} % \end{macrocode} % Frame $x$ co-ordinate (even pages only) is stored % in "\ff@evenx". % \begin{macrocode} -\define@key{flowframe}{evenx}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'evenx' key}{}}{}% -\def\ff@evenx{#1}} +\define@key{flowframe}{evenx}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'evenx' key}{}% + }% + {}% + \def\ff@evenx{#1}% +} % \end{macrocode} % Frame $y$ co-ordinate (even pages only) is stored in % "\ff@eveny". % \begin{macrocode} -\define@key{flowframe}{eveny}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'eveny' key}{}}{}% -\def\ff@eveny{#1}} +\define@key{flowframe}{eveny}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'eveny' key}{}% + }% + {}% + \def\ff@eveny{#1}% +} % \end{macrocode} % Frame $x$ co-ordinate (odd pages only if twoside implemented) % is stored in "\ff@oddx". % \begin{macrocode} -\define@key{flowframe}{oddx}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'oddx' key}{}}{}% -\def\ff@oddx{#1}} +\define@key{flowframe}{oddx}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'oddx' key}{}% + }% + {}% + \def\ff@oddx{#1}% +} % \end{macrocode} % Frame $y$ co-ordinate (odd pages only if twoside implemented) % is stored in "\ff@oddy". % \begin{macrocode} -\define@key{flowframe}{oddy}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'oddy' key}{}}{}% -\def\ff@oddy{#1}} +\define@key{flowframe}{oddy}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'oddy' key}{}% + }% + {}% + \def\ff@oddy{#1}% +} % \end{macrocode} % New \gls{idl} for \gls{frame} is stored in "\ff@label". % \begin{macrocode} -\define@key{flowframe}{label}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'label' key}{}}{}% -\def\ff@label{#1}} +\define@key{flowframe}{label}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'label' key}{}% + }% + {}% + \def\ff@label{#1}% +} % \end{macrocode} % Frame border. If "none", define "\ff@frame" as "false", % otherwise define "\ff@frame" as "true". If "plain", define @@ -850,26 +1304,58 @@ for flow frame \number\@colN}}{}% % the specified type, which should be the name of a % \gls{fcmd} without the preceding backslash. % \begin{macrocode} -\define@key{flowframe}{border}[plain]{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'border' key - use -'none' for no border}{}}{}% -\ifthenelse{\equal{#1}{none}}{% -\def\ff@frame{false}}{\def\ff@frame{true}% -\ifthenelse{\equal{#1}{plain}}{\def\ff@frametype{fbox}}{% -\def\ff@frametype{#1}}}} +\define@key{flowframe}{border}[plain]% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}% + {% + Missing value for 'border' key - use + 'none' for no border% + }% + {}% + }% + {}% + \ifthenelse{\equal{#1}{none}}% + {% + \def\ff@frame{false}% + }% + {% + \def\ff@frame{true}% + \ifthenelse{\equal{#1}{plain}}% + {% + \def\ff@frametype{fbox}% + }% + {% + \def\ff@frametype{#1}% + }% + }% +} % \end{macrocode} % Frame's border colour. (This may not work for non-standard % \glspl{fcmd}.) % \begin{macrocode} -\define@key{flowframe}{bordercolor}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'bordercolor' key}{}}{}% -\def\ff@col{#1}} +\define@key{flowframe}{bordercolor}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'bordercolor' key}{}% + }% + {}% + \def\ff@col{#1}% +} % \end{macrocode} % Frame's text colour. % \begin{macrocode} -\define@key{flowframe}{textcolor}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'textcolor' key}{}}{}% -\def\ff@txtcol{#1}} +\define@key{flowframe}{textcolor}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'textcolor' key}{}% + }% + {}% + \def\ff@txtcol{#1}% +} % \end{macrocode} % The background colour of the \gls{frame}. Note this only covers % the region of the \gls{bbox}, not any extra space between @@ -877,25 +1363,55 @@ for flow frame \number\@colN}}{}% % colour to go right up to the border, you will need to % define your own customised border. % \begin{macrocode} -\define@key{flowframe}{backcolor}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'backcolor' key}{}}{}% -\def\ff@backcol{#1}} +\define@key{flowframe}{backcolor}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'backcolor' key}{}% + }% + {}% + \def\ff@backcol{#1}% +} % \end{macrocode} % \Gls{pglist} for which the \gls{frame} should appear. % \begin{macrocode} -\define@key{flowframe}{pages}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'pages' key}{}}{}% -\def\ff@pages{#1}} +\define@key{flowframe}{pages}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'pages' key}{}% + }% + {}% + \def\ff@pages{#1}% +} % \end{macrocode} -% The border takes up extra space, which needs to be -% adjusted. This can be done for standard border types, -% but non-standard borders may require some help. +% Exclusion list: % \begin{macrocode} -\define@key{flowframe}{offset}{\def\ff@offset{#1}% -\ifthenelse{\equal{#1}{}}{\PackageError{flowframe}{% -Invalid value for key 'offset'}{% -'offset' can either be 'compute' (to compute it according -to certain pre-defined rules) or a length}}{}} +\define@key{flowframe}{excludepages}% +{% + \def\ff@xpages{#1}% +} +% \end{macrocode} +% The border takes up extra space, which needs to be +% adjusted. This can be done for standard border types, +% but non-standard borders may require some help. +% \begin{macrocode} +\define@key{flowframe}{offset}% +{% + \def\ff@offset{#1}% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowframe}% + {% + Invalid value for key 'offset'% + }% + {% + 'offset' can either be 'compute' (to compute it according + to certain pre-defined rules) or a length% + }% + }% + {}% +} % \end{macrocode} % Angle to rotate \gls{flow}: % \begin{macrocode} @@ -904,37 +1420,48 @@ to certain pre-defined rules) or a length}}{}} % \end{macrocode} % This key is only for \glspl{flow}: % \begin{macrocode} -\define@key{flowframe}{margin}{% -\ifthenelse{\equal{#1}{left} \or \equal{#1}{right} -\or \equal{#1}{inner} \or \equal{#1}{outer}}{% -\def\ff@margin{#1}}{\PackageError{flowfram}{invalid value of -'margin' key}{Key 'margin' can only take the values -'left' or 'right'}}} +\define@choicekey{flowframe}{margin}{left,right,inner,outer}% +{% + \def\ff@margin{#1}% +} % \end{macrocode} % This key is only for \glspl{static}: % \begin{macrocode} -\define@key{flowframe}{clear}[true]{% -\ifthenelse{\equal{#1}{true}\or\equal{#1}{false}}{% -\def\ff@clear{#1}}{\PackageError{flowfram}{Key 'clear' is -boolean}{You can only specify the values 'true' or 'false'}}} +\define@choicekey{flowframe}{clear}{true,false}[true]{% + \def\ff@clear{#1}% +} % \end{macrocode} % This key is only for \glspl{dynamic}: % \begin{macrocode} -\define@key{flowframe}{style}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'style' key}{}}{}% -\ifthenelse{\equal{#1}{none}}{\def\ff@style{relax}}{\def\ff@style{#1}}} +\define@key{flowframe}{style}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'style' key}{}% + }% + {}% + \ifthenelse{\equal{#1}{none}}% + {% + \def\ff@style{relax}% + }% + {% + \def\ff@style{#1}% + }% +} % \end{macrocode} % This key is only for \glspl{static} and \glspl{dynamic}. % \begin{macrocode} -\define@key{flowframe}{shape}{\def\ff@shape{#1}% +\define@key{flowframe}{shape}% +{% + \def\ff@shape{#1}% } % \end{macrocode} % This key is only for \glspl{static} and \glspl{dynamic}. % \begin{macrocode} -\define@key{flowframe}{valign}{\ifthenelse{\equal{#1}{c} \or -\equal{#1}{t} \or \equal{#1}{b}}{\def\ff@valign{#1}}{% -\PackageError{flowfram}{Invalid value for 'valign' key}{You -may only specify 'c', 't' or 'b'}}} +\define@choicekey{flowframe}{valign}{c,t,b}% +{% + \def\ff@valign{#1}% +} % \end{macrocode} %\begin{macro}{\setallflowframes} % Provide a command to change the settings for all flow @@ -942,8 +1469,13 @@ may only specify 'c', 't' or 'b'}}} % and sets each one in turn. % \begin{macrocode} \newcommand*{\setallflowframes}[1]{% -\@colN=0\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\@@setflowframe{\@colN}{#1}}} + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \@@setflowframe{\@colN}{#1}% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\setflowframe} @@ -959,9 +1491,11 @@ may only specify 'c', 't' or 'b'}}} % and applies the setting for that numbered \gls{flow}. % \begin{macrocode} \newcommand{\@ssetflowframe}[2]{% -\@for\@ff@id:=#1\do{% -\@flowframeid{\@ff@id}% -\@@setflowframe{\ff@id}{#2}}} + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \@@setflowframe{\ff@id}{#2}% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@setflowframe} @@ -972,28 +1506,48 @@ may only specify 'c', 't' or 'b'}}} % that number ranges do not lie out of bounds. % \begin{macrocode} \newcommand*{\@setflowframe}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\setallflowframes{#2}}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}{% -\@@setflowframe{\@colN}{#2}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxflow\relax - \def\@ff@numend{\c@maxflow}% -\fi -\@colN=\@ff@numstart\relax -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@setflowframe{\@colN}{#2}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \setallflowframes{#2}% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}% + {% + \@colN=1\relax + }% + {% + \@colN=2\relax + }% + \whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}% + {% + \@@setflowframe{\@colN}{#2}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do + {% + \def\@ff@numstart{0}% + \def\@ff@numend{10000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxflow\relax + \def\@ff@numend{\c@maxflow}% + \fi + \@colN=\@ff@numstart\relax + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@setflowframe{\@colN}{#2}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@@setflowframe} @@ -1003,100 +1557,211 @@ may only specify 'c', 't' or 'b'}}} %\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{}% -\def\ff@x{}\def\ff@y{}\def\ff@frametype{}\def\ff@col{}% -\def\ff@valign{}\def\ff@style{}% -\def\ff@txtcol{}\def\ff@clear{}\def\ff@offset{}\def\ff@pages{}% -\def\ff@label{}\def\ff@backcol{}\def\ff@evenx{}\def\ff@eveny{}% -\def\ff@oddx{}\def\ff@oddy{}\def\ff@angle{}\def\ff@shape{\empty}% -\setkeys{flowframe}{#2}% -\ifthenelse{\equal{\ff@frame}{}}{}{% -\setboolean{columnframe\romannumeral#1}{\ff@frame}}% -\ifthenelse{\equal{\ff@width}{}}{}{% -\expandafter\setlength\csname colwidth\romannumeral#1\endcsname -{\ff@width}}% -\ifthenelse{\equal{\ff@height}{}}{}{% -\expandafter\setlength\csname colheight\romannumeral#1\endcsname -{\ff@height}}% -\ifthenelse{\equal{\ff@x}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@posx\endcsname -{\ff@x}% -\expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname -{\ff@x}} -\ifthenelse{\equal{\ff@y}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@posy\endcsname -{\ff@y}% -\expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname -{\ff@y}}% -\ifthenelse{\equal{\ff@evenx}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname -{\ff@evenx}}% -\ifthenelse{\equal{\ff@eveny}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname -{\ff@eveny}}% -\ifthenelse{\equal{\ff@oddx}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@posx\endcsname -{\ff@oddx}}% -\ifthenelse{\equal{\ff@oddy}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@posy\endcsname -{\ff@oddy}}% -\ifthenelse{\equal{\ff@label}{}}{}{% -\@s@tflowframeid{#1}[\ff@label]}% -\ifthenelse{\equal{\ff@frametype}{}}{}{% -\expandafter\edef\csname @ff@frametype@\romannumeral#1\endcsname -{\ff@frametype}}% -\ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\@setframecol\ff@col\end{#1}{col}{ff}}% -\ifthenelse{\equal{\ff@txtcol}{}}{}{% -\expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{ff}}% -\ifthenelse{\equal{\ff@backcol}{}}{}{% -\expandafter\@setframecol\ff@backcol\end{#1}{backcol}{ff}}% -\ifthenelse{\equal{\ff@margin}{}}{}{% -\expandafter\xdef\csname @ff@margin@\romannumeral#1\endcsname -{\ff@margin}}% -\ifthenelse{\equal{\ff@pages}{}}{}{% -\expandafter\xdef\csname @ff@pages@\romannumeral#1\endcsname -{\ff@pages}}% -\ifthenelse{\equal{\ff@offset}{}}{}{% -\expandafter\xdef\csname @ff@offset@\romannumeral#1\endcsname -{\ff@offset}}% -\ifthenelse{\equal{\ff@angle}{}}{}{% -\expandafter\xdef\csname @ff@angle@\romannumeral#1\endcsname -{\ff@angle}}% -\ifthenelse{\equal{\ff@clear}{}}{}{% -\PackageError{flowfram}% -{Key 'clear' not available for flow frames}{}}% -\ifthenelse{\equal{\ff@style}{}}{}{% -\PackageError{flowfram}% -{Key 'style' not available for flow frames}{}}% -\if\ff@shape\empty -\else -\PackageError{flowfram}% -{Key 'shape' not available for flow frames}{}% -\fi -\ifthenelse{\equal{\ff@valign}{}}{}{% -\PackageError{flowfram}% -{Key 'valign' not available for flow frames}{}}% + \def\ff@frame{}\def\ff@width{}\def\ff@height{}\def\ff@margin{}% + \def\ff@x{}\def\ff@y{}\def\ff@frametype{}\def\ff@col{}% + \def\ff@valign{}\def\ff@style{}% + \def\ff@txtcol{}\def\ff@clear{}\def\ff@offset{}\def\ff@pages{}% + \def\ff@label{}\def\ff@backcol{}\def\ff@evenx{}\def\ff@eveny{}% + \def\ff@oddx{}\def\ff@oddy{}\def\ff@angle{}% + \let\ff@xpages\undefined + \let\ff@shape\undefined + \setkeys{flowframe}{#2}% + \ifdefempty{\ff@frame}{}% + {% + \setboolean{columnframe\romannumeral#1}{\ff@frame}% + }% + \ifdefempty{\ff@width}{}% + {% + \expandafter + \setlength\csname colwidth\romannumeral#1\endcsname + {\ff@width}% + }% + \ifdefempty{\ff@height}{}% + {% + \expandafter + \setlength\csname colheight\romannumeral#1\endcsname + {\ff@height}% + }% + \ifdefempty{\ff@x}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@posx\endcsname + {\ff@x}% + \expandafter + \setlength\csname col@\romannumeral#1@evenx\endcsname + {\ff@x}% + } + \ifdefempty{\ff@y}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@posy\endcsname + {\ff@y}% + \expandafter + \setlength\csname col@\romannumeral#1@eveny\endcsname + {\ff@y}% + }% + \ifdefempty{\ff@evenx}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@evenx\endcsname + {\ff@evenx}% + }% + \ifdefempty{\ff@eveny}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@eveny\endcsname + {\ff@eveny}% + }% + \ifdefempty{\ff@oddx}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@posx\endcsname + {\ff@oddx}% + }% + \ifdefempty{\ff@oddy}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@posy\endcsname + {\ff@oddy}% + }% + \ifdefempty{\ff@label}{}% + {% + \@s@tflowframeid{#1}[\ff@label]% + }% + \ifdefempty{\ff@frametype}{}% + {% + \expandafter + \edef\csname @ff@frametype@\romannumeral#1\endcsname{% + \ff@frametype}% + }% + \ifdefempty{\ff@col}{}% + {% + \expandafter\@setframecol\ff@col\end{#1}{col}{ff}% + }% + \ifdefempty{\ff@txtcol}{}% + {% + \expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{ff}% + }% + \ifdefempty{\ff@backcol}{}% + {% + \expandafter\@setframecol\ff@backcol\end{#1}{backcol}{ff}% + }% + \ifdefempty{\ff@margin}{}% + {% + \expandafter + \xdef\csname @ff@margin@\romannumeral#1\endcsname{% + \ff@margin}% + }% + \ifdefempty{\ff@pages}{}% + {% + \flowsetpagelist{#1}{\ff@pages}% + }% + \ifundef{\ff@xpages}{}% + {% + \flowsetexclusion{#1}{\ff@xpages}% + }% + \ifdefempty{\ff@offset}{}% + {% + \expandafter + \xdef\csname @ff@offset@\romannumeral#1\endcsname{% + \ff@offset}% + }% + \ifdefempty{\ff@angle}{}% + {% + \expandafter + \xdef\csname @ff@angle@\romannumeral#1\endcsname{% + \ff@angle}% + }% + \ifdefempty{\ff@clear}{}% + {% + \PackageError{flowfram}% + {Key 'clear' not available for flow frames}{}% + }% + \ifdefempty{\ff@style}{}% + {% + \PackageError{flowfram}% + {Key 'style' not available for flow frames}{}% + }% + \ifundef{\ff@shape}{}% + {% + \PackageError{flowfram}% + {Key 'shape' not available for flow frames}{}% + }% + \ifdefempty{\ff@valign}{}% + {% + \PackageError{flowfram}% + {Key 'valign' not available for flow frames}{}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\flowsetpagelist} +% Sets the page list for the \gls{flow} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\flowsetpagelist}[2]{% + \expandafter + \xdef\csname @ff@pages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting page range for flow frame + \number#1\space\space to "#2"}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\flowsetexclusion} +% Sets the exclusion list for the \gls{flow} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\flowsetexclusion}[2]{% + \expandafter + \xdef\csname @ff@xpages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting exclusion for flow frame + \number#1\space\space to "#2"}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\flowaddexclusion} +% Adds to the exclusion list for the \gls{flow} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\flowaddexclusion}[2]{% + \ifcsempty{@ff@xpages@\romannumeral#1} + {% + \expandafter + \xdef\csname @ff@xpages@\romannumeral#1\endcsname{#2}% + }% + {% + \expandafter + \xdef\csname @ff@xpages@\romannumeral#1\endcsname{% + \csname @ff@xpages@\romannumeral#1\endcsname,#2}% + }% + \flf@message{Setting exclusion for flow frame + \number#1\space\space to + "\csname @ff@xpages@\romannumeral#1\endcsname"}% } % \end{macrocode} %\end{macro} +% %\begin{macro}{\ffswapoddeven} % Swap odd and even offsets for a given \gls{flow}. Do the main stuff for % a given \gls{flow} \gls{idn}. % \begin{macrocode} \newcommand*{\@@flowframeswapcoords}[1]{% -\setlength{\@ff@tmp@x}% -{\csname col@\romannumeral#1@evenx\endcsname} -\expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname -{\csname col@\romannumeral#1@posx\endcsname}% -\expandafter\setlength\csname col@\romannumeral#1@posx\endcsname -{\@ff@tmp@x}% -\setlength{\@ff@tmp@y}% -{\csname col@\romannumeral#1@eveny\endcsname} -\expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname -{\csname col@\romannumeral#1@posy\endcsname}% -\expandafter\setlength\csname col@\romannumeral#1@posy\endcsname -{\@ff@tmp@y}% + \setlength{\@ff@tmp@x}% + {\csname col@\romannumeral#1@evenx\endcsname} + \expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname + {\csname col@\romannumeral#1@posx\endcsname}% + \expandafter\setlength\csname col@\romannumeral#1@posx\endcsname + {\@ff@tmp@x}% + \setlength{\@ff@tmp@y}% + {\csname col@\romannumeral#1@eveny\endcsname} + \expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname + {\csname col@\romannumeral#1@posy\endcsname}% + \expandafter\setlength\csname col@\romannumeral#1@posy\endcsname + {\@ff@tmp@y}% } % \end{macrocode} %\end{macro} @@ -1104,47 +1769,67 @@ may only specify 'c', 't' or 'b'}}} % Allow user to specify \gls{flow} either by \gls{idn} or \gls{idl}: % \begin{macrocode} \newcommand*{\ffswapoddeven}{% -\@ifstar\@sflowframeswapcoords\@flowframeswapcoords} + \@ifstar\@sflowframeswapcoords\@flowframeswapcoords +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sflowframeswapcoords} % Starred form % \begin{macrocode} \newcommand*{\@sflowframeswapcoords}[1]{% -\@for\@ff@id:=#1\do{% -\@flowframeid{\@ff@id}% -\@@flowframeswapcoords{\ff@id}}} + \@for\@ff@id:=#1\do + {% + \@flowframeid{\@ff@id}% + \@@flowframeswapcoords{\ff@id}% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@flowframeswapcoords} % Unstarred form: % \begin{macrocode} \newcommand*{\@flowframeswapcoords}[1]{% -\ifthenelse{\equal{#1}{all}}{% -\ff@id=0\relax -\whiledo{\ff@id<\c@maxflow}{\advance\ff@id by 1\relax -\@@flowframeswapcoords{\ff@id}}% -}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}{% -\@@flowframeswapcoords{\@colN}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxflow - \def\@ff@numend{\c@maxflow}% -\fi -\@colN=\@ff@numstart -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@flowframeswapcoords{\@colN}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \ff@id=0\relax + \whiledo{\ff@id<\c@maxflow}% + {% + \advance\ff@id by 1\relax + \@@flowframeswapcoords{\ff@id}% + }% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% + \whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}% + {% + \@@flowframeswapcoords{\@colN}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do + {% + \def\@ff@numstart{0}% + \def\@ff@numend{100000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxflow + \def\@ff@numend{\c@maxflow}% + \fi + \@colN=\@ff@numstart + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@flowframeswapcoords{\@colN}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} % \end{macrocode} %\end{macro} % @@ -1154,37 +1839,43 @@ may only specify 'c', 't' or 'b'}}} %\begin{macro}{\flowframex} % \begin{macrocode} \newcommand*{\flowframex}[1]{% -\csname col@\romannumeral#1@posx\endcsname} + \csname col@\romannumeral#1@posx\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\flowframey} % \begin{macrocode} \newcommand*{\flowframey}[1]{% -\csname col@\romannumeral#1@posy\endcsname} + \csname col@\romannumeral#1@posy\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\flowframeevenx} % \begin{macrocode} \newcommand*{\flowframeevenx}[1]{% -\csname col@\romannumeral#1@evenx\endcsname} + \csname col@\romannumeral#1@evenx\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\flowframeeveny} % \begin{macrocode} \newcommand*{\flowframeeveny}[1]{% -\csname col@\romannumeral#1@eveny\endcsname} + \csname col@\romannumeral#1@eveny\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\flowframewidth} % \begin{macrocode} \newcommand{\flowframewidth}[1]{% -\csname colwidth\romannumeral#1\endcsname} + \csname colwidth\romannumeral#1\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\flowframeheight} % \begin{macrocode} \newcommand*{\flowframeheight}[1]{% -\csname colheight\romannumeral#1\endcsname} + \csname colheight\romannumeral#1\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\@setframecol} @@ -1200,15 +1891,17 @@ may only specify 'c', 't' or 'b'}}} % A colour model has been specified. % \begin{macrocode} \def\@@setframecol[#1]#2\end#3#4#5{% -\expandafter\edef\csname @#5@#4@\romannumeral#3\endcsname{% -[#1]{#2}}} + \expandafter\edef\csname @#5@#4@\romannumeral#3\endcsname{% + [#1]{#2}}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@@setfr@mecol} % A colour model has not been specified. % \begin{macrocode} \def\@@setfr@mecol#1\end#2#3#4{% -\expandafter\edef\csname @#4@#3@\romannumeral#2\endcsname{{#1}}} + \expandafter\edef\csname @#4@#3@\romannumeral#2\endcsname{{#1}}% +} % \end{macrocode} %\end{macro} % @@ -1228,9 +1921,9 @@ may only specify 'c', 't' or 'b'}}} %\begin{macro}{\@n@wstaticframe} % \begin{macrocode} \newcommand*{\@n@wstaticframe}{% -\global\advance\c@maxstatic by 1\relax -\newboolean{staticframe\romannumeral\c@maxstatic}% -\@ifstar\@snewstaticframe\@newstaticframe + \global\advance\c@maxstatic by 1\relax + \newboolean{staticframe\romannumeral\c@maxstatic}% + \@ifstar\@snewstaticframe\@newstaticframe } % \end{macrocode} %\end{macro} @@ -1238,98 +1931,118 @@ may only specify 'c', 't' or 'b'}}} % Starred version (has a border): % \begin{macrocode} \newcommand{\@snewstaticframe}{% -\setboolean{staticframe\romannumeral\c@maxstatic}{true}% -\@@newstaticframe} + \setboolean{staticframe\romannumeral\c@maxstatic}{true}% + \@@newstaticframe +} % \end{macrocode} %\end{macro} %\begin{macro}{\@newstaticframe} % Unstarred version (no border): % \begin{macrocode} \newcommand{\@newstaticframe}{% -\setboolean{staticframe\romannumeral\c@maxstatic}{false}% -\@@newstaticframe} + \setboolean{staticframe\romannumeral\c@maxstatic}{false}% + \@@newstaticframe +} % \end{macrocode} %\end{macro} %\begin{macro}{\@@newstaticframe} % Now set up the \gls{static}: % \begin{macrocode} \newcommand*{\@@newstaticframe}[5][all]{% -\expandafter -\newbox\csname @staticframe@\romannumeral\c@maxstatic\endcsname -\expandafter -\newlength\csname @sf@\romannumeral\c@maxstatic @posx\endcsname -\expandafter -\newlength\csname @sf@\romannumeral\c@maxstatic @posy\endcsname -\expandafter\setlength -\csname @sf@\romannumeral\c@maxstatic @posx\endcsname{#4}% -\expandafter\setlength -\csname @sf@\romannumeral\c@maxstatic @posy\endcsname{#5}% -\expandafter\newlength -\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname -\expandafter\newlength -\csname @sf@\romannumeral\c@maxstatic @eveny\endcsname -\expandafter\setlength -\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{#4}% -\expandafter\setlength -\csname @sf@\romannumeral\c@maxstatic @eveny\endcsname{#5}% -{\@ff@tmp@x=#2\relax -\@ff@tmp@y=#3\relax -\expandafter -\xdef\csname @sf@dim@\romannumeral\c@maxstatic\endcsname{% -[c][\the\@ff@tmp@y][c]{\the\@ff@tmp@x}}}% -\expandafter -\def\csname @sf@col@\romannumeral\c@maxstatic\endcsname{% -\flowframecol}% -\expandafter -\def\csname @sf@txtcol@\romannumeral\c@maxstatic\endcsname{% -\flowframetextcol}% -\expandafter -\def\csname @sf@backcol@\romannumeral\c@maxstatic\endcsname{% -{none}}% -\expandafter -\xdef\csname @sf@pages@\romannumeral\c@maxstatic\endcsname{#1}% -\expandafter -\gdef\csname @sf@offset@\romannumeral\c@maxstatic\endcsname{% -compute}% -\expandafter -\gdef\csname @sf@angle@\romannumeral\c@maxstatic\endcsname{0}% -\expandafter -\gdef\csname @sf@shape@\romannumeral\c@maxstatic\endcsname{\relax}% -\expandafter -\def\csname @sf@frametype@\romannumeral\c@maxstatic\endcsname{% -fbox}% -\newboolean{@sf@clear@\romannumeral\c@maxstatic}% -\setboolean{@sf@clear@\romannumeral\c@maxstatic}{false} -\@ifnextchar[{\@s@tstaticframeid{\c@maxstatic}}% -{\@s@tstaticframeid{\c@maxstatic}[\number\c@maxstatic]}} + \expandafter + \newbox\csname @staticframe@\romannumeral\c@maxstatic\endcsname + \expandafter + \newlength\csname @sf@\romannumeral\c@maxstatic @posx\endcsname + \expandafter + \newlength\csname @sf@\romannumeral\c@maxstatic @posy\endcsname + \expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @posx\endcsname{#4}% + \expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @posy\endcsname{#5}% + \expandafter\newlength + \csname @sf@\romannumeral\c@maxstatic @evenx\endcsname + \expandafter\newlength + \csname @sf@\romannumeral\c@maxstatic @eveny\endcsname + \expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{#4}% + \expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @eveny\endcsname{#5}% + {\@ff@tmp@x=#2\relax + \@ff@tmp@y=#3\relax + \expandafter + \xdef\csname @sf@dim@\romannumeral\c@maxstatic\endcsname{% + [c][\the\@ff@tmp@y][c]{\the\@ff@tmp@x}}}% + \expandafter + \def\csname @sf@col@\romannumeral\c@maxstatic\endcsname{% + \flowframecol}% + \expandafter + \def\csname @sf@txtcol@\romannumeral\c@maxstatic\endcsname{% + \flowframetextcol}% + \expandafter + \def\csname @sf@backcol@\romannumeral\c@maxstatic\endcsname{% + {none}}% + \expandafter + \xdef\csname @sf@pages@\romannumeral\c@maxstatic\endcsname{#1}% +% \end{macrocode} +% Page exclusion list: +%\changes{1.14}{2012-11-10}{added page exclusion list} +% \begin{macrocode} + \expandafter + \gdef\csname @sf@xpages@\romannumeral\c@maxflow\endcsname{}% + \expandafter + \gdef\csname @sf@offset@\romannumeral\c@maxstatic\endcsname{% + compute}% + \expandafter + \gdef\csname @sf@angle@\romannumeral\c@maxstatic\endcsname{0}% + \expandafter + \gdef\csname @sf@shape@\romannumeral\c@maxstatic\endcsname{\relax}% + \expandafter + \def\csname @sf@frametype@\romannumeral\c@maxstatic\endcsname{% + fbox}% + \newboolean{@sf@clear@\romannumeral\c@maxstatic}% + \setboolean{@sf@clear@\romannumeral\c@maxstatic}{false} + \@ifnextchar[{\@s@tstaticframeid{\c@maxstatic}}% + {\@s@tstaticframeid{\c@maxstatic}[\number\c@maxstatic]}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@s@tstaticframeid} % Set the label for the \gls{static}: % \begin{macrocode} \def\@s@tstaticframeid#1[#2]{% -\edef\ff@label{#2}% -\@sf@checkuniqueidl{#1}{\ff@label}% -\expandafter -\xdef\csname @sf@id@\romannumeral#1\endcsname{\ff@label}} + \edef\ff@label{#2}% + \@sf@checkuniqueidl{#1}{\ff@label}% + \expandafter + \xdef\csname @sf@id@\romannumeral#1\endcsname{\ff@label}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sf@checkuniqueidl} % Check \gls{idl} "#2" for \gls{static} "#1" is unique % \begin{macrocode} \newcommand*{\@sf@checkuniqueidl}[2]{% -\@colN=0\relax -\whiledo{\@colN<\c@maxstatic}{% -\advance\@colN by 1\relax -\ifnum\@colN=#1\relax -\else -\ifthenelse{% -\equal{#2}{\csname @sf@id@\romannumeral\@colN\endcsname}}{% -\PackageError{flowfram}{Static frame IDL '#2' already defined}{% -You can't assign this label, as it is already defined -for static frame \number\@colN}}{}% -\fi -}} + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \ifnum\@colN=#1\relax + \else + \ifthenelse + {% + \equal{#2}{\csname @sf@id@\romannumeral\@colN\endcsname}% + }% + {% + \PackageError{flowfram}% + {Static frame IDL '#2' already defined}% + {% + You can't assign this label, as it is already defined + for static frame \number\@colN + }% + }% + {}% + \fi + }% +} % \end{macrocode} %\end{macro} % @@ -1340,7 +2053,8 @@ for static frame \number\@colN}}{}% % \gls{idn}. % \begin{macrocode} \newcommand*{\getstaticlabel}[1]{% -\csname @sf@id@\romannumeral#1\endcsname} + \csname @sf@id@\romannumeral#1\endcsname +} % \end{macrocode} %\end{macro} % @@ -1352,7 +2066,8 @@ for static frame \number\@colN}}{}% % sequence. % \begin{macrocode} \newcommand*{\getstaticid}[2]{% -\@staticframeid{#2}\edef#1{\number\ff@id}} + \@staticframeid{#2}\edef#1{\number\ff@id}% +} % \end{macrocode} %\end{macro} % @@ -1362,16 +2077,30 @@ for static frame \number\@colN}}{}% % so if there are a lot of \glspl{static}, it may take a while. % The \gls{idn} stored in "\ff@id". % \begin{macrocode} -\newcommand*{\@staticframeid}[1]{\@colN=0\relax -\ff@id=0\relax -\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\ifthenelse{% -\equal{#1}{\csname @sf@id@\romannumeral\@colN\endcsname}}{% -\ff@id=\@colN\relax -% break out of loop -\@colN=\c@maxstatic}{}}% -\ifnum\ff@id=0\PackageError{flowfram}{Can't find static frame -id '#1'}{}\fi} +\newcommand*{\@staticframeid}[1]{% + \@colN=0\relax + \ff@id=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \ifthenelse + {% + \equal{#1}{\csname @sf@id@\romannumeral\@colN\endcsname}% + }% + {% + \ff@id=\@colN\relax +% \end{macrocode} +% Break out of loop +% \begin{macrocode} + \@colN=\c@maxstatic + }% + {}% + }% + \ifnum\ff@id=0\relax + \PackageError{flowfram}% + {Can't find static frame id '#1'}{}% + \fi +} % \end{macrocode} %\end{macro} % @@ -1380,40 +2109,50 @@ id '#1'}{}\fi} %\begin{macro}{\staticframex} % \begin{macrocode} \newcommand*{\staticframex}[1]{% -\csname @sf@\romannumeral#1@posx\endcsname} + \csname @sf@\romannumeral#1@posx\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\staticframey} % \begin{macrocode} \newcommand*{\staticframey}[1]{% -\csname @sf@\romannumeral#1@posy\endcsname} + \csname @sf@\romannumeral#1@posy\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\staticframeevenx} % \begin{macrocode} \newcommand*{\staticframeevenx}[1]{% -\csname @sf@\romannumeral#1@evenx\endcsname} + \csname @sf@\romannumeral#1@evenx\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\staticframeeveny} % \begin{macrocode} \newcommand*{\staticframeeveny}[1]{% -\csname @sf@\romannumeral#1@eveny\endcsname} + \csname @sf@\romannumeral#1@eveny\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\setallstaticframes} % Modify the settings for all the \glspl{static}: % \begin{macrocode} \newcommand*{\setallstaticframes}[1]{% -\@colN=0\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\@@setstaticframe{\@colN}{#1}}} + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \@@setstaticframe{\@colN}{#1}% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\setstaticframe} % Modify the settings for the specified \glspl{static}: % \begin{macrocode} \newcommand*{\setstaticframe}{% -\@ifstar\@ssetstaticframe\@setstaticframe} + \@ifstar\@ssetstaticframe\@setstaticframe +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ssetstaticframe} @@ -1421,9 +2160,12 @@ id '#1'}{}\fi} % list of labels. % \begin{macrocode} \newcommand*{\@ssetstaticframe}[2]{% -\@for\@ff@id:=#1\do{% -\@staticframeid{\@ff@id}% -\@@setstaticframe{\ff@id}{#2}}} + \@for\@ff@id:=#1\do + {% + \@staticframeid{\@ff@id}% + \@@setstaticframe{\ff@id}{#2}% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@setstaticframe} @@ -1432,28 +2174,42 @@ id '#1'}{}\fi} % Ensures that number ranges do not lie out of bounds. % \begin{macrocode} \newcommand*{\@setstaticframe}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\setallstaticframes{#2}}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxstatic\TE@or\@colN=\c@maxstatic}{% -\@@setstaticframe{\@colN}{#2}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxstatic\relax - \def\@ff@numend{\c@maxstatic}% -\fi -\@colN=\@ff@numstart\relax -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@setstaticframe{\@colN}{#2}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \setallstaticframes{#2}% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% + \whiledo{\@colN<\c@maxstatic\TE@or\@colN=\c@maxstatic}% + {% + \@@setstaticframe{\@colN}{#2}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do + {% + \def\@ff@numstart{0}% + \def\@ff@numend{10000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxstatic\relax + \def\@ff@numend{\c@maxstatic}% + \fi + \@colN=\@ff@numstart\relax + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@setstaticframe{\@colN}{#2}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@@setstaticframe} @@ -1461,85 +2217,127 @@ id '#1'}{}\fi} % is given by the first argument. % \begin{macrocode} \newcommand*{\@@setstaticframe}[2]{% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname -\def\ff@frame{}\edef\ff@width{\the\@ff@tmp@x}\def\ff@angle{}% -\edef\ff@height{\the\@ff@tmp@y}\def\ff@style{}\def\ff@frametype{}% -\def\ff@x{}\def\ff@y{}\def\ff@col{}\def\ff@txtcol{}% -\def\ff@backcol{}\def\ff@shape{0}% -\def\ff@clear{}\def\ff@margin{}\def\ff@offset{}\def\ff@pages{}% -\def\ff@label{}\def\ff@evenx{}\def\ff@eveny{}% -\def\ff@oddx{}\def\ff@oddy{}% -\setkeys{flowframe}{#2}% -\ifthenelse{\equal{\ff@frame}{}}{}{% -\setboolean{staticframe\romannumeral#1}{\ff@frame}}% -\ifthenelse{\equal{\ff@x}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@posx\endcsname -{\ff@x}% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@evenx\endcsname -{\ff@x}}% -\ifthenelse{\equal{\ff@y}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@posy\endcsname -{\ff@y}% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@eveny\endcsname -{\ff@y}}% -\ifthenelse{\equal{\ff@evenx}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@evenx\endcsname -{\ff@evenx}}% -\ifthenelse{\equal{\ff@eveny}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@eveny\endcsname -{\ff@eveny}}% -\ifthenelse{\equal{\ff@oddx}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@posx\endcsname -{\ff@oddx}}% -\ifthenelse{\equal{\ff@oddy}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@posy\endcsname -{\ff@oddy}}% -\expandafter -\xdef\csname @sf@dim@\romannumeral#1\endcsname{% -[c][\ff@height][\ff@valign]{\ff@width}}% -\ifthenelse{\equal{\ff@frametype}{}}{}{% -\expandafter -\xdef\csname @sf@frametype@\romannumeral#1\endcsname{% -\ff@frametype}}% -\ifthenelse{\equal{\ff@label}{}}{}{% -\@s@tstaticframeid{#1}[\ff@label]} -\ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\@setframecol\ff@col\end{#1}{col}{sf}}% -\ifthenelse{\equal{\ff@txtcol}{}}{}{% -\expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{sf}}% -\ifthenelse{\equal{\ff@backcol}{}}{}{% -\expandafter\@setframecol\ff@backcol\end{#1}{backcol}{sf}}% -\ifthenelse{\equal{\ff@offset}{}}{}{% -\expandafter -\xdef\csname @sf@offset@\romannumeral#1\endcsname{\ff@offset}}% -\ifthenelse{\equal{\ff@angle}{}}{}{% -\expandafter -\xdef\csname @sf@angle@\romannumeral#1\endcsname{\ff@angle}}% -\if0\ff@shape -\else -\expandafter\global\expandafter -\let\csname @sf@shape@\romannumeral#1\endcsname\ff@shape -\fi -\ifthenelse{\equal{\ff@pages}{}}{}{% -\expandafter -\xdef\csname @sf@pages@\romannumeral#1\endcsname{\ff@pages}}% -\ifthenelse{\equal{\ff@clear}{}}{}{% -\setboolean{@sf@clear@\romannumeral#1}{\ff@clear}}% -\ifthenelse{\equal{\ff@margin}{}}{}{% -\PackageError{flowfram}{Key 'margin' not available for -static frames}{Static frames don't have marginal notes}}% -\ifthenelse{\equal{\ff@style}{}}{}{% -\PackageError{flowfram}{Key 'style' not available for -static frames}{}}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname + \def\ff@frame{}\edef\ff@width{\the\@ff@tmp@x}\def\ff@angle{}% + \edef\ff@height{\the\@ff@tmp@y}\def\ff@style{}\def\ff@frametype{}% + \def\ff@x{}\def\ff@y{}\def\ff@col{}\def\ff@txtcol{}% + \def\ff@backcol{}% + \def\ff@clear{}\def\ff@margin{}\def\ff@offset{}\def\ff@pages{}% + \def\ff@label{}\def\ff@evenx{}\def\ff@eveny{}% + \def\ff@oddx{}\def\ff@oddy{}% + \let\ff@shape\undefined + \let\ff@xpages\undefined + \setkeys{flowframe}{#2}% + \ifdefempty{\ff@frame}{}% + {% + \setboolean{staticframe\romannumeral#1}{\ff@frame}% + }% + \ifdefempty{\ff@x}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@posx\endcsname + {\ff@x}% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@evenx\endcsname + {\ff@x}% + }% + \ifdefempty{\ff@y}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@posy\endcsname + {\ff@y}% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@eveny\endcsname + {\ff@y}% + }% + \ifdefempty{\ff@evenx}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@evenx\endcsname + {\ff@evenx}% + }% + \ifdefempty{\ff@eveny}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@eveny\endcsname + {\ff@eveny}% + }% + \ifdefempty{\ff@oddx}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@posx\endcsname + {\ff@oddx}% + }% + \ifdefempty{\ff@oddy}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@posy\endcsname + {\ff@oddy}% + }% + \expandafter + \xdef\csname @sf@dim@\romannumeral#1\endcsname{% + [c][\ff@height][\ff@valign]{\ff@width}}% + \ifdefempty{\ff@frametype}{}% + {% + \expandafter + \xdef\csname @sf@frametype@\romannumeral#1\endcsname{% + \ff@frametype}% + }% + \ifdefempty{\ff@label}{}% + {% + \@s@tstaticframeid{#1}[\ff@label]% + } + \ifdefempty{\ff@col}{}% + {% + \expandafter\@setframecol\ff@col\end{#1}{col}{sf}% + }% + \ifdefempty{\ff@txtcol}{}% + {% + \expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{sf}% + }% + \ifdefempty{\ff@backcol}{}% + {% + \expandafter\@setframecol\ff@backcol\end{#1}{backcol}{sf}% + }% + \ifdefempty{\ff@offset}{}% + {% + \expandafter + \xdef\csname @sf@offset@\romannumeral#1\endcsname{\ff@offset}% + }% + \ifdefempty{\ff@angle}{}% + {% + \expandafter + \xdef\csname @sf@angle@\romannumeral#1\endcsname{\ff@angle}% + }% + \ifundef{\ff@shape}{}% + {% + \expandafter\global\expandafter + \let\csname @sf@shape@\romannumeral#1\endcsname\ff@shape + }% + \ifdefempty{\ff@pages}{}% + {% + \staticsetpagelist{#1}{\ff@pages}% + }% + \ifundef{\ff@xpages}{}% + {% + \staticsetexclusion{#1}{\ff@xpages}% + }% + \ifdefempty{\ff@clear}{}% + {% + \setboolean{@sf@clear@\romannumeral#1}{\ff@clear}% + }% + \ifdefempty{\ff@margin}{}% + {% + \PackageError{flowfram}% + {Key 'margin' not available for static frames}% + {Static frames don't have marginal notes}% + }% + \ifdefempty{\ff@style}{}% + {% + \PackageError{flowfram}% + {Key 'style' not available for static frames}{}% + }% } % \end{macrocode} %\end{macro} @@ -1556,9 +2354,13 @@ static frames}{}}% % break. % \begin{macrocode} \let\FLForgpar\par -\newcommand{\ffpshpar}{\edef\flf@next{\hangafter=\the\hangafter -\hangindent=\the\hangindent}\FLForgpar\flf@next -\edef\flf@next{\prevgraf=\the\prevgraf}\@ff@parshape\indent\mbox{}\flf@next} +\newcommand{\ffpshpar}{% + \edef\flf@next{\hangafter=\the\hangafter + \hangindent=\the\hangindent}% + \FLForgpar\flf@next + \edef\flf@next{\prevgraf=\the\prevgraf}% + \@ff@parshape\indent\mbox{}\flf@next +} % \end{macrocode} %\end{macro} % @@ -1571,62 +2373,80 @@ static frames}{}}% %\begin{macro}{\@ff@sectionhead} % \begin{macrocode} \newcommand*{\@ff@sectionhead}[1]{% -\def\ff@sechead{#1}% -\ffpshpar -\@ifstar{\@s@ff@heading}{\@dblarg\@ff@heading}} + \def\ff@sechead{#1}% + \ffpshpar + \@ifstar{\@s@ff@heading}{\@dblarg\@ff@heading}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@s@ff@heading} % \begin{macrocode} \def\@s@ff@heading#1{% -\@ifundefined{@ff@old\ff@sechead}{\PackageError{flowfram}{Unknown -heading command '\ff@sechead'}{}}{% -\begingroup -\edef\flf@next{\hangafter=\the\hangafter -\hangindent=\the\hangindent}\FLForgpar\flf@next -\let\par=\FLForgpar -\edef\flf@next{\prevgraf=\the\prevgraf}% -\csname @ff@old\ff@sechead\endcsname*{\@ff@parshape\flf@next -#1}% -\xdef\flf@next{\@ff@parshape -\prevgraf=\the\prevgraf}% -\endgroup -}% -\mbox{}\flf@next\let\flf@next\undefined} + \@ifundefined{@ff@old\ff@sechead}% + {% + \PackageError{flowfram}% + {Unknown heading command '\ff@sechead'}{}% + }% + {% + \begingroup + \edef\flf@next{\hangafter=\the\hangafter + \hangindent=\the\hangindent}% + \FLForgpar\flf@next + \let\par=\FLForgpar + \edef\flf@next{\prevgraf=\the\prevgraf}% + \csname @ff@old\ff@sechead\endcsname*{% + \@ff@parshape\flf@next #1}% + \xdef\flf@next{% + \@ff@parshape + \prevgraf=\the\prevgraf}% + \endgroup + }% + \mbox{}\flf@next + \let\flf@next\undefined +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@heading} % \begin{macrocode} \def\@ff@heading[#1]#2{% -\@ifundefined{@ff@old\ff@sechead}{\PackageError{flowfram}{Unknown -heading command '\ff@sechead'}{}}{% -\begingroup -\edef\flf@next{\hangafter=\the\hangafter -\hangindent=\the\hangindent}\FLForgpar\flf@next -\let\par=\FLForgpar -\edef\flf@next{\prevgraf=\the\prevgraf}% -\csname @ff@old\ff@sechead\endcsname[#1]{\@ff@parshape\flf@next -#2}% -\xdef\flf@next{\@ff@parshape -\prevgraf=\the\prevgraf}% -\endgroup}% -\mbox{}\flf@next\let\flf@next\undefined} + \@ifundefined{@ff@old\ff@sechead}% + {% + \PackageError{flowfram}% + {Unknown heading command '\ff@sechead'}{}% + }% + {% + \begingroup + \edef\flf@next{% + \hangafter=\the\hangafter + \hangindent=\the\hangindent}% + \FLForgpar\flf@next + \let\par=\FLForgpar + \edef\flf@next{\prevgraf=\the\prevgraf}% + \csname @ff@old\ff@sechead\endcsname[#1]{% + \@ff@parshape\flf@next #2}% + \xdef\flf@next{\@ff@parshape + \prevgraf=\the\prevgraf}% + \endgroup + }% + \mbox{}\flf@next + \let\flf@next\undefined +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@setsecthead} % Define command to switch to adjusted section headings: % \begin{macrocode} \newcommand*{\@ff@setsecthead}{% -\let\@ff@oldsection=\section -\let\@ff@oldsubsection=\subsection -\let\@ff@oldsubsubsection=\subsubsection -\let\@ff@oldparagraph=\paragraph -\let\@ff@oldsubparagraph=\subparagraph -\def\section{\@ff@sectionhead{section}}% -\def\subsection{\@ff@sectionhead{subsection}}% -\def\subsubsection{\@ff@sectionhead{subsubsection}}% -\def\paragraph{\@ff@sectionhead{paragraph}}% -\def\subparagraph{\@ff@sectionhead{subparagraph}}% + \let\@ff@oldsection=\section + \let\@ff@oldsubsection=\subsection + \let\@ff@oldsubsubsection=\subsubsection + \let\@ff@oldparagraph=\paragraph + \let\@ff@oldsubparagraph=\subparagraph + \def\section{\@ff@sectionhead{section}}% + \def\subsection{\@ff@sectionhead{subsection}}% + \def\subsubsection{\@ff@sectionhead{subsubsection}}% + \def\paragraph{\@ff@sectionhead{paragraph}}% + \def\subparagraph{\@ff@sectionhead{subparagraph}}% } % \end{macrocode} %\end{macro} @@ -1634,36 +2454,51 @@ heading command '\ff@sechead'}{}}{% % Determine what shape command is being used: % \begin{macrocode} \def\@ff@getshape#1#2\relax{% -\ifx#1\parshape -\def\ff@shape{1}% -\else -\ifx#1\shapepar -\def\ff@shape{2}% -\else -\ifx#1\relax -\def\ff@shape{0}% -\else -\PackageError{flowfram}{Unknown shape \string#1}{}% -\def\ff@shape{2}% -\fi -\fi -\fi} + \ifdefequal{#1}{\parshape}% + {% + \def\ff@shape{1}% + }% + {% + \ifdefequal{#1}{\shapepar}% + {% + \def\ff@shape{2}% + }% + {% + \ifx#1\relax + \def\ff@shape{0}% + \else + \PackageError{flowfram}{Unknown shape \string#1}{}% + \def\ff@shape{2}% + \fi + }% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@disablesec} % Disable sectioning commands % \begin{macrocode} \newcommand*{\@ff@disablesec}{% -\def\section{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% -\def\subsection{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% -\def\subsubsection{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% -\def\paragraph{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% -\def\subparagraph{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% + \def\section{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% + \def\subsection{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% + \def\subsubsection{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% + \def\paragraph{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% + \def\subparagraph{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% } % \end{macrocode} %\end{macro} @@ -1674,77 +2509,98 @@ sectioning commands within a \string\shapepar}{}}% % \begin{macrocode} \newbox\staticframe \newenvironment{staticcontents}[1]{% -\let\continueonframe=\@staticcontinueonframe -\@beginstaticcontents{#1}% -}{% -\@endstaticcontents -\ignorespaces} + \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} +\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 -\expandafter\@ff@getshape\@ff@parshape\relax -\ifcase\ff@shape -% no shape -\edef\@sf@mpg{% -\noexpand -\begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname -\noexpand\begingroup -\noexpand\let\noexpand\FLForgpar=\noexpand\par -}% -\or -% \parshape -\edef\@sf@mpg{% -\noexpand -\begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname -\@ff@parshape -\noexpand\begingroup -\noexpand\let\noexpand\FLForgpar=\noexpand\par -\noexpand\let\noexpand\par=\noexpand\ffpshpar -\noexpand\@ff@setsecthead -}% -\or -% \shapepar -\edef\@sf@mpg{% -\noexpand -\begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname -\noexpand\begingroup -\noexpand\@ff@disablesec -\noexpand\@ff@parshape -}% -\fi -\edef\@sf@thisframe{\csname @staticframe@\romannumeral#1\endcsname}% -\begin{lrbox}{\staticframe}% -\edef\ff@txtcol{\csname @sf@txtcol@\romannumeral#1\endcsname}% -\@s@tfftextcol\noindent -\@sf@mpg -\setlength\parindent\sdfparindent + \@ifundefined{@staticframe@\romannumeral#1}% + {% + \PackageError{flowfram}{Static frame '#1' not defined}{}% + }% + {}% + \expandafter\let\expandafter\@ff@parshape\csname @sf@shape@\romannumeral#1\endcsname + \expandafter\@ff@getshape\@ff@parshape\relax + \ifcase\ff@shape +% \end{macrocode} +% no shape: +% \begin{macrocode} + \edef\@sf@mpg{% + \noexpand + \begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname + \noexpand\begingroup + \noexpand\let\noexpand\FLForgpar=\noexpand\par + }% + \or +% \end{macrocode} +% \ics{parshape}: +% \begin{macrocode} + \edef\@sf@mpg{% + \noexpand + \begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname + \@ff@parshape + \noexpand\begingroup + \noexpand\let\noexpand\FLForgpar=\noexpand\par + \noexpand\let\noexpand\par=\noexpand\ffpshpar + \noexpand\@ff@setsecthead + }% + \or +% \end{macrocode} +% \ics{shapepar}: +% \begin{macrocode} + \edef\@sf@mpg{% + \noexpand + \begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname + \noexpand\begingroup + \noexpand\@ff@disablesec + \noexpand\@ff@parshape + }% + \fi + \edef\@sf@thisframe{\csname @staticframe@\romannumeral#1\endcsname}% + \begin{lrbox}{\staticframe}% + \edef\ff@txtcol{\csname @sf@txtcol@\romannumeral#1\endcsname}% + \@s@tfftextcol\noindent + \@sf@mpg + \setlength\parindent\sdfparindent } % \end{macrocode} % End staticcontents stuff % \begin{macrocode} \newcommand*{\@endstaticcontents}{% -\ifnum\ff@shape=2\par -\else\FLForgpar\fi\endgroup\end{minipage}\end{lrbox}% -\expandafter\global\expandafter\sbox\@sf@thisframe{% -\usebox\staticframe}} + \ifnum\ff@shape=2\relax + \par + \else + \FLForgpar + \fi + \endgroup + \end{minipage}% + \end{lrbox}% + \expandafter\global\expandafter + \sbox\@sf@thisframe{\usebox\staticframe}% +} % \end{macrocode} % %\begin{macro}{\setstaticcontents} @@ -1752,21 +2608,77 @@ sectioning commands within a \string\shapepar}{}}% % Syntax: \cs{setstaticcontents}\marg{idn}\marg{text}. % \begin{macrocode} \newcommand{\setstaticcontents}{% -\@ifstar\@sstaticconts\@staticconts} + \@ifstar\@sstaticconts\@staticconts +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sstaticconts} % Starred version: \gls{static} identified by label. % \begin{macrocode} -\newcommand{\@sstaticconts}[2]{\begin{staticcontents*}{#1}% -#2\end{staticcontents*}} +\newcommand{\@sstaticconts}[2]{% + \begin{staticcontents*}{#1}% + #2% + \end{staticcontents*}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@staticconts} % Unstarred version: \gls{static} identified by \gls{idn}. % \begin{macrocode} -\newcommand{\@staticconts}[2]{\begin{staticcontents}{#1}% -#2\end{staticcontents}} +\newcommand{\@staticconts}[2]{% + \begin{staticcontents}{#1}% + #2% + \end{staticcontents}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\staticsetpagelist} +% Sets the page list for the \gls{static} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\staticsetpagelist}[2]{% + \expandafter + \xdef\csname @sf@pages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting page range for static frame + \number#1\space\space to "#2"}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\staticsetexclusion} +% Sets the exclusion list for the \gls{static} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\staticsetexclusion}[2]{% + \expandafter + \xdef\csname @sf@xpages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting exclusion for static frame + \number#1\space\space to "#2"}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\staticaddexclusion} +% Adds to the exclusion list for the \gls{static} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\staticaddexclusion}[2]{% + \ifcsempty{@sf@xpages@\romannumeral#1} + {% + \expandafter + \xdef\csname @sf@xpages@\romannumeral#1\endcsname{#2}% + }% + {% + \expandafter + \xdef\csname @sf@xpages@\romannumeral#1\endcsname{% + \csname @sf@xpages@\romannumeral#1\endcsname,#2}% + }% + \flf@message{Setting exclusion for static frame + \number#1\space\space to + "\csname @sf@xpages@\romannumeral#1\endcsname"}% +} % \end{macrocode} %\end{macro} % @@ -1775,18 +2687,18 @@ sectioning commands within a \string\shapepar}{}}% % a given \gls{static} \gls{idn}. % \begin{macrocode} \newcommand*{\@@staticframeswapcoords}[1]{% -\setlength{\@ff@tmp@x}% -{\csname @sf@\romannumeral#1@evenx\endcsname} -\expandafter\setlength\csname @sf@\romannumeral#1@evenx\endcsname -{\csname @sf@\romannumeral#1@posx\endcsname}% -\expandafter\setlength\csname @sf@\romannumeral#1@posx\endcsname -{\@ff@tmp@x}% -\setlength{\@ff@tmp@y}% -{\csname @sf@\romannumeral#1@eveny\endcsname} -\expandafter\setlength\csname @sf@\romannumeral#1@eveny\endcsname -{\csname @sf@\romannumeral#1@posy\endcsname}% -\expandafter\setlength\csname @sf@\romannumeral#1@posy\endcsname -{\@ff@tmp@y}% + \setlength{\@ff@tmp@x}% + {\csname @sf@\romannumeral#1@evenx\endcsname} + \expandafter\setlength\csname @sf@\romannumeral#1@evenx\endcsname + {\csname @sf@\romannumeral#1@posx\endcsname}% + \expandafter\setlength\csname @sf@\romannumeral#1@posx\endcsname + {\@ff@tmp@x}% + \setlength{\@ff@tmp@y}% + {\csname @sf@\romannumeral#1@eveny\endcsname} + \expandafter\setlength\csname @sf@\romannumeral#1@eveny\endcsname + {\csname @sf@\romannumeral#1@posy\endcsname}% + \expandafter\setlength\csname @sf@\romannumeral#1@posy\endcsname + {\@ff@tmp@y}% } % \end{macrocode} %\end{macro} @@ -1794,47 +2706,66 @@ sectioning commands within a \string\shapepar}{}}% % Allow user to specify \gls{flow} either by \gls{idn} or \gls{idl}: % \begin{macrocode} \newcommand*{\sfswapoddeven}{% -\@ifstar\@sstaticframeswapcoords\@staticframeswapcoords} + \@ifstar\@sstaticframeswapcoords\@staticframeswapcoords +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sstaticframeswapcoords} % Starred form % \begin{macrocode} \newcommand*{\@sstaticframeswapcoords}[1]{% -\@for\@ff@id:=#1\do{% -\@staticframeid{\@ff@id}% -\@@staticframeswapcoords{\ff@id}}} -% \end{macrocode} + \@for\@ff@id:=#1\do + {% + \@staticframeid{\@ff@id}% + \@@staticframeswapcoords{\ff@id}% + }% +} +% \end{macrocode} %\end{macro} %\begin{macro}{\@staticframeswapcoords} % Unstarred form: % \begin{macrocode} \newcommand*{\@staticframeswapcoords}[1]{% -\ifthenelse{\equal{#1}{all}}{% -\ff@id=0\relax -\whiledo{\ff@id<\c@maxflow}{\advance\ff@id by 1\relax -\@@staticframeswapcoords{\ff@id}}% -}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}{% -\@@staticframeswapcoords{\@colN}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxflow - \def\@ff@numend{\c@maxflow}% -\fi -\@colN=\@ff@numstart -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@staticframeswapcoords{\@colN}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \ff@id=0\relax + \whiledo{\ff@id<\c@maxflow}% + {% + \advance\ff@id by 1\relax + \@@staticframeswapcoords{\ff@id}% + }% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% + \whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}% + {% + \@@staticframeswapcoords{\@colN}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do + {% + \def\@ff@numstart{0}\def\@ff@numend{100000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxflow + \def\@ff@numend{\c@maxflow}% + \fi + \@colN=\@ff@numstart + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@staticframeswapcoords{\@colN}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} % \end{macrocode} %\end{macro} % @@ -1847,11 +2778,12 @@ sectioning commands within a \string\shapepar}{}}% % \cs{newdynamicframe}\oarg{pages}\marg{width}\marg{height}\marg{x}\marg{y}\oarg{label} % \begin{macrocode} \newcommand*{\newdynamicframe}{% -\@n@wdynamicframe} + \@n@wdynamicframe +} \newcommand*{\@n@wdynamicframe}{% -\global\advance\c@maxdynamic by 1\relax -\newboolean{dynamicframe\romannumeral\c@maxdynamic} -\@ifstar\@snewdynamicframe\@newdynamicframe + \global\advance\c@maxdynamic by 1\relax + \newboolean{dynamicframe\romannumeral\c@maxdynamic} + \@ifstar\@snewdynamicframe\@newdynamicframe } % \end{macrocode} %\end{macro} @@ -1859,99 +2791,125 @@ sectioning commands within a \string\shapepar}{}}% % Starred version: has a border. % \begin{macrocode} \newcommand*{\@snewdynamicframe}{% -\setboolean{dynamicframe\romannumeral\c@maxdynamic}{true}% -\@@newdynamicframe} + \setboolean{dynamicframe\romannumeral\c@maxdynamic}{true}% + \@@newdynamicframe +} % \end{macrocode} %\end{macro} %\begin{macro}{\@newdynamicframe} % Unstarred version: no border. % \begin{macrocode} \newcommand*{\@newdynamicframe}{% -\setboolean{dynamicframe\romannumeral\c@maxdynamic}{false}% -\@@newdynamicframe} + \setboolean{dynamicframe\romannumeral\c@maxdynamic}{false}% + \@@newdynamicframe +} % \end{macrocode} %\end{macro} %\begin{macro}{\@@newdynamicframe} % Create new \gls{dynamic}: % \begin{macrocode} \newcommand*{\@@newdynamicframe}[5][all]{% -\expandafter -\gdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{}% -\expandafter -\newlength\csname @df@\romannumeral\c@maxdynamic @posx\endcsname -\expandafter -\newlength\csname @df@\romannumeral\c@maxdynamic @posy\endcsname -\expandafter\setlength -\csname @df@\romannumeral\c@maxdynamic @posx\endcsname{#4}% -\expandafter\setlength -\csname @df@\romannumeral\c@maxdynamic @posy\endcsname{#5}% -\expandafter\newlength -\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname -\expandafter\newlength -\csname @df@\romannumeral\c@maxdynamic @eveny\endcsname -\expandafter\setlength -\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname{#4}% -\expandafter\setlength -\csname @df@\romannumeral\c@maxdynamic @eveny\endcsname{#5}% -{\@ff@tmp@x=#2\relax -\@ff@tmp@y=#3\relax -\expandafter -\xdef\csname @df@dim@\romannumeral\c@maxdynamic\endcsname{% -[c][\the\@ff@tmp@y][t]{\the\@ff@tmp@x}}}% -\expandafter -\gdef\csname @df@col@\romannumeral\c@maxdynamic\endcsname{% -\flowframecol}% -\expandafter -\gdef\csname @df@txtcol@\romannumeral\c@maxdynamic\endcsname{% -\flowframetextcol}% -\expandafter -\gdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname{% -{none}}% -\expandafter -\gdef\csname @df@pages@\romannumeral\c@maxdynamic\endcsname{#1}% -\expandafter -\gdef\csname @df@frametype@\romannumeral\c@maxdynamic\endcsname{% -fbox}% -\expandafter -\gdef\csname @df@style@\romannumeral\c@maxdynamic\endcsname{relax}% -\expandafter -\gdef\csname @df@offset@\romannumeral\c@maxdynamic\endcsname{compute}% -\expandafter -\gdef\csname @df@angle@\romannumeral\c@maxdynamic\endcsname{0}% -\expandafter -\gdef\csname @df@shape@\romannumeral\c@maxdynamic\endcsname{\relax}% -\newboolean{@df@clear@\romannumeral\c@maxdynamic}% -\setboolean{@df@clear@\romannumeral\c@maxdynamic}{false}% -\@ifnextchar[{\@s@tdynamicframeid{\c@maxdynamic}}% -{\@s@tdynamicframeid{\c@maxdynamic}[\number\c@maxdynamic]}} + \expandafter + \gdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{}% + \expandafter + \newlength\csname @df@\romannumeral\c@maxdynamic @posx\endcsname + \expandafter + \newlength\csname @df@\romannumeral\c@maxdynamic @posy\endcsname + \expandafter\setlength + \csname @df@\romannumeral\c@maxdynamic @posx\endcsname{#4}% + \expandafter\setlength + \csname @df@\romannumeral\c@maxdynamic @posy\endcsname{#5}% + \expandafter\newlength + \csname @df@\romannumeral\c@maxdynamic @evenx\endcsname + \expandafter\newlength + \csname @df@\romannumeral\c@maxdynamic @eveny\endcsname + \expandafter\setlength + \csname @df@\romannumeral\c@maxdynamic @evenx\endcsname{#4}% + \expandafter\setlength + \csname @df@\romannumeral\c@maxdynamic @eveny\endcsname{#5}% + {% + \@ff@tmp@x=#2\relax + \@ff@tmp@y=#3\relax + \expandafter + \xdef\csname @df@dim@\romannumeral\c@maxdynamic\endcsname{% + [c][\the\@ff@tmp@y][t]{\the\@ff@tmp@x}% + }% + }% + \expandafter + \gdef\csname @df@col@\romannumeral\c@maxdynamic\endcsname{% + \flowframecol + }% + \expandafter + \gdef\csname @df@txtcol@\romannumeral\c@maxdynamic\endcsname{% + \flowframetextcol + }% + \expandafter + \gdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname{% + {none}}% + \expandafter + \gdef\csname @df@pages@\romannumeral\c@maxdynamic\endcsname{#1}% +% \end{macrocode} +% Page exclusion list: +%\changes{1.14}{2012-11-10}{added page exclusion list} +% \begin{macrocode} + \expandafter + \gdef\csname @df@xpages@\romannumeral\c@maxflow\endcsname{}% + \expandafter + \gdef\csname @df@frametype@\romannumeral\c@maxdynamic\endcsname{% + fbox}% + \expandafter + \gdef\csname @df@style@\romannumeral\c@maxdynamic\endcsname{relax}% + \expandafter + \gdef\csname @df@offset@\romannumeral\c@maxdynamic\endcsname{compute}% + \expandafter + \gdef\csname @df@angle@\romannumeral\c@maxdynamic\endcsname{0}% + \expandafter + \gdef\csname @df@shape@\romannumeral\c@maxdynamic\endcsname{\relax}% + \newboolean{@df@clear@\romannumeral\c@maxdynamic}% + \setboolean{@df@clear@\romannumeral\c@maxdynamic}{false}% + \@ifnextchar[{\@s@tdynamicframeid{\c@maxdynamic}}% + {\@s@tdynamicframeid{\c@maxdynamic}[\number\c@maxdynamic]}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@s@tdynamicframeid} % Set the label for the given \gls{dynamic}: % \begin{macrocode} \def\@s@tdynamicframeid#1[#2]{% -\edef\ff@label{#2}% -\@df@checkuniqueidl{#1}{\ff@label}% -\expandafter -\xdef\csname @df@id@\romannumeral#1\endcsname{\ff@label}} + \edef\ff@label{#2}% + \@df@checkuniqueidl{#1}{\ff@label}% + \expandafter + \xdef\csname @df@id@\romannumeral#1\endcsname{\ff@label}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@df@checkuniqueidl} % Check \gls{idl} "#2" for \gls{static} "#1" is unique % \begin{macrocode} \newcommand*{\@df@checkuniqueidl}[2]{% -\@colN=0\relax -\whiledo{\@colN<\c@maxdynamic}{% -\advance\@colN by 1\relax -\ifnum\@colN=#1\relax -\else -\ifthenelse{\equal{#2}% -{\csname @df@id@\romannumeral\@colN\endcsname}}{% -\PackageError{flowfram}{Dynamic frame IDL '#2' already defined}{% -You can't assign this label, as it is already defined -for dynamic frame \number\@colN}}{}% -\fi -}} + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \ifnum\@colN=#1\relax + \else + \ifthenelse + {% + \equal{#2}% + {\csname @df@id@\romannumeral\@colN\endcsname}% + }% + {% + \PackageError{flowfram}% + {Dynamic frame IDL '#2' already defined}% + {% + You can't assign this label, as it is already defined + for dynamic frame \number\@colN + }% + }% + {}% + \fi + }% +} % \end{macrocode} %\end{macro} % @@ -1962,7 +2920,8 @@ for dynamic frame \number\@colN}}{}% % \gls{idn}. % \begin{macrocode} \newcommand*{\getdynamiclabel}[1]{% -\csname @df@id@\romannumeral#1\endcsname} + \csname @df@id@\romannumeral#1\endcsname +} % \end{macrocode} %\end{macro} % @@ -1974,7 +2933,8 @@ for dynamic frame \number\@colN}}{}% % sequence. % \begin{macrocode} \newcommand*{\getdynamicid}[2]{% -\@dynamicframeid{#2}\edef#1{\number\ff@id}} + \@dynamicframeid{#2}\edef#1{\number\ff@id}% +} % \end{macrocode} %\end{macro} % @@ -1982,16 +2942,30 @@ for dynamic frame \number\@colN}}{}% % Determine the \gls{idn} of the \gls{dynamic} from its label. % The \gls{idn} is stored in "\ff@id". % \begin{macrocode} -\newcommand*{\@dynamicframeid}[1]{\@colN=0\relax -\ff@id=0\relax -\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\ifthenelse{% -\equal{#1}{\csname @df@id@\romannumeral\@colN\endcsname}}{% -\ff@id=\@colN\relax -% break out of loop -\@colN=\c@maxdynamic}{}}% -\ifnum\ff@id=0\PackageError{flowfram}{Can't find dynamic frame -id '#1'}{}\fi} +\newcommand*{\@dynamicframeid}[1]{% + \@colN=0\relax + \ff@id=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \ifthenelse + {% + \equal{#1}{\csname @df@id@\romannumeral\@colN\endcsname}% + }% + {% + \ff@id=\@colN\relax +% \end{macrocode} +% Break out of loop +% \begin{macrocode} + \@colN=\c@maxdynamic + }% + {}% + }% + \ifnum\ff@id=0\relax + \PackageError{flowfram}% + {Can't find dynamic frame id '#1'}{}% + \fi +} % \end{macrocode} %\end{macro} % @@ -2002,9 +2976,14 @@ id '#1'}{}\fi} % 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}}} + \@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} % @@ -2013,40 +2992,50 @@ be one of: flow, static or dynamic}}} %\begin{macro}{\dynamicframex} % \begin{macrocode} \newcommand*{\dynamicframex}[1]{% -\csname @df@\romannumeral#1@posx\endcsname} + \csname @df@\romannumeral#1@posx\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\dynamicframey} % \begin{macrocode} \newcommand*{\dynamicframey}[1]{% -\csname @df@\romannumeral#1@posy\endcsname} + \csname @df@\romannumeral#1@posy\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\dynamicframeevenx} % \begin{macrocode} \newcommand*{\dynamicframeevenx}[1]{% -\csname @df@\romannumeral#1@evenx\endcsname} + \csname @df@\romannumeral#1@evenx\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\dynamicframeeveny} % \begin{macrocode} \newcommand*{\dynamicframeeveny}[1]{% -\csname @df@\romannumeral#1@eveny\endcsname} + \csname @df@\romannumeral#1@eveny\endcsname +} % \end{macrocode} %\end{macro} %\begin{macro}{\setalldynamicframes} % Change the settings for all the \glspl{dynamic}: % \begin{macrocode} \newcommand*{\setalldynamicframes}[1]{% -\@colN=0\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\@@setdynamicframe{\@colN}{#1}}} + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \@@setdynamicframe{\@colN}{#1}% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\setdynamicframe} % Change the settings for specified \glspl{dynamic}: % \begin{macrocode} \newcommand*{\setdynamicframe}{% -\@ifstar\@ssetdynamicframe\@setdynamicframe} + \@ifstar\@ssetdynamicframe\@setdynamicframe +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ssetdynamicframe} @@ -2054,9 +3043,11 @@ be one of: flow, static or dynamic}}} % of labels. % \begin{macrocode} \newcommand*{\@ssetdynamicframe}[2]{% -\@for\@ff@id:=#1\do{% -\@dynamicframeid{\@ff@id}% -\@@setdynamicframe{\ff@id}{#2}}} + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@@setdynamicframe{\ff@id}{#2}% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@setdynamicframe} @@ -2065,28 +3056,43 @@ be one of: flow, static or dynamic}}} % If necessary, modify number ranges to ensure they are valid. % \begin{macrocode} \newcommand*{\@setdynamicframe}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\setalldynamicframes{#2}}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxdynamic\TE@or\@colN=\c@maxdynamic}{% -\@@setdynamicframe{\@colN}{#2}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxdynamic\relax - \def\@ff@numend{\c@maxdynamic}% -\fi -\@colN=\@ff@numstart\relax -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@setdynamicframe{\@colN}{#2}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \setalldynamicframes{#2}% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}% + {\@colN=1}% + {\@colN=2}% + \whiledo{\@colN<\c@maxdynamic\TE@or\@colN=\c@maxdynamic}% + {% + \@@setdynamicframe{\@colN}{#2}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do{% + \def\@ff@numstart{0}% + \def\@ff@numend{10000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxdynamic\relax + \def\@ff@numend{\c@maxdynamic}% + \fi + \@colN=\@ff@numstart\relax + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@setdynamicframe{\@colN}{#2}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@@setdynamicframe} @@ -2095,101 +3101,222 @@ be one of: flow, static or dynamic}}} %\changes{1.11}{2008/06/27}{fixed bug in clear key} % \begin{macrocode} \newcommand*{\@@setdynamicframe}[2]{% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname -\def\ff@frame{}\edef\ff@width{\the\@ff@tmp@x}% -\edef\ff@height{\the\@ff@tmp@y}\def\ff@style{}\def\ff@frametype{}% -\def\ff@x{}\def\ff@y{}\def\ff@col{}\def\ff@txtcol{}\def\ff@backcol{}% -\def\ff@clear{}\def\ff@margin{}\def\ff@offset{}\def\ff@pages{}% -\def\ff@label{}\def\ff@evenx{}\def\ff@eveny{}% -\def\ff@oddx{}\def\ff@oddy{}\def\ff@angle{}\def\ff@shape{0}% -\setkeys{flowframe}{#2}% -\ifthenelse{\equal{\ff@frame}{}}{}{% -\setboolean{dynamicframe\romannumeral#1}{\ff@frame}}% -\ifthenelse{\equal{\ff@x}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@posx\endcsname{\ff@x}% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@evenx\endcsname{\ff@x}}% -\ifthenelse{\equal{\ff@y}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@posy\endcsname{\ff@y}% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@eveny\endcsname{\ff@y}}% -\ifthenelse{\equal{\ff@evenx}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@evenx\endcsname{\ff@evenx}}% -\ifthenelse{\equal{\ff@eveny}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@eveny\endcsname{\ff@eveny}}% -\ifthenelse{\equal{\ff@oddx}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@posx\endcsname{\ff@oddx}}% -\ifthenelse{\equal{\ff@oddy}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@posy\endcsname{\ff@oddy}}% -\expandafter\xdef\csname @df@dim@\romannumeral#1\endcsname{% -[c][\ff@height][\ff@valign]{\ff@width}}% -\ifthenelse{\equal{\ff@label}{}}{}{% -\@s@tdynamicframeid{#1}[\ff@label]}% -\ifthenelse{\equal{\ff@frametype}{}}{}{% -\expandafter -\xdef\csname @df@frametype@\romannumeral#1\endcsname{% -\ff@frametype}}% -\ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\@setframecol\ff@col\end{#1}{col}{df}}% -\ifthenelse{\equal{\ff@txtcol}{}}{}{% -\expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{df}}% -\ifthenelse{\equal{\ff@backcol}{}}{}{% -\expandafter\@setframecol\ff@backcol\end{#1}{backcol}{df}}% -\ifthenelse{\equal{\ff@offset}{}}{}{% -\expandafter -\xdef\csname @df@offset@\romannumeral#1\endcsname{\ff@offset}}% -\ifthenelse{\equal{\ff@angle}{}}{}{% -\expandafter -\xdef\csname @df@angle@\romannumeral#1\endcsname{\ff@angle}}% -\if0\ff@shape -\else -\expandafter\global\expandafter -\let\csname @df@shape@\romannumeral#1\endcsname\ff@shape -\fi -\ifthenelse{\equal{\ff@pages}{}}{}{% -\expandafter\xdef\csname @df@pages@\romannumeral#1\endcsname{% -\ff@pages}}% -\ifthenelse{\equal{\ff@style}{}}{}{% -\@ifundefined{\ff@style}{\PackageError{flowfram}% -{Unknown style '\ff@style'}{The command \expandafter -\string\csname\ff@style\endcsname\space has not been defined}}{% -\expandafter -\xdef\csname @df@style@\romannumeral#1\endcsname{\ff@style}}}% -\ifthenelse{\equal{\ff@clear}{}}{}{% -\setboolean{@df@clear@\romannumeral#1}{\ff@clear}% -}% -\ifthenelse{\equal{\ff@margin}{}}{}{% -\PackageError{flowfram}{Key 'margin' not available for dynamic -frames}{dynamic frames don't have marginal notes}}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname + \def\ff@frame{}\edef\ff@width{\the\@ff@tmp@x}% + \edef\ff@height{\the\@ff@tmp@y}\def\ff@style{}\def\ff@frametype{}% + \def\ff@x{}\def\ff@y{}\def\ff@col{}\def\ff@txtcol{}\def\ff@backcol{}% + \def\ff@clear{}\def\ff@margin{}\def\ff@offset{}\def\ff@pages{}% + \def\ff@label{}\def\ff@evenx{}\def\ff@eveny{}% + \def\ff@oddx{}\def\ff@oddy{}\def\ff@angle{}% + \let\ff@shape\undefined + \let\ff@xpages\undefined + \setkeys{flowframe}{#2}% + \ifdefempty{\ff@frame}% + {}% + {% + \setboolean{dynamicframe\romannumeral#1}{\ff@frame}% + }% + \ifdefempty{\ff@x}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@posx\endcsname{\ff@x}% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@evenx\endcsname{\ff@x}% + }% + \ifdefempty{\ff@y}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@posy\endcsname{\ff@y}% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@eveny\endcsname{\ff@y}% + }% + \ifdefempty{\ff@evenx}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@evenx\endcsname{\ff@evenx}% + }% + \ifdefempty{\ff@eveny}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@eveny\endcsname{\ff@eveny}% + }% + \ifdefempty{\ff@oddx}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@posx\endcsname{\ff@oddx}% + }% + \ifdefempty{\ff@oddy}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@posy\endcsname{\ff@oddy}% + }% + \expandafter\xdef\csname @df@dim@\romannumeral#1\endcsname{% + [c][\ff@height][\ff@valign]{\ff@width}% + }% + \ifdefempty{\ff@label}% + {}% + {% + \@s@tdynamicframeid{#1}[\ff@label]% + }% + \ifdefempty{\ff@frametype}% + {}% + {% + \expandafter + \xdef\csname @df@frametype@\romannumeral#1\endcsname{% + \ff@frametype + }% + }% + \ifdefempty{\ff@col}% + {}% + {% + \expandafter\@setframecol\ff@col\end{#1}{col}{df}% + }% + \ifdefempty{\ff@txtcol}% + {}% + {% + \expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{df}% + }% + \ifdefempty{\ff@backcol}% + {}% + {% + \expandafter\@setframecol\ff@backcol\end{#1}{backcol}{df}% + }% + \ifdefempty{\ff@offset}% + {}% + {% + \expandafter + \xdef\csname @df@offset@\romannumeral#1\endcsname{\ff@offset}% + }% + \ifdefempty{\ff@angle}% + {}% + {% + \expandafter + \xdef\csname @df@angle@\romannumeral#1\endcsname{\ff@angle}% + }% + \ifundef{\ff@shape}{}% + {% + \expandafter\global\expandafter + \let\csname @df@shape@\romannumeral#1\endcsname\ff@shape + }% + \ifdefempty{\ff@pages}% + {}% + {% + \dynamicsetpagelist{#1}{\ff@pages}% + }% + \ifundef{\ff@xpages}{}% + {% + \dynamicsetexclusion{#1}{\ff@xpages}% + }% + \ifdefempty{\ff@style}% + {}% + {% + \ifcsundef{\ff@style}% + {% + \PackageError{flowfram}% + {Unknown style '\ff@style'}% + {% + The command \expandafter\@gobble\string\\\ff@style + \space has not been defined% + }% + }% + {% + \expandafter + \xdef\csname @df@style@\romannumeral#1\endcsname{\ff@style}% + }% + }% + \ifdefempty{\ff@clear}% + {}% + {% + \setboolean{@df@clear@\romannumeral#1}{\ff@clear}% + }% + \ifdefempty{\ff@margin}% + {}% + {% + \PackageError{flowfram}% + {% + Key 'margin' not available for dynamic frames% + }% + {dynamic frames don't have marginal notes}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dynamicsetpagelist} +% Sets the page list for the \gls{dynamic} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\dynamicsetpagelist}[2]{% + \expandafter + \xdef\csname @df@pages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting page range for dynamic frame + \number#1\space\space to "#2"}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\dynamicsetexclusion} +% Sets the exclusion list for the \gls{dynamic} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\dynamicsetexclusion}[2]{% + \expandafter + \xdef\csname @df@xpages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting exclusion for dynamic frame + \number#1\space\space to "#2"}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\dynamicaddexclusion} +% Adds to the exclusion list for the \gls{dynamic} given by "#1" (the +% \gls{idn}). +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newcommand*{\dynamicaddexclusion}[2]{% + \ifcsempty{@df@xpages@\romannumeral#1} + {% + \expandafter + \xdef\csname @df@xpages@\romannumeral#1\endcsname{#2}% + }% + {% + \expandafter + \xdef\csname @df@xpages@\romannumeral#1\endcsname{% + \csname @df@xpages@\romannumeral#1\endcsname,#2}% + }% + \flf@message{Setting exclusion for dynamic frame + \number#1\space\space to + "\csname @df@xpages@\romannumeral#1\endcsname"}% } % \end{macrocode} %\end{macro} +% %\begin{macro}{\@@dynamicframeswapcoords} -% Swap odd and even offsets for a given \gls{static}. Do the main stuff for -% a given \gls{static} \gls{idn}. +% Swap odd and even offsets for a given \gls{dynamic}. Do the main stuff for +% a given \gls{dynamic} \gls{idn}. % \begin{macrocode} \newcommand*{\@@dynamicframeswapcoords}[1]{% -\setlength{\@ff@tmp@x}% -{\csname @df@\romannumeral#1@evenx\endcsname}% -\expandafter\setlength -\csname @df@\romannumeral#1@evenx\endcsname -{\csname @df@\romannumeral#1@posx\endcsname}% -\expandafter\setlength -\csname @df@\romannumeral#1@posx\endcsname{\@ff@tmp@x}% -\setlength{\@ff@tmp@y}% -{\csname @df@\romannumeral#1@eveny\endcsname}% -\expandafter\setlength -\csname @df@\romannumeral#1@eveny\endcsname -{\csname @df@\romannumeral#1@posy\endcsname}% -\expandafter\setlength\csname @df@\romannumeral#1@posy\endcsname -{\@ff@tmp@y}% + \setlength{\@ff@tmp@x}% + {\csname @df@\romannumeral#1@evenx\endcsname}% + \expandafter\setlength + \csname @df@\romannumeral#1@evenx\endcsname + {\csname @df@\romannumeral#1@posx\endcsname}% + \expandafter\setlength + \csname @df@\romannumeral#1@posx\endcsname{\@ff@tmp@x}% + \setlength{\@ff@tmp@y}% + {\csname @df@\romannumeral#1@eveny\endcsname}% + \expandafter\setlength + \csname @df@\romannumeral#1@eveny\endcsname + {\csname @df@\romannumeral#1@posy\endcsname}% + \expandafter\setlength\csname @df@\romannumeral#1@posy\endcsname + {\@ff@tmp@y}% } % \end{macrocode} %\end{macro} @@ -2204,40 +3331,58 @@ frames}{dynamic frames don't have marginal notes}}% % Starred form % \begin{macrocode} \newcommand*{\@sdynamicframeswapcoords}[1]{% -\@for\@ff@id:=#1\do{% -\@dynamicframeid{\@ff@id}% -\@@dynamicframeswapcoords{\ff@id}}} + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@@dynamicframeswapcoords{\ff@id}}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@dynamicframeswapcoords} % Unstarred form: % \begin{macrocode} \newcommand*{\@dynamicframeswapcoords}[1]{% -\ifthenelse{\equal{#1}{all}}{% -\ff@id=0\relax -\whiledo{\ff@id<\c@maxflow}{\advance\ff@id by 1\relax -\@@dynamicframeswapcoords{\ff@id}}% -}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}{% -\@@dynamicframeswapcoords{\@colN}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxflow - \def\@ff@numend{\c@maxflow}% -\fi -\@colN=\@ff@numstart -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@dynamicframeswapcoords{\@colN}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \ff@id=0\relax + \whiledo{\ff@id<\c@maxflow}% + {% + \advance\ff@id by 1\relax + \@@dynamicframeswapcoords{\ff@id}% + }% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}% + {\@colN=1}% + {\@colN=2}% + \whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}% + {% + \@@dynamicframeswapcoords{\@colN}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do{% + \def\@ff@numstart{0}% + \def\@ff@numend{10000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxflow + \def\@ff@numend{\c@maxflow}% + \fi + \@colN=\@ff@numstart + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@dynamicframeswapcoords{\@colN}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} % \end{macrocode} %\end{macro} % Set the contents of a \gls{dynamic}. @@ -2250,9 +3395,9 @@ frames}{dynamic frames don't have marginal notes}}% % (where \meta{rn} is the \meta{idn} as a roman numeral.) % \begin{macrocode} \newenvironment{dynamiccontents}[1]{% -\def\@flf@{dynamiccontents}% -\xdynamiccontents{#1}}{% -\endxdynamiccontents + \def\@flf@{dynamiccontents}% + \xdynamiccontents{#1}}{% + \endxdynamiccontents } % \end{macrocode} %\end{environment} @@ -2263,34 +3408,35 @@ frames}{dynamic frames don't have marginal notes}}% % Start of the environment (unstarred): % \begin{macrocode} \def\xdynamiccontents#1{% -\def\@flf@idn{#1}% -\@dynamictok{}\@flf@get@body + \def\@flf@idn{#1}% + \@dynamictok{}\@flf@get@body } % \end{macrocode} % Get the body of the environment: % \begin{macrocode} \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} + \@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 + \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}: @@ -2304,65 +3450,70 @@ frames}{dynamic frames don't have marginal notes}}% % store in the sixth argument (which should be a control sequence). % \begin{macrocode} \def\flf@getcontargs{% -\@ifnextchar[{\@flf@getcontargs}{\@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}% + \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}% -\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 - \ifx\@tempa\@flf@ - \let\flf@next=\@flf@endxdynamiccontents - \else + \def\@tempa{#1}% + \global\let\flf@next=\relax + \ifdfcontinued \@dynamictok\expandafter - {\the\@dynamictok\end{#1}}% - \let\flf@next=\@flf@get@body + {\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 + \ifx\@tempa\@flf@ + \let\flf@next=\@flf@endxdynamiccontents + \else + \@dynamictok\expandafter + {\the\@dynamictok\end{#1}}% + \let\flf@next=\@flf@get@body + \fi \fi -\fi -\flf@next + \flf@next } % \end{macrocode} % End of the environment: % \begin{macrocode} \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}% -\else - \expandafter - \xdef\csname @dynamicframe@\romannumeral\@flf@idn\endcsname{% - \the\@dynamictok}% - \expandafter -\fi -\expandafter\end\expandafter{\@flf@}% + \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% + }% + \else + \expandafter + \xdef\csname @dynamicframe@\romannumeral\@flf@idn\endcsname{% + \the\@dynamictok}% + \expandafter + \fi + \expandafter\end\expandafter{\@flf@}% } % \end{macrocode} %\begin{environment}{dynamiccontents*} % Starred version % \begin{macrocode} \newenvironment{dynamiccontents*}[1]{% -\def\@flf@{dynamiccontents*}% -\@dynamicframeid{#1}% -\xdynamiccontents{\ff@id}}{% -\enddynamiccontents + \def\@flf@{dynamiccontents*}% + \@dynamicframeid{#1}% + \xdynamiccontents{\ff@id}}{% + \enddynamiccontents } % \end{macrocode} %\end{environment} @@ -2370,28 +3521,34 @@ frames}{dynamic frames don't have marginal notes}}% %\begin{macro}{\setdynamiccontents} % \begin{macrocode} \newcommand{\setdynamiccontents}{% -\@ifstar\@ssetdynamiccontents\@setdynamiccontents} + \@ifstar\@ssetdynamiccontents\@setdynamiccontents +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ssetdynamiccontents} % Starred version: identify \gls{dynamic} by its \gls{idl}: % \begin{macrocode} \newcommand{\@ssetdynamiccontents}[2]{% -\@dynamicframeid{#1}\@setdynamiccontents{\ff@id}{#2}} + \@dynamicframeid{#1}\@setdynamiccontents{\ff@id}{#2}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@setdynamiccontents} % Unstarred version: identify \gls{dynamic} by its \gls{idn}: % \begin{macrocode} \newcommand{\@setdynamiccontents}[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}% -\else -\expandafter -\gdef\csname @dynamicframe@\romannumeral#1\endcsname{#2}% -\fi} + \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% + }% + \else + \expandafter + \gdef\csname @dynamicframe@\romannumeral#1\endcsname{#2}% + \fi +} % \end{macrocode} %\end{macro} %\begin{macro}{\appenddynamiccontents} @@ -2399,7 +3556,8 @@ only \number\c@maxdynamic\space dynamic frames currently defined}% % see if starred or unstarred version is being used. % \begin{macrocode} \newcommand{\appenddynamiccontents}{% -\@ifstar\@sappenddynamic\@appenddynamic} + \@ifstar\@sappenddynamic\@appenddynamic +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sappenddynamic} @@ -2407,31 +3565,38 @@ only \number\c@maxdynamic\space dynamic frames currently defined}% % the unstarred version. % \begin{macrocode} \newcommand{\@sappenddynamic}[2]{% -\@dynamicframeid{#1}\@appenddynamic{\ff@id}{#2}} + \@dynamicframeid{#1}\@appenddynamic{\ff@id}{#2}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@appenddynamic} % Unstarred version. % \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}% -\else - \expandafter\@ff@addtolist - \csname @dynamicframe@\romannumeral#1\endcsname\entry{#2}% -\fi} + \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% + }% + \else + \expandafter\@ff@addtolist + \csname @dynamicframe@\romannumeral#1\endcsname\entry{#2}% + \fi +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@addtolist} % Append "#2" onto the end of "#1". % \begin{macrocode} \newtoks\flf@ta \newtoks\flf@tb -\long\def\@ff@addtolist#1\entry#2{\flf@ta={{#2}}% -\flf@tb=\expandafter{#1}% -\xdef#1{\the\flf@tb\the\flf@ta}} +\long\def\@ff@addtolist#1\entry#2{% + \flf@ta={{#2}}% + \flf@tb=\expandafter{#1}% + \xdef#1{\the\flf@tb\the\flf@ta}% +} % \end{macrocode} %\end{macro} % @@ -2444,11 +3609,17 @@ only \number\c@maxdynamic\space dynamic frames currently defined}% % 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)}} +\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 (or their starred versions)% + }% +} % \end{macrocode} %\end{macro} % \cs{@scontinueonframe} and \cs{@continueonframe} are set @@ -2458,23 +3629,27 @@ be used inside `staticcontents' or `dynamiccontents' environments % Static starred version uses \gls{idl} % \begin{macrocode} \newcommand*{\@staticscontinueonframe}[2][]{% -\ffcontinuedtextlayout{#1}% -\end{staticcontents*}% -\begin{staticcontents*}{#2}\par\noindent\ignorespaces} + \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} + \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}} + \parfillskip=0pt\par\hfill + \ffcontinuedtextfont{#1}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\ffcontinuedtextfont} @@ -2495,18 +3670,20 @@ be used inside `staticcontents' or `dynamiccontents' environments % First the odd pages. % \begin{macrocode} \newcommand*{\computeleftedgeodd}[1]{% -\setlength{#1}{-1in}% -\addtolength{#1}{-\hoffset}% -\addtolength{#1}{-\oddsidemargin}} + \setlength{#1}{-1in}% + \addtolength{#1}{-\hoffset}% + \addtolength{#1}{-\oddsidemargin}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\computeleftedgeeven} % Now for the even pages % \begin{macrocode} \newcommand*{\computeleftedgeeven}[1]{% -\setlength{#1}{-1in}% -\addtolength{#1}{-\hoffset}% -\addtolength{#1}{-\evensidemargin}} + \setlength{#1}{-1in}% + \addtolength{#1}{-\hoffset}% + \addtolength{#1}{-\evensidemargin}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\computetopedge} @@ -2514,12 +3691,13 @@ be used inside `staticcontents' or `dynamiccontents' environments % the \gls{typeblock}. % \begin{macrocode} \newcommand*{\computetopedge}[1]{% -\setlength{#1}{\textheight}% -\addtolength{#1}{\headheight}% -\addtolength{#1}{\headsep}% -\addtolength{#1}{1in}% -\addtolength{#1}{\voffset}% -\addtolength{#1}{\topmargin}} + \setlength{#1}{\textheight}% + \addtolength{#1}{\headheight}% + \addtolength{#1}{\headsep}% + \addtolength{#1}{1in}% + \addtolength{#1}{\voffset}% + \addtolength{#1}{\topmargin}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\computebottomedge} @@ -2527,8 +3705,9 @@ be used inside `staticcontents' or `dynamiccontents' environments % of the \gls{typeblock}. % \begin{macrocode} \newcommand*{\computebottomedge}[1]{% -\computetopedge{#1}% -\addtolength{#1}{-\paperheight}} + \computetopedge{#1}% + \addtolength{#1}{-\paperheight}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\computerightedgeodd} @@ -2537,16 +3716,18 @@ be used inside `staticcontents' or `dynamiccontents' environments % and even pages. First the odd pages. % \begin{macrocode} \newcommand*{\computerightedgeodd}[1]{% -\computeleftedgeodd{#1}% -\addtolength{#1}{\paperwidth}} + \computeleftedgeodd{#1}% + \addtolength{#1}{\paperwidth}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\computerightedgeeven} % Now for the even pages. % \begin{macrocode} \newcommand*{\computerightedgeeven}[1]{% -\computeleftedgeeven{#1}% -\addtolength{#1}{\paperwidth}} + \computeleftedgeeven{#1}% + \addtolength{#1}{\paperwidth}% +} % \end{macrocode} %\end{macro} % Compute the minimum area surrounding the listed \glspl{flow}. @@ -2565,84 +3746,91 @@ be used inside `staticcontents' or `dynamiccontents' environments % version identifies frame by \gls{idn}. % \begin{macrocode} \newcommand*{\computeflowframearea}{% -\@ifstar\@scomputeffarea\@computeffarea} + \@ifstar\@scomputeffarea\@computeffarea +} % \end{macrocode} %\end{macro} %\begin{macro}{\@scomputeffarea} % Starred version. % \begin{macrocode} \newcommand*{\@scomputeffarea}[1]{% -\setlength{\ffareax}{\paperwidth}% -\setlength{\ffareay}{\paperheight}% -\setlength{\@ff@tmp@x}{0pt}% -\setlength{\@ff@tmp@y}{0pt}% -\@for\@ff@id:=#1\do{\@flowframeid{\@ff@id}% -%\ff@id is the IDN -\ifnum\ffareax>\flowframex{\ff@id}% -\setlength{\ffareax}{\flowframex{\ff@id}}% -\fi -\ifnum\ffareay>\flowframey{\ff@id}% -\setlength{\ffareay}{\flowframey{\ff@id}}% -\fi -\setlength{\@ff@offset}{\flowframex{\ff@id}}% -\addtolength{@ff@offset}{\flowframewidth{\ff@id}}% -\ifnum\@ff@tmp@x<\@ff@offset -\setlength{\@ff@tmp@x}{\@ff@offset}% -\fi -\setlength{\@ff@offset}{\flowframey{\ff@id}}% -\addtolength{@ff@offset}{\flowframeheight{\ff@id}}% -\ifnum\@ff@tmp@y<\@ff@offset -\setlength{\@ff@tmp@y}{\@ff@offset}% -\fi -}% -\setlength{\ffareawidth}{\@ff@tmp@x}% -\addtolength{\ffareawidth}{-\ffareax}% -\setlength{\ffareaheight}{\@ff@tmp@y}% -\addtolength{\ffareaheight}{-\ffareay}} + \setlength{\ffareax}{\paperwidth}% + \setlength{\ffareay}{\paperheight}% + \setlength{\@ff@tmp@x}{0pt}% + \setlength{\@ff@tmp@y}{0pt}% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% +% \end{macrocode} +%\cs{ff@id} is the IDN +% \begin{macrocode} + \ifnum\ffareax>\flowframex{\ff@id}% + \setlength{\ffareax}{\flowframex{\ff@id}}% + \fi + \ifnum\ffareay>\flowframey{\ff@id}% + \setlength{\ffareay}{\flowframey{\ff@id}}% + \fi + \setlength{\@ff@offset}{\flowframex{\ff@id}}% + \addtolength{@ff@offset}{\flowframewidth{\ff@id}}% + \ifnum\@ff@tmp@x<\@ff@offset + \setlength{\@ff@tmp@x}{\@ff@offset}% + \fi + \setlength{\@ff@offset}{\flowframey{\ff@id}}% + \addtolength{@ff@offset}{\flowframeheight{\ff@id}}% + \ifnum\@ff@tmp@y<\@ff@offset + \setlength{\@ff@tmp@y}{\@ff@offset}% + \fi + }% + \setlength{\ffareawidth}{\@ff@tmp@x}% + \addtolength{\ffareawidth}{-\ffareax}% + \setlength{\ffareaheight}{\@ff@tmp@y}% + \addtolength{\ffareaheight}{-\ffareay}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@computeffarea} % Unstarred version. % \begin{macrocode} \newcommand*{\@computeffarea}[1]{% -\setlength{\ffareax}{\paperwidth}% -\setlength{\ffareay}{\paperheight}% -\setlength{\@ff@tmp@x}{0pt}% -\setlength{\@ff@tmp@y}{0pt}% -\@for\@ff@id:=#1\do{% -\ff@id=\@ff@id\relax -\setlength{\@ff@offset}{\flowframex{\ff@id}}% -\ifdim\ffareax>\@ff@offset -\setlength{\ffareax}{\@ff@offset}% -\fi -\setlength{\@ff@offset}{\flowframey{\ff@id}}% -\ifdim\ffareay>\@ff@offset -\setlength{\ffareay}{\@ff@offset}% -\fi -\setlength{\@ff@offset}{\flowframex{\ff@id}}% -\addtolength{\@ff@offset}{\flowframewidth{\ff@id}}% -\ifdim\@ff@tmp@x<\@ff@offset -\setlength{\@ff@tmp@x}{\@ff@offset}% -\fi -\setlength{\@ff@offset}{\flowframey{\ff@id}}% -\addtolength{\@ff@offset}{\flowframeheight{\ff@id}}% -\ifdim\@ff@tmp@y<\@ff@offset -\setlength{\@ff@tmp@y}{\@ff@offset}% -\fi -}% -\setlength{\ffareawidth}{\@ff@tmp@x}% -\addtolength{\ffareawidth}{-\ffareax}% -\setlength{\ffareaheight}{\@ff@tmp@y}% -\addtolength{\ffareaheight}{-\ffareay}} + \setlength{\ffareax}{\paperwidth}% + \setlength{\ffareay}{\paperheight}% + \setlength{\@ff@tmp@x}{0pt}% + \setlength{\@ff@tmp@y}{0pt}% + \@for\@ff@id:=#1\do{% + \ff@id=\@ff@id\relax + \setlength{\@ff@offset}{\flowframex{\ff@id}}% + \ifdim\ffareax>\@ff@offset + \setlength{\ffareax}{\@ff@offset}% + \fi + \setlength{\@ff@offset}{\flowframey{\ff@id}}% + \ifdim\ffareay>\@ff@offset + \setlength{\ffareay}{\@ff@offset}% + \fi + \setlength{\@ff@offset}{\flowframex{\ff@id}}% + \addtolength{\@ff@offset}{\flowframewidth{\ff@id}}% + \ifdim\@ff@tmp@x<\@ff@offset + \setlength{\@ff@tmp@x}{\@ff@offset}% + \fi + \setlength{\@ff@offset}{\flowframey{\ff@id}}% + \addtolength{\@ff@offset}{\flowframeheight{\ff@id}}% + \ifdim\@ff@tmp@y<\@ff@offset + \setlength{\@ff@tmp@y}{\@ff@offset}% + \fi + }% + \setlength{\ffareawidth}{\@ff@tmp@x}% + \addtolength{\ffareawidth}{-\ffareax}% + \setlength{\ffareaheight}{\@ff@tmp@y}% + \addtolength{\ffareaheight}{-\ffareay}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@swaplen} % Swap the values of two lengths % \begin{macrocode} \newcommand*{\@ff@swaplen}[2]{% -\setlength{\@ff@tmp@x}{#1}% -\setlength{#1}{#2}% -\setlength{#2}{\@ff@tmp@x}} + \setlength{\@ff@tmp@x}{#1}% + \setlength{#1}{#2}% + \setlength{#2}{\@ff@tmp@x}% +} % \end{macrocode} %\end{macro} % @@ -2654,59 +3842,83 @@ be used inside `staticcontents' or `dynamiccontents' environments % "\ffareax", "\ffareay", "\ffareawidth" and "\ffareaheight". % \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'}% -\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\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{\ffareaevenx}{\flowframeevenx{#2}}% - \setlength{\ffareaeveny}{\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}{\staticframex{#2}}% - \setlength{\ffareay}{\staticframey{#2}}% - \setlength{\ffareaevenx}{\staticframeevenx{#2}}% - \setlength{\ffareaeveny}{\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}% + \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 +% \end{macrocode} +% Flow frame +% \begin{macrocode} + \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{\ffareaevenx}{\flowframeevenx{#2}}% + \setlength{\ffareaeveny}{\flowframeeveny{#2}}% + \setlength{\ffareawidth}{\flowframewidth{#2}}% + \setlength{\ffareaheight}{\flowframeheight{#2}}% + \fi + \or +% \end{macrocode} +% Static frame +% \begin{macrocode} + \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}}% + \setlength{\ffareaevenx}{\staticframeevenx{#2}}% + \setlength{\ffareaeveny}{\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 +% \end{macrocode} +% Dynamic frame +% \begin{macrocode} + \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}}% + \setlength{\ffareaevenx}{\dynamicframeevenx{#2}}% + \setlength{\ffareaeveny}{\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 - \setlength{\ffareax}{\dynamicframex{#2}}% - \setlength{\ffareay}{\dynamicframey{#2}}% - \setlength{\ffareaevenx}{\dynamicframeevenx{#2}}% - \setlength{\ffareaeveny}{\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)}% -\fi + \PackageError{flowfram}% + {Unknown frame ID type '#1'}% + {% + Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)% + }% + \fi } % \end{macrocode} %\end{macro} @@ -2720,53 +3932,80 @@ be used inside `staticcontents' or `dynamiccontents' environments % "\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}% + \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 +% \end{macrocode} +% Flow frame +% \begin{macrocode} + \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 +% \end{macrocode} +% Static frame +% \begin{macrocode} + \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 +% \end{macrocode} +% Dynamic frame +% \begin{macrocode} + \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 - \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}% + \PackageError{flowfram}% + {Unknown frame ID type '#1'}% + {% + Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)% + }% \fi -\else - \PackageError{flowfram}{Unknown frame ID type '#1'}{% - Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} -\fi } % \end{macrocode} %\end{macro} @@ -2776,14 +4015,16 @@ be used inside `staticcontents' or `dynamiccontents' environments % frames: % \begin{macrocode} \newcommand*{\getstaticbounds}{% -\@ifstar\@sgetstaticbounds\@getstaticbounds} + \@ifstar\@sgetstaticbounds\@getstaticbounds +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sgetstaticbounds} % Starred version (specify by \gls{idl}): % \begin{macrocode} \newcommand*{\@sgetstaticbounds}[1]{% -\@staticframeid{#1}\@getstaticbounds{\ff@id}} + \@staticframeid{#1}\@getstaticbounds{\ff@id}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@getstaticbounds} @@ -2800,14 +4041,16 @@ be used inside `staticcontents' or `dynamiccontents' environments % Even pages % \begin{macrocode} \newcommand*{\getstaticevenbounds}{% -\@ifstar\@sgetstaticevenbounds\@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}} + \@staticframeid{#1}\@getstaticevenbounds{\ff@id}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@getstaticevenbounds} @@ -2822,14 +4065,16 @@ be used inside `staticcontents' or `dynamiccontents' environments % Next flow frames: % \begin{macrocode} \newcommand*{\getflowbounds}{% -\@ifstar\@sgetflowbounds\@getflowbounds} + \@ifstar\@sgetflowbounds\@getflowbounds +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sgetflowbounds} % Starred version (specify by \gls{idl}): % \begin{macrocode} \newcommand*{\@sgetflowbounds}[1]{% -\@flowframeid{#1}\@getflowbounds{\ff@id}} + \@flowframeid{#1}\@getflowbounds{\ff@id}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@getflowbounds} @@ -2845,7 +4090,8 @@ be used inside `staticcontents' or `dynamiccontents' environments % Even pages: % \begin{macrocode} \newcommand*{\getflowevenbounds}{% -\@ifstar\@sgetflowevenbounds\@getflowevenbounds} + \@ifstar\@sgetflowevenbounds\@getflowevenbounds +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sgetflowevenbounds} @@ -2853,7 +4099,8 @@ be used inside `staticcontents' or `dynamiccontents' environments % Starred version (specify by \gls{idl}): % \begin{macrocode} \newcommand*{\@sgetflowevenbounds}[1]{% -\@flowframeid{#1}\@getflowevenbounds{\ff@id}} + \@flowframeid{#1}\@getflowevenbounds{\ff@id}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@getflowevenbounds} @@ -2868,14 +4115,16 @@ be used inside `staticcontents' or `dynamiccontents' environments % Next dynamic frames: % \begin{macrocode} \newcommand*{\getdynamicbounds}{% -\@ifstar\@sgetdynamicbounds\@getdynamicbounds} + \@ifstar\@sgetdynamicbounds\@getdynamicbounds +} % \end{macrocode} %\end{macro} %\begin{macro}{\@sgetdynamicbounds} % Starred version (specify by \gls{idl}): % \begin{macrocode} \newcommand*{\@sgetdynamicbounds}[1]{% -\@dynamicframeid{#1}\@getdynamicbounds{\ff@id}} + \@dynamicframeid{#1}\@getdynamicbounds{\ff@id}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@getdynamicbounds} @@ -2889,14 +4138,16 @@ be used inside `staticcontents' or `dynamiccontents' environments % Even pages: % \begin{macrocode} \newcommand*{\getdynamicevenbounds}{% -\@ifstar\@sgetdynamicevenbounds\@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}} + \@dynamicframeid{#1}\@getdynamicevenbounds{\ff@id}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@getdynamicevenbounds} @@ -2943,26 +4194,29 @@ be used inside `staticcontents' or `dynamiccontents' environments % spans the page break. % \begin{macrocode} \newcommand*{\checkifframeabove}{% -\@ifstar\@scheckifframeabove\@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} + \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} + \ifodd\c@page + \@oddcheckifframeabove{#1}{#2}{#3}{#4}% + \else + \@evencheckifframeabove{#1}{#2}{#3}{#4}% + \fi +} +% \end{macrocode} %\end{macro} % %\begin{macro}{\oddcheckifframeabove} @@ -2976,46 +4230,73 @@ be used inside `staticcontents' or `dynamiccontents' environments % second frame if they overlap. % \begin{macrocode} \newcommand*{\oddcheckifframeabove}{% -\@ifstar\@soddcheckifframeabove\@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 + \@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 + \@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} @@ -3035,25 +4316,28 @@ flow}}{}% % spans the page break. % \begin{macrocode} \newcommand*{\checkifframebelow}{% -\@ifstar\@scheckifframebelow\@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} + \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} + \ifodd\c@page + \@oddcheckifframebelow{#1}{#2}{#3}{#4}% + \else + \@evencheckifframebelow{#1}{#2}{#3}{#4}% + \fi +} % \end{macrocode} %\end{macro} % @@ -3069,46 +4353,75 @@ flow}}{}% % second frame if they overlap. % \begin{macrocode} \newcommand*{\oddcheckifframebelow}{% -\@ifstar\@soddcheckifframebelow\@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 + \@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 + \@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} @@ -3128,25 +4441,28 @@ flow}}{}% % spans the page break. % \begin{macrocode} \newcommand*{\checkifframeleft}{% -\@ifstar\@scheckifframeleft\@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} + \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} + \ifodd\c@page + \@oddcheckifframeleft{#1}{#2}{#3}{#4}% + \else + \@evencheckifframeleft{#1}{#2}{#3}{#4}% + \fi +} % \end{macrocode} %\end{macro} % @@ -3162,46 +4478,75 @@ flow}}{}% % left of the second frame if they overlap. % \begin{macrocode} \newcommand*{\oddcheckifframeleft}{% -\@ifstar\@soddcheckifframeleft\@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 + \@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 + \@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} @@ -3221,25 +4566,28 @@ flow}}{}% % spans the page break. % \begin{macrocode} \newcommand*{\checkifframeright}{% -\@ifstar\@scheckifframeright\@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} + \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} + \ifodd\c@page + \@oddcheckifframeright{#1}{#2}{#3}{#4}% + \else + \@evencheckifframeright{#1}{#2}{#3}{#4}% + \fi +} % \end{macrocode} %\end{macro} % @@ -3255,46 +4603,75 @@ flow}}{}% % right of the second frame if they overlap. % \begin{macrocode} \newcommand*{\oddcheckifframeright}{% -\@ifstar\@soddcheckifframeright\@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 + \@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 + \@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} @@ -3311,46 +4688,75 @@ flow}}{}% % second frame if they overlap. % \begin{macrocode} \newcommand*{\evencheckifframeabove}{% -\@ifstar\@sevencheckifframeabove\@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 + \@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 + \@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} @@ -3366,46 +4772,74 @@ flow}}{}% % second frame if they overlap. % \begin{macrocode} \newcommand*{\evencheckifframebelow}{% -\@ifstar\@sevencheckifframebelow\@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 + \@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 + \@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} @@ -3421,46 +4855,75 @@ flow}}{}% % left of the second frame if they overlap. % \begin{macrocode} \newcommand*{\evencheckifframeleft}{% -\@ifstar\@sevencheckifframeleft\@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 + \@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 + \@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} @@ -3476,46 +4939,75 @@ flow}}{}% % right of the second frame if they overlap. % \begin{macrocode} \newcommand*{\evencheckifframeright}{% -\@ifstar\@sevencheckifframeright\@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 + \@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 + \@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} @@ -3586,90 +5078,91 @@ flow}}{}% % version and to the \gls{idl} for the starred version. % \begin{macrocode} \DeclareRobustCommand*{\relativeframelocation}{% -\@ifstar\@srelativeframelocation\@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 + \@scheckifframeabove{#1}{#2}{#3}{#4}% + \@scheckifframebelow{#1}{#2}{#3}{#4}% + \@scheckifframeleft{#1}{#2}{#3}{#4}% + \@scheckifframeright{#1}{#2}{#3}{#4}% + \ifFLFabove \ifFLFleft - \FFbelowleft + \FFaboveleft \else \ifFLFright - \FFbelowright + \FFaboveright \else - \FFbelow + \FFabove \fi \fi \else - \ifFLFleft - \FFleft + \ifFLFbelow + \ifFLFleft + \FFbelowleft + \else + \ifFLFright + \FFbelowright + \else + \FFbelow + \fi + \fi \else - \ifFLFright - \FFright + \ifFLFleft + \FFleft \else - \FFoverlap - \fi - \fi + \ifFLFright + \FFright + \else + \FFoverlap + \fi + \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 + \@checkifframeabove{#1}{#2}{#3}{#4}% + \@checkifframebelow{#1}{#2}{#3}{#4}% + \@checkifframeleft{#1}{#2}{#3}{#4}% + \@checkifframeright{#1}{#2}{#3}{#4}% + \ifFLFabove \ifFLFleft - \FFbelowleft + \FFaboveleft \else \ifFLFright - \FFbelowright + \FFaboveright \else - \FFbelow + \FFabove \fi \fi \else - \ifFLFleft - \FFleft + \ifFLFbelow + \ifFLFleft + \FFbelowleft + \else + \ifFLFright + \FFbelowright + \else + \FFbelow + \fi + \fi \else - \ifFLFright - \FFright + \ifFLFleft + \FFleft \else - \FFoverlap - \fi - \fi + \ifFLFright + \FFright + \else + \FFoverlap + \fi + \fi + \fi \fi -\fi } % \end{macrocode} %\end{macro} @@ -3677,58 +5170,70 @@ flow}}{}% % Short cut commands for \glspl{frame} of the same type. %\begin{macro}{\reldynamicloc} %\changes{1.11}{2008/06/27}{new} +%\changes{1.14}{2012-11-10}{removed unwanted spaces} %\cs{reldynamicloc}\marg{id1}\marg{id2} % \begin{macrocode} \DeclareRobustCommand*{\reldynamicloc}{% -\@ifstar\@sreldynamicloc\@reldynamicloc} + \@ifstar\@sreldynamicloc\@reldynamicloc +} % \end{macrocode} % Starred version: % \begin{macrocode} -\newcommand*{\@sreldynamicloc}[2]{ -\@srelativeframelocation{dynamic}{#1}{dynamic}{#2}} +\newcommand*{\@sreldynamicloc}[2]{% + \@srelativeframelocation{dynamic}{#1}{dynamic}{#2}% +} % \end{macrocode} % Unstarred version: % \begin{macrocode} -\newcommand*{\@reldynamicloc}[2]{ -\@relativeframelocation{dynamic}{#1}{dynamic}{#2}} +\newcommand*{\@reldynamicloc}[2]{% + \@relativeframelocation{dynamic}{#1}{dynamic}{#2}% +} % \end{macrocode} %\end{macro} % %\begin{macro}{\relstaticloc} %\changes{1.11}{2008/06/27}{new} +%\changes{1.14}{2012-11-10}{removed unwanted spaces} %\cs{relstaticloc}\marg{id1}\marg{id2} % \begin{macrocode} \DeclareRobustCommand*{\relstaticloc}{% -\@ifstar\@srelstaticloc\@relstaticloc} + \@ifstar\@srelstaticloc\@relstaticloc +} % \end{macrocode} % Starred version: % \begin{macrocode} -\newcommand*{\@srelstaticloc}[2]{ -\@srelativeframelocation{static}{#1}{static}{#2}} +\newcommand*{\@srelstaticloc}[2]{% + \@srelativeframelocation{static}{#1}{static}{#2}% +} % \end{macrocode} % Unstarred version: % \begin{macrocode} -\newcommand*{\@relstaticloc}[2]{ -\@relativeframelocation{static}{#1}{static}{#2}} +\newcommand*{\@relstaticloc}[2]{% + \@relativeframelocation{static}{#1}{static}{#2}% +} % \end{macrocode} %\end{macro} % %\begin{macro}{\relflowloc} %\changes{1.11}{2008/06/27}{new} +%\changes{1.14}{2012-11-10}{removed unwanted spaces} %\cs{relflowloc}\marg{id1}\marg{id2} % \begin{macrocode} \DeclareRobustCommand*{\relflowloc}{% -\@ifstar\@srelflowloc\@relflowloc} + \@ifstar\@srelflowloc\@relflowloc +} % \end{macrocode} % Starred version: % \begin{macrocode} -\newcommand*{\@srelflowloc}[2]{ -\@srelativeframelocation{flow}{#1}{flow}{#2}} +\newcommand*{\@srelflowloc}[2]{% + \@srelativeframelocation{flow}{#1}{flow}{#2}% +} % \end{macrocode} % Unstarred version: % \begin{macrocode} -\newcommand*{\@relflowloc}[2]{ -\@relativeframelocation{flow}{#1}{flow}{#2}} +\newcommand*{\@relflowloc}[2]{% + \@relativeframelocation{flow}{#1}{flow}{#2}% +} % \end{macrocode} %\end{macro} % @@ -3739,10 +5244,14 @@ flow}}{}% % Having another \gls{flow} as the initial frame is not % a good idea, and may have unexpected results. % \begin{macrocode} -\newcommand*{\setinitialframe}[1]{\c@thisframe=#1% -\global\usedframebreaktrue -\global\setlength{\hsize}{% -\csname colwidth\romannumeral\c@thisframe\endcsname}} +\newcommand*{\setinitialframe}[1]{% + \c@thisframe=#1% + \global\usedframebreaktrue + \global\setlength{\hsize} + {% + \csname colwidth\romannumeral\c@thisframe\endcsname + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\setframes} @@ -3751,79 +5260,86 @@ flow}}{}% \newif\if@setfr@mes \@setfr@mesfalse \newcommand*{\setframes}{% -\ifnum\c@thisframe=0\relax -\PackageWarning{flowfram}{Can't find a flow frame on page 1. -\MessageBreak -Attempting to find the first page with a flow frame}% -\@nxtcol=1\relax -\c@curpg=1\relax -\@g@tnextcol{\@nxtcol}% -% \end{macrocode} -% shipout pages without flow frames -% \begin{macrocode} -\advance\c@curpg by -1\relax - \whiledo{\c@curpg>0}{\advance\c@curpg by -1\relax - \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% -\@outputpage}% -\c@thisframe=\@nxtcol -\fi -\@setcol{\c@thisframe}\relax -\@setfr@mestrue -\edef\ff@txtcol{% -\csname @ff@txtcol@\romannumeral\c@thisframe\endcsname}% -\@s@tfftextcol + \ifnum\c@thisframe=0\relax + \PackageWarning{flowfram}% + {Can't find a flow frame on page 1. + \MessageBreak + Attempting to find the first page with a flow frame% + }% + \@nxtcol=1\relax + \c@curpg=1\relax + \@g@tnextcol{\@nxtcol}% +% \end{macrocode} +% Shipout pages without flow frames. +% \begin{macrocode} + \advance\c@curpg by -1\relax + \whiledo{\c@curpg>0}% + {% + \advance\c@curpg by -1\relax + \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% + \@outputpage + }% + \c@thisframe=\@nxtcol + \fi + \@setcol{\c@thisframe}\relax + \@setfr@mestrue + \edef\ff@txtcol{% + \csname @ff@txtcol@\romannumeral\c@thisframe\endcsname}% + \@s@tfftextcol } % \end{macrocode} %\end{macro} %\begin{macro}{\emulatetwocolumn} % Emulate original "\twocolumn" declaration. -% This is provided for backward compatibilty, and +% This is provided for backward compatibility, and % may be removed in later versions. % \begin{macrocode} \newcommand{\emulatetwocolumn}[1][]{% -\finishthispage -\setallflowframes{pages=none}% -\settoheight{\@ff@staticH}{#1}% -\settodepth{\@ff@tmp@y}{#1}% -\addtolength{\@ff@staticH}{\@ff@tmp@y}% -\ifdim\@ff@staticH>0pt\relax -\twocolumnStop[\c@page]{\@ff@staticH}% -\c@thisframe=\c@maxflow -\advance\c@thisframe by -1\relax -\@twocolumn[>\c@page]% -\setstaticcontents{\c@maxstatic}{#1}% -\else -\@twocolumn -\c@thisframe=\c@maxflow -\advance\c@thisframe by -1\relax -\fi -\@setcol{\c@thisframe}\relax + \finishthispage + \setallflowframes{pages=none}% + \settoheight{\@ff@staticH}{#1}% + \settodepth{\@ff@tmp@y}{#1}% + \addtolength{\@ff@staticH}{\@ff@tmp@y}% + \ifdim\@ff@staticH>0pt\relax + \twocolumnStop[\@ff@pages@countreg]{\@ff@staticH}% + \c@thisframe=\c@maxflow + \advance\c@thisframe by -1\relax + \@twocolumn[>\@ff@pages@countreg]% + \setstaticcontents{\c@maxstatic}{#1}% + \else + \@twocolumn + \c@thisframe=\c@maxflow + \advance\c@thisframe by -1\relax + \fi + \@setcol{\c@thisframe}% + \relax } % \end{macrocode} %\end{macro} %\begin{macro}{\emulateonecolumn} % Emulate original "\onecolumn" declaration. -% This is provided for backward compatibilty, and +% This is provided for backward compatibility, and % may be removed in later versions. % \begin{macrocode} \newcommand{\emulateonecolumn}[1][]{% -\finishthispage -\setallflowframes{pages=none}% -\settoheight{\@ff@staticH}{#1}% -\settodepth{\@ff@tmp@y}{#1}% -\addtolength{\@ff@staticH}{\@ff@tmp@y}% -\ifdim\@ff@staticH>0pt\relax -\onecolumnStop[\c@page]{\@ff@staticH}% -\c@thisframe=\c@maxflow -\advance\c@thisframe by -1\relax -\@onecolumn[>\c@page]% -\setstaticcontents{\c@maxstatic}{#1}% -\else -\@twocolumn -\c@thisframe=\c@maxflow -\advance\c@thisframe by -1\relax -\fi -\@setcol{\c@thisframe}\relax + \finishthispage + \setallflowframes{pages=none}% + \settoheight{\@ff@staticH}{#1}% + \settodepth{\@ff@tmp@y}{#1}% + \addtolength{\@ff@staticH}{\@ff@tmp@y}% + \ifdim\@ff@staticH>0pt\relax + \onecolumnStop[\@ff@pages@countreg]{\@ff@staticH}% + \c@thisframe=\c@maxflow + \advance\c@thisframe by -1\relax + \@onecolumn[>\@ff@pages@countreg]% + \setstaticcontents{\c@maxstatic}{#1}% + \else + \@twocolumn + \c@thisframe=\c@maxflow + \advance\c@thisframe by -1\relax + \fi + \@setcol{\c@thisframe}% + \relax } % \end{macrocode} %\end{macro} @@ -3831,85 +5347,120 @@ Attempting to find the first page with a flow frame}% % the size of the \gls{typeblock}, and initialise the frames. % \begin{macrocode} \AtBeginDocument{% -\ifnum\c@maxflow=0\relax -\PackageWarning{flowfram}{No flow frames, adding one}% -\@onecolumn -\fi -\setframes -\renewcommand{\onecolumn}[1][]{\PackageWarning{flowfram}{% -Ignoring \string\onecolumn\space found in document environment. -Frames must be defined in the preamble}#1}% -\renewcommand{\twocolumn}[1][]{\PackageWarning{flowfram}{% -Ignoring \string\twocolumn\space found in document environment. -Frames must be defined in the preamble}#1}% + \c@absolutepage=1\relax + \ifnum\c@maxflow=0\relax + \PackageWarning{flowfram}{No flow frames, adding one}% + \@onecolumn + \fi + \setframes + \renewcommand{\onecolumn}[1][]{% + \PackageWarning{flowfram}% + {% + Ignoring \string\onecolumn\space found in document environment. + Frames must be defined in the preamble% + }% + #1% + }% + \renewcommand{\twocolumn}[1][]{% + \PackageWarning{flowfram}% + {% + Ignoring \string\twocolumn\space found in document environment. + Frames must be defined in the preamble}% + #1% + }% } % \end{macrocode} -% If the document finishes before the last frame on the last -% page, need to finish off to ensure the final page is -% shipped out, otherwise the text on the last page will be lost. -% \begin{macrocode} -%\AtEndDocument{\finishthispage} -% \end{macrocode} +% %\subsection{Output Routine} +% +%\begin{macro}{\fftolerance} +% The \styfmt{flowfram} package does a check to see if text has +% flowed between frames of different widths, which will cause a +% discrepancy in the line widths of the paragraph spanning the break. +% Before version~1.14, the output routine just checked if the widths +% were different, but this means that warning messages will be +% generated even if there's only a tiny difference that can be +% caused by rounding errors (for example, if the frames were created +% using jpgfdraw). So add a tolerance and only complain if the +% difference exceeds this value. +%\changes{1.14}{2012-11-10}{new} +% \begin{macrocode} +\newlength\fftolerance +\setlength\fftolerance{2pt} +% \end{macrocode} +%\end{macro} +% %\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} +%\changes{1.14}{2012-11-10}{changed check to use tolerance rather +%than testing if hsize and columnwidth are equal} % \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 + \ifnum\c@maxflow<#1\relax + \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}% + \flf@message{Switching to flow frame \number#1\space on page + \number\@ff@pages@countreg}% + \expandafter\global\expandafter\columnwidth + \csname colwidth\romannumeral#1\endcsname + \dimen@\columnwidth + \advance\dimen@ by -\hsize\relax + \ifdim\dimen@<0pt\relax + \dimen@=-\dimen@ + \fi + \ifdim\dimen@>\fftolerance + \ifusedframebreak + \else + \PackageWarning{flowfram}% + {Moving to flow frame of unequal + width,\MessageBreak use of \string\framebreak\space advised, + or text might not appear correctly (difference = + \the\dimen@, tolerance = \the\fftolerance)}% + \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 - \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}% + \stepcounter{displayedframe}% } % \end{macrocode} %\end{macro} % Modify the output routine so that it uses "\vsize" % instead of "\textheight". % \begin{macrocode} -\output={\let\par\@@par -\ifnum\outputpenalty <-\@M - \@specialoutput -\else - \@makecol - \@opcol \@startcolumn - \@whilesw \if@fcolmade \fi {\@opcol \@startcolumn }% -\fi -\ifnum\outputpenalty>-\@Miv - \ifdim\@colroom<1.5\baselineskip - \ifdim\@colroom<\vsize - \@latex@warning@no@line{Text page \thepage \space - contains only floats}\@emptycol +\output={% + \let\par\@@par + \ifnum\outputpenalty <-\@M + \@specialoutput + \else + \@makecol + \@opcol \@startcolumn + \@whilesw \if@fcolmade \fi {\@opcol \@startcolumn }% + \fi + \ifnum\outputpenalty>-\@Miv + \ifdim\@colroom<1.5\baselineskip + \ifdim\@colroom<\vsize + \@latex@warning@no@line{Text page \thepage \space + contains only floats}% + \@emptycol + \else + \global\vsize\@colroom + \fi \else \global\vsize\@colroom \fi \else - \global\vsize\@colroom + \global\vsize\maxdimen \fi -\else - \global\vsize\maxdimen -\fi } % \end{macrocode} %\begin{macro}{\@doclearpage} @@ -3917,41 +5468,48 @@ Frames must be defined in the preamble}#1}% % with "\vsize", and only use the twocolumn stuff. % \begin{macrocode} \def\@doclearpage{% -\ifvoid\footins - \setbox\@tempboxa\vsplit\@cclv to\z@ - \unvbox\@tempboxa - \setbox\@tempboxa\box\@cclv - \xdef\@deferlist{\@toplist\@botlist\@deferlist}% -\global\let\@toplist\@empty -\global\let\@botlist\@empty -\global\@colroom\@colht - \ifx\@currlist\@empty - \else - \@latexerr{Float(s) lost}\@ehb - \global\let\@currlist\@empty - \fi - \@makefcolumn - \@deferlist - \@whilesw \if@fcolmade \fi {\@opcol - \@makefcolumn - \@deferlist}% -\if@firstcolumn + \ifvoid\footins + \setbox\@tempboxa\vsplit\@cclv to\z@ + \unvbox\@tempboxa + \setbox\@tempboxa\box\@cclv + \xdef\@deferlist{\@toplist\@botlist\@deferlist}% + \global\let\@toplist\@empty + \global\let\@botlist\@empty + \global\@colroom\@colht + \ifx\@currlist\@empty + \else + \@latexerr{Float(s) lost}\@ehb + \global\let\@currlist\@empty + \fi + \@makefcolumn\@deferlist + \@whilesw \if@fcolmade \fi + {% + \@opcol + \@makefcolumn\@deferlist + }% + \if@firstcolumn \xdef\@dbldeferlist{\@dbltoplist\@dbldeferlist}% -\global\let\@dbltoplist\@empty -\global\@colht\vsize -\begingroup - \@dblfloatplacement - \@makefcolumn - \@dbldeferlist - \@whilesw \if@fcolmade \fi {\@outputpage -\@makefcolumn\@dbldeferlist}% -\endgroup -\else - \vbox{}\clearpage -\fi -\else - \setbox\@cclv\vbox{\box\@cclv\vfil}% -\@makecol\@opcol\clearpage\fi} + \global\let\@dbltoplist\@empty + \global\@colht\vsize + \begingroup + \@dblfloatplacement + \@makefcolumn\@dbldeferlist + \@whilesw \if@fcolmade \fi + {% + \@outputpage + \@makefcolumn\@dbldeferlist + }% + \endgroup + \else + \vbox{}% + \clearpage + \fi + \else + \setbox\@cclv\vbox{\box\@cclv\vfil}% + \@makecol\@opcol + \clearpage + \fi +} % \end{macrocode} %\end{macro} % Modify "\@outputpage" slightly. Add provision for @@ -3961,21 +5519,27 @@ Frames must be defined in the preamble}#1}% % First define macro to do the header. This will be % modified if it is turned into a \gls{dynamic}. % \begin{macrocode} -\newcommand{\@dothehead}{\vbox to \headheight{% -\color@hbox\normalcolor\hbox to \textwidth{% -\@thehead}\color@endbox}} +\newcommand{\@dothehead}{% + \vbox to \headheight + {% + \color@hbox\normalcolor\hbox to \textwidth{\@thehead}% + \color@endbox + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@dothefoot} % Same again for the footer. % \begin{macrocode} \newcommand{\@dothefoot}{% -\color@hbox\normalcolor\hbox to \textwidth{% -\@thefoot}\color@endbox} + \color@hbox\normalcolor\hbox to \textwidth{\@thefoot}% + \color@endbox +} \newcommand{\@dodynamicthehead}{} \newcommand{\@dodynamicthefoot}{} % \end{macrocode} %\end{macro} +% %\begin{macro}{\@outputpage} % Now for the modified version of "\@outputpage". The % page style stuff has been moved to "\@outputdblcol" @@ -3983,33 +5547,43 @@ Frames must be defined in the preamble}#1}% % before the \glspl{dynamic} are put on the page. % \begin{macrocode} \def\@outputpage{% -\begingroup - \let\protect\noexpand - \@resetactivechars - \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@ - \vskip\topmargin\moveright\@themargin - \vbox{% - \vskip\headheight - \vskip\headsep - \box\@outputbox - }}% - \global\let\if@newlist\@@if@newlist - \stepcounter{page}% - \setcounter{displayedframe}{0}% - \let\firstmark\botmark} + \begingroup + \let\protect\noexpand + \@resetactivechars + \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@ + \vskip\topmargin\moveright\@themargin + \vbox + {% + \vskip\headheight + \vskip\headsep + \box\@outputbox + }% + }% + \global\let\if@newlist\@@if@newlist + \stepcounter{page}% +% \end{macrocode} +% Also increment absolutepage counter. +%\changes{1.14}{2012-11-10}{added absolutepage increment} +% \begin{macrocode} + \stepcounter{absolutepage}% + \setcounter{displayedframe}{0}% + \let\firstmark\botmark +} % \end{macrocode} %\end{macro} %\begin{macro}{\makedfheaderfooter} @@ -4020,25 +5594,29 @@ Frames must be defined in the preamble}#1}% % footer is given the \gls{idl} "footer". % \begin{macrocode} \newcommand*{\makedfheaderfooter}{% +% \end{macrocode} % create dynamic frames at the standard location -\setlength{\@ff@tmp@y}{\textheight}% -\addtolength{\@ff@tmp@y}{\headsep}% -\newdynamicframe{\textwidth}{\headheight}{0pt}{\@ff@tmp@y}[header]% -\newdynamicframe{\textwidth}{\headheight}{0pt}{-\footskip}[footer]% -\renewcommand{\@dothehead}{}% -\renewcommand{\@dothefoot}{}% -\renewcommand{\@dodynamicthehead}{% -\@dynamicframeid{header}% -\expandafter -\def\csname @dynamicframe@\romannumeral\ff@id\endcsname{% -\vfill\@thehead\vfill}% -}% -\renewcommand{\@dodynamicthefoot}{% -\@dynamicframeid{footer}% -\expandafter -\def\csname @dynamicframe@\romannumeral\ff@id\endcsname{% -\vfill\@thefoot\vfill}% -}% +% \begin{macrocode} + \setlength{\@ff@tmp@y}{\textheight}% + \addtolength{\@ff@tmp@y}{\headsep}% + \newdynamicframe{\textwidth}{\headheight}{0pt}{\@ff@tmp@y}[header]% + \newdynamicframe{\textwidth}{\headheight}{0pt}{-\footskip}[footer]% + \renewcommand{\@dothehead}{}% + \renewcommand{\@dothefoot}{}% + \renewcommand{\@dodynamicthehead}{% + \@dynamicframeid{header}% + \expandafter + \def\csname @dynamicframe@\romannumeral\ff@id\endcsname{% + \vfill\@thehead\vfill + }% + }% + \renewcommand{\@dodynamicthefoot}{% + \@dynamicframeid{footer}% + \expandafter + \def\csname @dynamicframe@\romannumeral\ff@id\endcsname{% + \vfill\@thefoot\vfill + }% + }% } % \end{macrocode} %\end{macro} @@ -4052,11 +5630,17 @@ Frames must be defined in the preamble}#1}% % as the text colour for the \gls{flow} to which they belong. % \begin{macrocode} \newcommand{\footnotecolor}{% -\@ifundefined{@ff@txtcol@\romannumeral\c@thisframe}{% -\normalcolor}{% -\edef\ff@txtcol{% -\csname @ff@txtcol@\romannumeral\c@thisframe\endcsname}% -\@s@tfftextcol}} + \@ifundefined{@ff@txtcol@\romannumeral\c@thisframe}% + {% + \normalcolor + }% + {% + \edef\ff@txtcol{% + \csname @ff@txtcol@\romannumeral\c@thisframe\endcsname + }% + \@s@tfftextcol + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@makecol} @@ -4064,41 +5648,46 @@ Frames must be defined in the preamble}#1}% % footnote rule are in the colour for that frame. % \begin{macrocode} \renewcommand{\@makecol}{% -\ifvoid\footins - \setbox\@outputbox\box\@cclv -\else - \setbox\@outputbox\vbox{% -\boxmaxdepth\@maxdepth\@tempdima\dp\@cclv - \unvbox\@cclv - \vskip\skip\footins - \color@begingroup - \footnotecolor - \footnoterule - \unvbox\footins - \color@endgroup -}\fi -\xdef\@freelist{\@freelist \@midlist }% -\global\let\@midlist\@empty -\@combinefloats -\ifvbox\@kludgeins - \@makespecialcolbox -\else - \setbox\@outputbox\vbox to\@colht{% -\@texttop\dimen@\dp\@outputbox - \unvbox \@outputbox - \vskip -\dimen@\@textbottom -}\fi -\global\maxdepth\@maxdepth} + \ifvoid\footins + \setbox\@outputbox\box\@cclv + \else + \setbox\@outputbox\vbox + {% + \boxmaxdepth\@maxdepth\@tempdima\dp\@cclv + \unvbox\@cclv + \vskip\skip\footins + \color@begingroup + \footnotecolor + \footnoterule + \unvbox\footins + \color@endgroup + }% + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox\vbox to\@colht{% + \@texttop\dimen@\dp\@outputbox + \unvbox \@outputbox + \vskip -\dimen@\@textbottom + }% + \fi + \global\maxdepth\@maxdepth +} % \end{macrocode} %\end{macro} %\begin{macro}{\@opcol} % Modify "\@opcol", as "\if@twocolumn" is now % irrelevant. % \begin{macrocode} -\def\@opcol{\@outputdblcol -\global\@mparbottom\z@ -\global\@textfloatsheight\z@ -\@floatplacement +\def\@opcol{% + \@outputdblcol + \global\@mparbottom\z@ + \global\@textfloatsheight\z@ + \@floatplacement } % \end{macrocode} %\end{macro} @@ -4110,34 +5699,103 @@ Frames must be defined in the preamble}#1}% % \begin{macrocode} \newif\if@ff@moreframes \newcommand*{\@ff@checkifmoreframes}{% -\@ff@moreframesfalse -\@colN=\c@thisframe -\whiledo{\@colN<\c@maxflow}{% -\advance\@colN by 1\relax -\edef\ff@pages{\csname @ff@pages@\romannumeral\@colN\endcsname}% -\@ff@checkpages{\ff@pages}% -}% -\if@ff@moreframes -\else -\@ff@tmpN=\c@page -\advance\@ff@tmpN by 1\relax -\@colN=0\relax -\whiledo{\@colN<\c@thisframe}{% -\advance\@colN by 1\relax -\edef\ff@pages{\csname @ff@pages@\romannumeral\@colN\endcsname}% -\@ff@checkpages[\@ff@tmpN]{\ff@pages}% -}% -\fi -} + \@ff@moreframesfalse + \@colN=\c@thisframe + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@checkpages} -% Check to see if the current page lies in the \gls{pglist} +% Skip if this page is in this frame's exclusion list. +%\changes{1.14}{2012-11-10}{added check for exclusion list} +% \begin{macrocode} + \edef\ff@xpages{\csname @ff@xpages@\romannumeral\@colN\endcsname}% + \@for\@ff@pp:=\ff@xpages\do + {% + \ifnum0\@ff@pp=\@ff@pages@countreg\relax + \@endfortrue + \fi + }% + \if@endfor +% \end{macrocode} +% If for loop was terminated prematurely, then this page is in this +% frame's exclusion list. +% \begin{macrocode} + \else + \edef\ff@pages{\csname @ff@pages@\romannumeral\@colN\endcsname}% + \@ff@checkpages{\ff@pages}% +% \end{macrocode} +% If found a frame, break out of loop. +% \begin{macrocode} + \if@ff@moreframes + \@colN=\c@maxflow\relax + \fi + \fi + }% + \if@ff@moreframes + \else +% \end{macrocode} +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} +% \begin{macrocode} + \@ff@tmpN=\@ff@pages@countreg +% \end{macrocode} +% Look ahead up to a maximum of 4 pages. +% \begin{macrocode} + \count@=0\relax + \loop + \advance\@ff@tmpN by 1\relax + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax +% \end{macrocode} +% Skip if page is in this frame's exclusion list. +% \begin{macrocode} + \edef\ff@xpages{\csname @ff@xpages@\romannumeral\@colN\endcsname}% + \@for\@ff@pp:=\ff@xpages\do + {% + \ifnum0\@ff@pp=\@ff@tmpN\relax + \@endfortrue + \fi + }% + \if@endfor +% \end{macrocode} +% If for loop was terminated prematurely, then page is in this +% frame's exclusion list. +% \begin{macrocode} + \else + \edef\ff@pages{\csname @ff@pages@\romannumeral\@colN\endcsname}% + \@ff@checkpages[\@ff@tmpN]{\ff@pages}% +% \end{macrocode} +% If found a frame, break out of loop. +% \begin{macrocode} + \if@ff@moreframes + \@colN=\c@maxflow\relax + \fi + \fi + }% + \if@ff@moreframes + \count@=4\relax + \else + \advance\count@ by 1\relax + \fi + \ifnum\count@<4 + \repeat + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@checkpages} +% Check to see if the current page lies in the \gls{pglist} % given by "#1". +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} % \begin{macrocode} -\newcommand*{\@ff@checkpages}[2][\c@page]{% -\@for\@ff@pp:=#2\do{% -\@ff@checkthispage{#1}{\@ff@pp}}} +\newcommand*{\@ff@checkpages}[2][\@ff@pages@countreg]{% + \@for\@ff@pp:=#2\do{% + \@ff@checkthispage{#1}{\@ff@pp}% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@checkthispage} @@ -4149,10 +5807,18 @@ Frames must be defined in the preamble}#1}% % ignore it. % \begin{macrocode} \newcommand*{\@ff@checkthispage}[2]{% -\ifthenelse{\equal{#2}{all}\or\equal{#2}{even}\or\equal{#2}{odd}}{% -\@ff@moreframestrue}{% -\ifthenelse{\equal{#2}{none}}{}{% -\@ff@checknumrange{#1}{#2}}}} + \ifthenelse{\equal{#2}{all}\or\equal{#2}{even}\or\equal{#2}{odd}}% + {% + \@ff@moreframestrue + }% + {% + \ifthenelse{\equal{#2}{none}}% + {}% + {% + \@ff@checknumrange{#1}{#2}% + }% + }% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@checknumrange} @@ -4164,15 +5830,16 @@ Frames must be defined in the preamble}#1}% % there are still more \glspl{flow} available. % \begin{macrocode} \newcommand*{\@ff@checknumrange}[2]{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{#2}% -\ifnum\@ff@numend>#1\relax -\@ff@moreframestrue -\else -\ifnum\@ff@numend=#1\relax -\@ff@moreframestrue -\fi -\fi + \def\@ff@numstart{0}% + \def\@ff@numend{100000}% + \@ff@getrange{#2}% + \ifnum\@ff@numend>#1\relax + \@ff@moreframestrue + \else + \ifnum\@ff@numend=#1\relax + \@ff@moreframestrue + \fi + \fi } % \end{macrocode} %\end{macro} @@ -4194,7 +5861,8 @@ Frames must be defined in the preamble}#1}% % ">25", it will do, e.g.\ "\@ff@@getrange>25-\relax". % \begin{macrocode} \newcommand*{\@ff@getrange}[1]{% -\expandafter\@ff@@getrange#1-\relax\end} + \expandafter\@ff@@getrange#1-\relax\end +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@@getrange} @@ -4203,15 +5871,15 @@ Frames must be defined in the preamble}#1}% % is either a single value, or a close ended range. % \begin{macrocode} \def\@ff@@getrange#1#2\end{% -\ifx#1<\relax - \@ff@getrangeless#1#2\end -\else - \ifx#1>\relax - \@ff@getrangegreater#1#2\end + \ifx#1<\relax + \@ff@getrangeless#1#2\end \else - \@@ff@getrange#1#2\end + \ifx#1>\relax + \@ff@getrangegreater#1#2\end + \else + \@@ff@getrange#1#2\end + \fi \fi -\fi } % \end{macrocode} %\end{macro} @@ -4220,21 +5888,23 @@ Frames must be defined in the preamble}#1}% % upper bound. A minimum value of "0" is assumed. % \begin{macrocode} \def\@ff@getrangeless<#1-\relax\end{% -\c@ffrangenum=#1\relax -\advance\c@ffrangenum by -1\relax -\def\@ff@numstart{0}% -\edef\@ff@numend{\number\c@ffrangenum}} + \c@ffrangenum=#1\relax + \advance\c@ffrangenum by -1\relax + \def\@ff@numstart{0}% + \edef\@ff@numend{\number\c@ffrangenum}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@ff@getrangegreater} % Get the values for an open ended range with a lower -% bound. A maximum value of "10000" is assumed. +% bound. A maximum value of "100000" is assumed. % \begin{macrocode} \def\@ff@getrangegreater>#1-\relax\end{% -\c@ffrangenum=#1\relax -\advance\c@ffrangenum by 1\relax -\edef\@ff@numstart{\number\c@ffrangenum}% -\def\@ff@numend{10000}} + \c@ffrangenum=#1\relax + \advance\c@ffrangenum by 1\relax + \edef\@ff@numstart{\number\c@ffrangenum}% + \def\@ff@numend{100000}% +} % \end{macrocode} %\end{macro} %\begin{macro}{\@@ff@getrange} @@ -4243,12 +5913,13 @@ Frames must be defined in the preamble}#1}% % value, otherwise it is a range. % \begin{macrocode} \def\@@ff@getrange#1-#2\end{% -\ifx\relax#2\relax -\def\@ff@numstart{#1}\def\@ff@numend{#1}% -\else -\def\@ff@numstart{#1}% -\@@@ff@getrange#2\end -\fi + \ifx\relax#2\relax + \def\@ff@numstart{#1}% + \def\@ff@numend{#1}% + \else + \def\@ff@numstart{#1}% + \@@@ff@getrange#2\end + \fi } % \end{macrocode} %\end{macro} @@ -4256,3526 +5927,11376 @@ Frames must be defined in the preamble}#1}% % Extract the end value from the closed range. % \begin{macrocode} \def\@@@ff@getrange#1-\relax\end{% -\def\@ff@numend{#1}} + \def\@ff@numend{#1}% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@g@tnextcol} -% Find the next \gls{flow}. If there are no more flow -% frames, define a new one the size of the \gls{typeblock}. -% (Otherwise the remaining document text will be lost.) +% +%\begin{macro}{\@ff@output@adjustframes} +%\changes{1.14}{2012-11-10}{new} +% Provide a hook to adjust frame settings in the output routine. % \begin{macrocode} -\newif\if@notthiscol -\newif\if@ff@nwpg -\newcount\c@curpg -\newcommand*{\@g@tnextcol}[1]{% -\@ff@checkifmoreframes -\if@ff@moreframes -\else -% No more frames, add new frame -\PackageWarning{flowfram}{Run out of flows frames, -adding new one}% -\@onecolumn -#1=\c@maxflow -\fi -\@notthiscoltrue -\@ff@nwpgfalse -\@colN=#1\relax -\c@curpg=\c@page -\loop -\ifnum\@colN=\c@maxflow - \@colN=1\@ff@nwpgtrue - \advance\c@curpg by 1\relax -\else - \advance\@colN by 1\relax -\fi -\@ff@chckifthispg{\c@curpg}{\@colN}% -\if@notthiscol -\repeat -#1=\@colN -} +\newcommand*{\@ff@output@adjustframes}{} % \end{macrocode} %\end{macro} -%\begin{macro}{\@ff@chckifthispg} -% This is used to determine the next \gls{flow}, since not -% all \glspl{flow} may be defined on every page. Checks to -% see if \gls{flow} "#2" is defined on page "#1". -% First set up some variables. +% +%\begin{macro}{\flowswitchonnext} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed flow frames from the next page onwards % \begin{macrocode} -\newcommand*{\@ff@chckifthispg}[2]{% -\@notthiscoltrue -\edef\ff@pages{\csname @ff@pages@\romannumeral#2\endcsname}% -\@@ff@chckifthispg{#1}% +\newcommand*{\flowswitchonnext}{% + \@ifstar\@sflowswitchonnext\@flowswitchonnext } % \end{macrocode} %\end{macro} -%\begin{macro}{\@@ff@chckifthispg} -% Now go ahead and check. -% \begin{macrocode} -\newcommand*{\@@ff@chckifthispg}[1]{% -\ifthenelse{\equal{\ff@pages}{none}}{}{% -\ifthenelse{\equal{\ff@pages}{all}}{\@notthiscolfalse}{% -\ifthenelse{\equal{\ff@pages}{odd}}{% -\ifodd#1\@notthiscolfalse\fi}{% -\ifthenelse{\equal{\ff@pages}{even}}{% -\ifodd#1\else\@notthiscolfalse\fi}{% -% check through list of page numbers -\@for\@ff@pp:=\ff@pages\do{% -\def\@ff@numstart{0}\def\@ff@numend{0}% -\@ff@getrange{\@ff@pp}% -\ifthenelse{#1<\@ff@numstart \or #1>\@ff@numend}{}{% -\@notthiscolfalse}% -}% -}}}}% +% +%\begin{macro}{\@sflowswitchonnext} +% The starred version uses \glspl{idl}. +% \begin{macrocode} +\newcommand{\@sflowswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% +% \end{macrocode} +% Is this frame already on? +% \begin{macrocode} + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@sf@chckifthispg} -% Checks to see if \gls{static} "#1" is defined on the -% current page. +% +%\begin{macro}{\@flowswitchonnext} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\@sf@chckifthispg}[1]{% -\@notthiscoltrue -\edef\ff@pages{\csname @sf@pages@\romannumeral#1\endcsname}% -\@@ff@chckifthispg{\c@page}% -} +\newcommand{\@flowswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@df@chckifthispg} -% Checks to see if \gls{dynamic} "#1" is defined on the -% current page. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\@df@chckifthispg}[1]{% -\@notthiscoltrue -\edef\ff@pages{\csname @df@pages@\romannumeral#1\endcsname}% -\@@ff@chckifthispg{\c@page}% + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@setcolbox} -% Sets the \TeX\ box defining the \gls{flow} to the output -% box. This saves the output until the page is shipped out after -% all the \glspl{flow} have been filled for that page. +% +%\begin{macro}{\flowswitchonnextodd} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed flow frames from the next odd page onwards % \begin{macrocode} -\newcommand*{\@setcolbox}[1]{% -\expandafter\global\expandafter\setbox -\csname column\romannumeral#1\endcsname\box\@outputbox +\newcommand*{\flowswitchonnextodd}{% + \@ifstar\@sflowswitchonnextodd\@flowswitchonnextodd } % \end{macrocode} %\end{macro} -%\begin{macro}{\@docolbox} -% Put \gls{flow} on the page with the correct border, if it -% has one. +% +%\begin{macro}{\@sflowswitchonnextodd} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@docolbox}[1]{% -\edef\ff@frametype{% -\csname @ff@frametype@\romannumeral#1\endcsname}% -\edef\ff@col{\csname @ff@col@\romannumeral#1\endcsname}% -\edef\ff@txtcol{\csname @ff@txtcol@\romannumeral#1\endcsname}% -\edef\ff@backcol{\csname @ff@backcol@\romannumeral#1\endcsname}% -\@ff@setoffset{#1}% -\rotateframe{\csname @ff@angle@\romannumeral#1\endcsname}{% -\ifthenelse{\boolean{columnframe\romannumeral#1}}{% -\@ff@fbox{\csname colwidth\romannumeral#1\endcsname}% -{\csname colheight\romannumeral#1\endcsname}{% -\expandafter\box\csname column\romannumeral#1\endcsname}{% -\csname\ff@frametype\endcsname}% -}{% -\@ff@box{\csname colwidth\romannumeral#1\endcsname}% -{\csname colheight\romannumeral#1\endcsname}{% -\expandafter\box\csname column\romannumeral#1\endcsname}% -}}} +\newcommand{\@sflowswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@docolbbox} -% Do the \gls{bbox} for given \gls{flow}. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\@docolbbox}[1]{% -\@ff@setoffset{#1}% -\def\ff@col{}\def\ff@txtcol{}% -\@fr@meifdraft{% -\@ff@box{\csname colwidth\romannumeral#1\endcsname}% -{\csname colheight\romannumeral#1\endcsname}{% -\expandafter\box\csname column\romannumeral#1\endcsname}}% -{F:\number#1;\csname @col@id@\romannumeral#1\endcsname}} + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@fbox} -% Put the \TeX\ box "#3" of width "#1" and -% height "#2", and frame making command -% specified by "#4". +% Is this frame already switched on for the next page? % \begin{macrocode} -\newcommand{\@ff@fbox}[4]{{% -\fboxsep=\flowframesep\fboxrule=\flowframerule\@s@tffcol -\kern\@ff@offset -#4{\@ff@box{#1}{#2}{#3}}}} + \@ff@chckifthispg{\count@}{\ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@ff@box} -% Put the \TeX\ box "#3" of width "#1" and height "#2" on -% the page. +% +%\begin{macro}{\@flowswitchonnextodd} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand{\@ff@box}[3]{{\@ffbackground{\vbox to#2 -{\hb@xt@ #1{\hss{\@s@tfftextcol #3}\hss}\vss\kern\z@}}}} +\newcommand{\@flowswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@putcolbox} -% Display the \gls{flow} on the page, at its given position. -% If the document is two-sided, need to check whether -% the current page is odd or even to determine the correct -% location. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\@putcolbox}[1]{% -\@ff@chckifthispg{\c@page}{#1}% -\if@notthiscol -\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname col@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@posx\endcsname -\@docolbox{#1}\hss}% -\else -\expandafter\raise\csname col@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@evenx\endcsname -\@docolbox{#1}\hss}% -\fi -\else -\expandafter\raise\csname col@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@posx\endcsname -\@docolbox{#1}\hss}% -\fi -\fi -} + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi % \end{macrocode} -%\end{macro} -%\begin{macro}{\@putcolbbox} -% Same for \gls{flow} \gls{bbox}: +% Is this frame already switched on for the next page? % \begin{macrocode} -\newcommand*{\@putcolbbox}[1]{% -\@ff@chckifthispg{\c@page}{#1}% -\if@notthiscol -\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname col@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@posx\endcsname -\@docolbbox{#1}\hss}% -\else -\expandafter\raise\csname col@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@evenx\endcsname -\@docolbbox{#1}\hss}% -\fi -\else -\expandafter\raise\csname col@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@posx\endcsname -\@docolbbox{#1}\hss}% -\fi -\fi + \@ff@chckifthispg{\count@}{\@ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% } % \end{macrocode} %\end{macro} -% If an offset hasn't been specified, compute it. If the -% frame making command is known (e.g. doublebox), compute -% the offset according to known specifications, otherwise -% set the negative offset to "\flowframesep" plus -% "\flowframerule", which may or may not be correct. % -%\begin{macro}{\@ff@s@t@doubleboxoffset} -% Compute offset for "\doublebox": +%\begin{macro}{\flowswitchoffnext} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed flow frames from the next page onwards % \begin{macrocode} -\newcommand*{\@ff@s@t@doubleboxoffset}{% -\setlength{\@ff@offset}{-\flowframesep}% -\addtolength{\@ff@offset}{-3.75\flowframerule}% -\addtolength{\@ff@offset}{-.5pt}% +\newcommand*{\flowswitchoffnext}{% + \@ifstar\@sflowswitchoffnext\@flowswitchoffnext } % \end{macrocode} %\end{macro} -%\begin{macro}{\@ff@s@t@ovalboxoffset} -% Compute offset for "\ovalbox": +% +%\begin{macro}{\@sflowswitchoffnext} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@ff@s@t@ovalboxoffset}{% -\@ff@offset=-\fontdimen 8\tenln\relax -\advance\@ff@offset by -\flowframesep\relax -} +\newcommand{\@sflowswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@s@t@Ovalboxoffset} -% Compute offset for "\ovalbox": +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\@ff@s@t@Ovalboxoffset}{% -\@ff@offset=-\fontdimen 8\tenlnw\relax -\advance\@ff@offset by -\flowframesep\relax + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@ff@s@t@defaultoffset} -% Compute default offset: +% +%\begin{macro}{\@flowswitchoffnext} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\@ff@s@t@defaultoffset}{% -\@ff@offset=-\flowframesep\relax -\addtolength{\@ff@offset}{-\flowframerule}% -} +\newcommand{\@flowswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@setoffset} -% Compute offset for \gls{flow} "#1". Stores offset value -% in "\ff@offset". +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\@ff@setoffset}[1]{% -\ifthenelse{\equal{\csname @ff@offset@\romannumeral#1\endcsname}% -{compute}}{% -\ifthenelse{\boolean{columnframe\romannumeral#1}}{% -\ifthenelse{% -\equal{\csname @ff@frametype@\romannumeral#1\endcsname}% -{doublebox}}{% -\@ff@s@t@doubleboxoffset -}{% -\ifthenelse{% -\equal{\csname @ff@frametype@\romannumeral#1\endcsname}% -{ovalbox}}{% -\@ff@s@t@ovalboxoffset -}{% -\ifthenelse{% -\equal{\csname @ff@frametype@\romannumeral#1\endcsname}% -{Ovalbox}}{% -\@ff@s@t@Ovalboxoffset}{% -\@ff@s@t@defaultoffset -}}}% -}{}% -}{% -\setlength{\@ff@offset}% -{\csname @ff@offset@\romannumeral#1\endcsname}}% + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@sf@setoffset} -% Compute offset for \gls{static} "#1". Stores offset value -% in "\ff@offset". +% +%\begin{macro}{\flowswitchoffnextodd} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed flow frames from the next odd page onwards % \begin{macrocode} -\newcommand*{\@sf@setoffset}[1]{% -\ifthenelse{% -\equal{\csname @sf@offset@\romannumeral#1\endcsname}% -{compute}}{% -\ifthenelse{\boolean{staticframe\romannumeral#1}}{% -\ifthenelse{% -\equal{\csname @sf@frametype@\romannumeral#1\endcsname}% -{doublebox}}{% -\@ff@s@t@doubleboxoffset -}{% -\ifthenelse{% -\equal{\csname @sf@frametype@\romannumeral#1\endcsname}% -{ovalbox}}{% -\@ff@s@t@ovalboxoffset -}{% -\ifthenelse{% -\equal{\csname @sf@frametype@\romannumeral#1\endcsname}% -{Ovalbox}}{% -\@ff@s@t@Ovalboxoffset -}{% -\@ff@s@t@defaultoffset -}}}% -}{}% -}{% -\setlength{\@ff@offset}% -{\csname @sf@offset@\romannumeral#1\endcsname}}% +\newcommand*{\flowswitchoffnextodd}{% + \@ifstar\@sflowswitchoffnextodd\@flowswitchoffnextodd } % \end{macrocode} %\end{macro} -%\begin{macro}{\@df@setoffset} -% Compute offset for \gls{dynamic} "#1". Stores offset value -% in "\ff@offset". +% +%\begin{macro}{\@sflowswitchoffnextodd} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@df@setoffset}[1]{% -\ifthenelse{% -\equal{\csname @df@offset@\romannumeral#1\endcsname}% -{compute}}{% -\setlength{\@ff@offset}{0pt}% -\ifthenelse{\boolean{dynamicframe\romannumeral#1}}{% -\ifthenelse{% -\equal{\csname @df@frametype@\romannumeral#1\endcsname}% -{doublebox}}{% -\@ff@s@t@doubleboxoffset -}{% -\ifthenelse{% -\equal{\csname @df@frametype@\romannumeral#1\endcsname}% -{ovalbox}}{% -\@ff@s@t@ovalboxoffset -}{% -\ifthenelse{% -\equal{\csname @df@frametype@\romannumeral#1\endcsname}% -{Ovalbox}}{% -\@ff@s@t@Ovalboxoffset}{% -\@ff@s@t@defaultoffset -}}}% -}{}% -}{% -\setlength{\@ff@offset}% -{\csname @df@offset@\romannumeral#1\endcsname}}% -} +\newcommand{\@sflowswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@putmarginbox} -% Draw box representing the margin for \gls{flow} "#1". +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\@putmarginbox}[1]{% -\@ff@chckifthispg{\c@page}{#1}% -\if@notthiscol -\else -\@killglue -\if@twoside -\ifodd\c@page -\edef\ff@x{\csname col@\romannumeral#1@posx\endcsname}% -\edef\ff@y{\csname col@\romannumeral#1@posy\endcsname}% -\else -\edef\ff@x{\csname col@\romannumeral#1@evenx\endcsname}% -\edef\ff@y{\csname col@\romannumeral#1@eveny\endcsname}% -\fi -\else -\edef\ff@x{\csname col@\romannumeral#1@posx\endcsname}% -\edef\ff@y{\csname col@\romannumeral#1@posy\endcsname}% -\fi -\setlength{\@ff@tmp@x}{\ff@x}% -\setlength{\@ff@tmp@y}{\ff@y}% -\@getmarginpos{\csname @ff@margin@\romannumeral#1\endcsname}% -\ifthenelse{\equal{\ff@margin}{left}}{% -\addtolength{\@ff@tmp@x}{-\marginparwidth}% -\addtolength{\@ff@tmp@x}{-\marginparsep}% -\ifthenelse{\boolean{columnframe\romannumeral#1}}{% -}{}% -}{% -\addtolength{\@ff@tmp@x}% -{\csname colwidth\romannumeral#1\endcsname}% -\addtolength{\@ff@tmp@x}{\marginparsep}% -\ifthenelse{\boolean{columnframe\romannumeral#1}}{% -}{}% -}% -\raise\@ff@tmp@y -\hb@xt@\z@{% -\expandafter\kern\@ff@tmp@x -\@fr@meifdraft{\@ff@box{\marginparwidth}% -{\csname colheight\romannumeral#1\endcsname}{}}% -{M:\number#1}\hss}\fi -\ignorespaces} + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@drawmargins} -% Draw all the margins associated with the \glspl{flow} defined -% on the current page. +% It's off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand*{\@ff@drawmargins}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxflow}{% -\advance\@colN by 1\relax -\makebox[0pt][l]{\@putmarginbox{\@colN}}% -}% -} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@getstaticpos} -% Extract the width and height for static or \gls{dynamic} -% specified in the form \oarg{c}\oarg{height}\oarg{valign}\marg{width} +% This page is even and the frame is off on this page, so set to +% none. % \begin{macrocode} -\def\@ff@getstaticpos[#1][#2][#3]#4{\@ff@tmp@x=#4\relax -\@ff@tmp@y=#2\relax -\def\ff@valign{#3}} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@dostaticbox} -% Display the savebox associated with \gls{static} "#1" +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcommand*{\@dostaticbox}[1]{% -\edef\ff@frametype{% -\csname @sf@frametype@\romannumeral#1\endcsname}% -\edef\ff@col{\csname @sf@col@\romannumeral#1\endcsname}% -\edef\ff@backcol{\csname @sf@backcol@\romannumeral#1\endcsname}% -\@sf@setoffset{#1}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname -\rotateframe{\csname @sf@angle@\romannumeral#1\endcsname}{% -\ifthenelse{\boolean{staticframe\romannumeral#1}}{% -\@ff@fbox{\@ff@tmp@x}{\@ff@tmp@y}{% -\expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname} -{\csname\ff@frametype\endcsname}% -}{% -\@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% -{\expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname}% -}}} + \@ff@chckifthispg{\count@}{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@dostaticbbox} -% Now for the \gls{bbox}: +% Off on the next page as well, so set to none. % \begin{macrocode} -\newcommand*{\@dostaticbbox}[1]{% -\edef\ff@col{}% -\@sf@setoffset{#1}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname -\@fr@meifdraft{% -\@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% -{\expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname}% -}{S:\number#1;\csname @sf@id@\romannumeral#1\endcsname}} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@putstaticbox} -% Put the static box "#1" at its given position, with its -% associated border. +% Not off on the next page, so set to next page only. % \begin{macrocode} -\newcommand*{\@putstaticbox}[1]{% -\@sf@chckifthispg{#1}% -\if@notthiscol\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname -\@dostaticbox{#1}\hss}% -\else -\expandafter\raise\csname @sf@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@evenx\endcsname -\@dostaticbox{#1}\hss}% -\fi -\else -\expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname -\@dostaticbox{#1}\hss}% -\fi -\fi} + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@putstaticbbox} -% Now for the \gls{bbox}: +% It's not off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand*{\@putstaticbbox}[1]{% -\@sf@chckifthispg{#1}% -\if@notthiscol\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname -\@dostaticbbox{#1}\hss}\ignorespaces -\else -\expandafter\raise\csname @sf@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@evenx\endcsname -\@dostaticbbox{#1}\hss}\ignorespaces -\fi -\else -\expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname -\@dostaticbbox{#1}\hss}\ignorespaces -\fi -\fi} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\@resetst@tics} -% Clear the contents of all the \glspl{static} that have -% the "clear" option set. +% This page is even and the frame is not off on this page, so set to +% this page. % \begin{macrocode} -\newcommand*{\@resetst@tics}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\ifthenelse{\boolean{@sf@clear@\romannumeral\@colN}}{% -\global\sbox{% -\csname @staticframe@\romannumeral\@colN\endcsname}{}}{}}} + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@resetdyn@mics} -% Clear the contents of the \glspl{dynamic} that have the "clear" option -% set. +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcommand*{\@resetdyn@mics}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\ifthenelse{\boolean{@df@clear@\romannumeral\@colN}}{% -\expandafter\global\expandafter -\gdef\csname @dynamicframe@\romannumeral\@colN\endcsname{}}{}}} + \@ff@chckifthispg{\count@}{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@dodfparbox} -% Display contents of dynamic box (contents stored in -% "\ff@contents", style given by "\ff@style"): +% Off on the next page but not off on this page. So set to just this +% page. % \begin{macrocode} -\newcommand*{\@dodfparbox}[1]{% -\expandafter\let\expandafter -\@ff@parshape\csname @df@shape@\romannumeral#1\endcsname -\expandafter\@ff@getshape\@ff@parshape\relax -\ifcase\ff@shape -% no shape -\expandafter\expandafter\expandafter -\parbox\csname @df@dim@\romannumeral#1\endcsname -{% -\setlength\parindent\sdfparindent -\csname\ff@style\endcsname{\ff@contents}}% -\or -% \parshape -\expandafter\expandafter\expandafter -\parbox\csname @df@dim@\romannumeral#1\endcsname -{% -\setlength\parindent\sdfparindent -\csname\ff@style\endcsname{{% -\let\oldpar=\par -\let\par=\ffpshpar -\@ff@setsecthead -\@ff@parshape -\ff@contents\oldpar}}}% -\or -% \shapepar -\expandafter\expandafter\expandafter -\parbox\csname @df@dim@\romannumeral#1\endcsname -{% -\setlength\parindent\sdfparindent -\csname\ff@style\endcsname{{\@ff@disablesec\@ff@parshape -\ff@contents\par}}}% -\fi + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else +% \end{macrocode} +% Not off on the next page as well, so set to this page and next page. +% \begin{macrocode} + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi +% \end{macrocode} +% \begin{macrocode} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{\@ff@nextpages}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@dodynamicbox} -% Typeset the dynamic box with its associated border. +% +%\begin{macro}{\@flowswitchoffnextodd} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\@dodynamicbox}[1]{% -\edef\ff@frametype{% -\csname @df@frametype@\romannumeral#1\endcsname}% -\edef\ff@col{\csname @df@col@\romannumeral#1\endcsname}% -\edef\ff@txtcol{\csname @df@txtcol@\romannumeral#1\endcsname}% -\edef\ff@backcol{\csname @df@backcol@\romannumeral#1\endcsname}% -\edef\ff@style{\csname @df@style@\romannumeral#1\endcsname}% -\def\ff@contents{\csname @dynamicframe@\romannumeral#1\endcsname}% -\@df@setoffset{#1}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname -\rotateframe{\csname @df@angle@\romannumeral#1\endcsname}{% -\ifthenelse{\boolean{dynamicframe\romannumeral#1}}{% -\@ff@fbox{\@ff@tmp@x}{\@ff@tmp@y}% -{\@dodfparbox{#1}}% -{\csname\ff@frametype\endcsname}% -}{% -\@ff@box{\@ff@tmp@x}{\@ff@tmp@y}{% -\@dodfparbox{#1}}% -}}} +\newcommand{\@flowswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@dodynamicbbox} -% Now for the \gls{bbox}: +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\@dodynamicbbox}[1]{% -\edef\ff@col{}% -\@df@setoffset{#1}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname -\@fr@meifdraft{% -\@ff@box{\@ff@tmp@x}{\@ff@tmp@y}{% -\expandafter\expandafter\expandafter -\parbox\csname @df@dim@\romannumeral#1\endcsname -{}}% -}{D:\number#1;\csname @df@id@\romannumeral#1\endcsname}} + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@putdynamicbox} -% Put the \gls{dynamic} "#1" at its given position +% It's off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand*{\@putdynamicbox}[1]{% -\@df@chckifthispg{#1}% -\if@notthiscol\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname @df@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@posx\endcsname -\@dodynamicbox{#1}\hss}\ignorespaces -\else -\expandafter\raise\csname @df@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@evenx\endcsname -\@dodynamicbox{#1}\hss}\ignorespaces -\fi -\else -\expandafter\raise\csname @df@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@posx\endcsname -\@dodynamicbox{#1}\hss}\ignorespaces -\fi -\fi} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\@putdynamicbbox} -% Bounding box: +% This page is even and the frame is off on this page, so set to +% none. % \begin{macrocode} -\newcommand*{\@putdynamicbbox}[1]{% -\@df@chckifthispg{#1}% -\if@notthiscol\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname @df@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@posx\endcsname -\@dodynamicbbox{#1}\hss}\ignorespaces -\else -\expandafter\raise\csname @df@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@evenx\endcsname -\@dodynamicbbox{#1}\hss}\ignorespaces -\fi -\else -\expandafter\raise\csname @df@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@posx\endcsname -\@dodynamicbbox{#1}\hss}\ignorespaces -\fi -\fi} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@doheader} -% Do standard header in the standard place. +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcommand*{\@@doheader}{% -\setlength\@ff@tmp@y{\textheight}% -\addtolength{\@ff@tmp@y}{\headsep}% -\def\ff@col{}% -\def\ff@txtcol{}% -\def\ff@backcol{{none}}% -\@ff@box{0pt}{\@ff@tmp@y}{\makebox[0pt][l]{\@dothehead}}% -} + \@ff@chckifthispg{\count@}{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@dofooter} -% Do standard footer in the standard place. +% Off on the next page as well, so set to none. % \begin{macrocode} -\newcommand*{\@@dofooter}{% -\setlength\@ff@tmp@y{-\footskip}% -\def\ff@col{}% -\def\ff@txtcol{}% -\def\ff@backcol{{none}}% -\@ff@box{0pt}{\@ff@tmp@y}{\makebox[0pt][l]{\@dothefoot}}% -} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@s@tfr@mes} -% This is a modified version of the way the picture environment -% works: +% Not off on the next page, so set to next page only. % \begin{macrocode} -\newcommand{\@s@tfr@mes}[1]{{\@picht\textheight -\setbox\@picbox\hb@xt@ \textwidth -\bgroup \hbox \bgroup #1\relax -\egroup -\hss \egroup -\ht\@picbox\@picht \dp\@picbox -\z@ \mbox{\box \@picbox}}} + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@doallflowframes} -% Puts all the \glspl{flow} defined on the current page +% It's not off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand*{\@ff@doallflowframes}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\@putcolbox{\@colN}}% -} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@doallflowframesbbox} -% Flow frame \glspl{bbox}: +% This page is even and the frame is not off on this page, so set to +% this page. % \begin{macrocode} -\newcommand*{\@ff@doallflowframesbbox}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\@putcolbbox{\@colN}}% -} + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@doallstatics} -% Puts all \glspl{static} defined on the current page +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcommand*{\@ff@doallstatics}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\@putstaticbox{\@colN}}% -} + \@ff@chckifthispg{\count@}{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@doallstaticsbbox} -% Static frame \glspl{bbox}: +% Off on the next page but not off on this page. So set to just this +% page. % \begin{macrocode} -\newcommand*{\@ff@doallstaticsbbox}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\@putstaticbbox{\@colN}}% + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else +% \end{macrocode} +% Not off on the next page as well, so set to this page and next page. +% \begin{macrocode} + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi +% \end{macrocode} +% \begin{macrocode} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{\@ff@nextpages}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@ff@doalldynamics} -% Puts all the \glspl{dynamic} defined on the current page +% +%\begin{macro}{\flowswitchonnextonly} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed flow frames for just the next page % \begin{macrocode} -\newcommand*{\@ff@doalldynamics}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\@putdynamicbox{\@colN}}% +\newcommand*{\flowswitchonnextonly}{% + \@ifstar\@sflowswitchonnextonly\@flowswitchonnextonly } % \end{macrocode} %\end{macro} -%\begin{macro}{\@ff@doalldynamicsbbox} -% Dynamic frame \glspl{bbox}: +% +%\begin{macro}{\@sflowswitchonnextonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@ff@doalldynamicsbbox}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\@putdynamicbbox{\@colN}}% +\newcommand{\@sflowswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% +% \end{macrocode} +% Is this frame already on? +% \begin{macrocode} + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol +% \end{macrocode} +% Not, it isn't, so just set to the next page: +% \begin{macrocode} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{\number\count@}% + }% + \else +% \end{macrocode} +% Yes, it is, so set to this page and the next page: +% \begin{macrocode} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@ff@dotypeblock} -% Draw \gls{typeblock} frame if draft. +% +%\begin{macro}{\@flowswitchonnextonly} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\@ff@dotypeblock}{% -\makebox[0pt][l]{\@fr@meifdraft[\setffdrafttypeblockcolor]{% -\vbox to \textheight{\hbox to \textwidth{}}}{}}} +\newcommand{\@flowswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ff@do@allframes} -% Put all frames defined on the current page. +% Is this frame already on? % \begin{macrocode} -\newlength\ffevenoffset -\newcommand*{\@ff@do@allframes}{% -\ffevenoffset=0pt\relax -\if@twoside - \ifodd\c@page - \else - \ffevenoffset=-\oddsidemargin\relax - \advance\ffevenoffset by \evensidemargin\relax - \kern\ffevenoffset\relax - \fi -\fi -\setlength{\@ff@tmp@x}{\textwidth}% -\advance\@ff@tmp@x by -\ffevenoffset\relax -\makebox[\@ff@tmp@x][l]{% -\@s@tfr@mes{% -\@ff@doallstatics -\@@doheader -\@@dofooter -\@ff@doallflowframes -\@ff@doalldynamics -\ifshowtypeblock - \@ff@dotypeblock -\fi -\ifshowframebbox - \@ff@doallstaticsbbox - \@ff@doallflowframesbbox - \@ff@doalldynamicsbbox -\fi -\ifshowmargins - \@ff@drawmargins -\fi -}}} + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@outputdblcol} -% This was modified from the output routine for standard -% two column format. After "\@g@tnextcol", the register -% "\c@curpg" contains the page that the next \gls{flow} -% is on. If "\c@curpg" minus "\c@page" is greater -% than 1, then there is at least one page without a \gls{flow}. -% These pages will have to be shipped before \TeX\ can -% continue with the rest of the document. +% Not, it isn't, so just set to the next page: % \begin{macrocode} -\newcount\@nxtcol -\def\@outputdblcol{% -\@nxtcol=\c@thisframe -\c@curpg=\c@page -\@g@tnextcol{\@nxtcol}% -\if@ff@nwpg % next flow frame starts on new page - \global\@firstcolumntrue - \@setcolbox\c@thisframe - \if@specialpage - \global\@specialpagefalse - \@nameuse{ps@\@specialstyle}\relax - \fi - \if@twoside - \ifodd\count\z@ - \let\@thehead\@oddhead - \let\@thefoot\@oddfoot + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{\number\count@}% + }% \else - \let\@thehead\@evenhead - \let\@thefoot\@evenfoot +% \end{macrocode} +% Yes, it is, so set to this page and the next page: +% \begin{macrocode} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% \fi - \else - \let\@thehead\@oddhead - \let\@thefoot\@oddfoot - \fi - \@begindvi - \@dodynamicthehead\@dodynamicthefoot - \vbadness=\@M - \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% - \@combinedblfloats - \@outputpage -%shipout pages without flow frames -\advance\c@curpg by -\c@page\relax - \whiledo{\c@curpg>0}{\advance\c@curpg by -1\relax - \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% -\@outputpage} - \begingroup - \@dblfloatplacement - \@startdblcolumn - \@whilesw \if@fcolmade \fi - {\@outputpage \@startdblcolumn }\endgroup - \@resetst@tics - \@resetdyn@mics -\else % still on same page, save contents of box255 - \global\@firstcolumnfalse - \@setcolbox\c@thisframe -\fi -\global\c@thisframe=\@nxtcol -\@setcol{\c@thisframe}\relax -\global\@colht\vsize + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@dblfloatplacement} -% Modify "\@dblfloatplacement" replacing "\textheight" -% with "\vsize". +% +%\begin{macro}{\flowswitchonnextoddonly} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed flow frames for just the next odd page % \begin{macrocode} -\def\@dblfloatplacement{% - \global\@dbltopnum\c@dbltopnumber - \global\@dbltoproom\dbltopfraction\@colht\@textmin - \@colht\advance\@textmin -\@dbltoproom - \@fpmin\dblfloatpagefraction\vsize - \@fptop \@dblfptop \@fpsep \@dblfpsep \@fpbot \@dblfpbot} +\newcommand*{\flowswitchonnextoddonly}{% + \@ifstar\@sflowswitchonnextoddonly\@flowswitchonnextoddonly +} % \end{macrocode} %\end{macro} % -%\subsection{Static versions of floats} -% Floats can not go in saveboxes or minipages, so define -% static versions to go in static and \glspl{dynamic}. -% These just set "\@captype" so that the "\caption" -% command may be used. -%\begin{environment}{statictable} +%\begin{macro}{\@sflowswitchonnextoddonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newenvironment{statictable}{\def\@captype{table}}{} +\newcommand{\@sflowswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% % \end{macrocode} -%\end{environment} -%\begin{environment}{staticfigure} +% Is this frame already on? % \begin{macrocode} -\newenvironment{staticfigure}{\def\@captype{figure}}{} + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{environment} -% -%\subsection{Standard Layouts} -%\subsubsection{Column Styles} -% Redefine "\twocolumn" and "\onecolumn" to set up \glspl{flow} from -% the dimensions of the \gls{typeblock}. Ignore the optional argument. -% The \gls{flow} height will be adjusted to make sure that it -% is an integer multiple of "\baselineskip", unless -% "\ffvajdustfalse" is used. +% No, it isn't. If this is an odd page, is it on or off on the next +% page? First, is this an odd page? % \begin{macrocode} -\newif\ifffvadjust -\ffvadjusttrue + \ifodd\@ff@pages@countreg % \end{macrocode} -%\begin{macro}{\onecolumn} -% "\onecolumn" will make a single \gls{flow} that takes -% up the entire area of the \gls{typeblock} (adjusted according -% to "\ifffvadjust".) Frames should only be created in -% the preamble, otherwise the next \gls{flow} may not -% be detected by the output routine. The exception to this -% is when the output routine can't find any more \glspl{flow} -% to use, in which case it creates a single \gls{flow} using -% "\@onecolumn". Therefore, make "\onecolumn" use "\@onecolumn", -% and then set "\onecolumn" as a preamble command, so it -% can't be used in the document, but the output routine can -% use "\@onecolumn". Syntax: \cs{onecolumn}\oarg{pages}, -% where \meta{pages} is the \gls{pglist} for which the new -% \gls{flow} is defined. +% Yes, it's odd. So this frame isn't on this page, but is it on or +% off on the next page? % \begin{macrocode} -\renewcommand*{\onecolumn}{\@onecolumn} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@ff@chckifthispg{\count@}{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@onecolumn} +% It's not switched on either on this (odd) page or the next (even) page. So +% the page list should be just the next odd page after this one. % \begin{macrocode} -\newcommand*{\@onecolumn}[1][all]{% -\@onecolumninarea[#1]{\textwidth}{\textheight}{0pt}{0pt}} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else % \end{macrocode} -%\end{macro} -% Need a length to store the height of -% the \gls{flow} so that it can be adjusted. +% It's not switched on for this (odd) page but it is for the next (even) page. So +% the page list should be the next even and odd pages after this +% page. % \begin{macrocode} -\newlength\columnheight + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else % \end{macrocode} -%\begin{macro}{\onecolumninarea} -% "\onecolumn" is in fact a special case of "\onecolumninarea" -% which sets up one \gls{flow} in the specified area, given -% by bottom left corner (\meta{x}, \meta{y}), -% relative to the \gls{typeblock}, with width \meta{w} -% and height \meta{h}. -% The only difference between "\onecolumninarea" and -% explicitly creating the \gls{flow} using "\newflowframe" -% is the "\onecolumninarea" will adjust the vertical height -% the ensure it is a multiple of "\baselineskip". There -% is also no starred version, so if you want a border, you -% will need to set it explicitly using "\setflowframe". -% Syntax:\newline -% \cs{onecolumninarea}\oarg{pages}\marg{w}\marg{h}\marg{x}\marg{y}. +% No, it's even. So it's not on this (even) page, but needs to be on +% for the following (odd) page. % \begin{macrocode} -\newcommand*{\onecolumninarea}{\@onecolumninarea} -\@onlypreamble{\onecolumninarea} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@onecolumninarea} +% Frame is on this page. If this is an odd page, is it on or off on +% the next page? First, is this an odd page? % \begin{macrocode} -\newcommand*{\@onecolumninarea}[5][all]{% -\setlength{\columnheight}{#3}% -\ifffvadjust\adjustheight{\columnheight}\fi% -\@n@wflowframe[#1]{#2}{\columnheight}{#4}{#5}} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumn} -% Set up two \glspl{flow} parallel to each other -% with a distance of "\columnsep" between them, to -% fill the entire \gls{typeblock} (although the frames may -% end up marginally shorter than "\textheight" after -% they have been adjusted.) Again, these commands may only -% be used in the preamble. Note that unlike the standard -% "\twocolumn" command, this one has an optional argument -% that indicates which pages the two \glspl{flow} should -% appear on. Syntax: \cs{twocolumn}\oarg{pages}. +% Yes, it's odd. Is the frame on or off for the next (even) page? % \begin{macrocode} -\renewcommand*{\twocolumn}{\@twocolumn} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@ff@chckifthispg{\count@}{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@twocolumn} +% Frame is off. So the frame is switched on for this (odd) page but +% is off for the next (even) page. So the page list needs to be this +% (odd) page and the following odd page, skipping the even page in +% between. % \begin{macrocode} -\newcommand*{\@twocolumn}[1][all]{% -\@twocolumninarea[#1]{\textwidth}{\textheight}{0pt}{0pt}} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumninarea} -% Again, "\twocolumn" is actually a special case of -% "\twocolumninarea". -% Syntax:\newline -% \cs{twocolumninarea}\oarg{pages}\marg{w}\marg{h}\marg{x}\marg{y}. +% Frame is on. So the frame is switched on for this (odd) page and +% the next (even) page. So the page list needs to be this +% (odd) page, the next even page and the following odd page. % \begin{macrocode} -\newcommand*{\twocolumninarea}{\@twocolumninarea} -\@onlypreamble{\twocolumninarea} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@twocolumninarea} +% Frame is switched on for this page and this page is even. So the +% page list needs to be this (even) page and the next (odd) page. % \begin{macrocode} -\newcommand*{\@twocolumninarea}[5][all]{% - \setlength{\columnheight}{#3}% - \ifffvadjust\adjustheight{\columnheight}\fi% - \setlength{\columnwidth}{#2}% - \addtolength{\columnwidth}{-\columnsep}% - \divide\columnwidth by 2\relax - \setlength{\@ff@tmp@x}{#4}% - \addtolength{\@ff@tmp@x}{\columnwidth}% - \addtolength{\@ff@tmp@x}{\columnsep}% - \iflefttorightcolumns - \@n@wflowframe[#1]{\columnwidth}{\columnheight}{#4}{#5}% - \setflowframe{\c@maxflow}{margin=left}% - \else - \@n@wflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#5}% - \setflowframe{\c@maxflow}{margin=right}% - \fi - \iflefttorightcolumns - \@n@wflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#5}% - \setflowframe{\c@maxflow}{margin=right}% - \else - \@n@wflowframe[#1]{\columnwidth}{\columnheight}{#4}{#5}% - \setflowframe{\c@maxflow}{margin=left}% - \fi -} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi % \end{macrocode} -%\end{macro} -%\begin{macro}{\Ncolumn} -% Again for an aribtrary number of columns (\meta{n}). Syntax: -% \cs{Ncolumn}\oarg{pages}\marg{n}. % \begin{macrocode} -\newcommand*{\Ncolumn}[2][all]{% -\Ncolumninarea[#1]{#2}{\textwidth}{\textheight}{0pt}{0pt}} -\@onlypreamble{\Ncolumn} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\Ncolumninarea} -% Check the number of \glspl{flow} requested, and do one -% of the special cases if available. -% Syntax:\newline -% \cs{Ncolumninarea}\oarg{pages}\marg{n}\marg{w}\marg{h}\marg{x}\marg{y}. +% +%\begin{macro}{\@flowswitchonnextoddonly} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\Ncolumninarea}[6][all]{% -\ifnum#2>2\relax - \@Ncolumninarea[#1]{#2}{#3}{#4}{#5}{#6}% -\else - \ifcase#2\relax - \PackageError{flowfram}{% - You have requested 0 flowframes!}{% - It does not make much sense to ask to create 0 flow frames}% - \or - \onecolumninarea[#1]{#3}{#4}{#5}{#6}% - \or - \twocolumninarea[#1]{#3}{#4}{#5}{#6}% - \else - \PackageError{flowfram}{% - Can't create a negative number of flow frames!}{% - You have asked for \number#2 \space flow frames - which really doesn't make sense}% - \fi -\fi -} - -\@onlypreamble{\Ncolumninarea} +\newcommand{\@flowswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@Ncolumninarea} -% Set up \meta{n} columns in the area specified. -% There is a horizontal distance of "\columnsep" -% between them all. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\@Ncolumninarea}[6][all]{% - \@colN=#2\relax - \advance\@colN by -1\relax - \setlength{\columnwidth}{#3}% - \addtolength{\columnwidth}{-\@colN\columnsep}% - \divide\columnwidth by #2\relax - \setlength{\@ff@tmp@x}{#5}% - \iflefttorightcolumns - \else - \addtolength{\@ff@tmp@x}{#3}% - \addtolength{\@ff@tmp@x}{-\columnwidth}% - \fi - \setlength{\columnheight}{#4}% - \ifffvadjust\adjustheight{\columnheight}\fi% - \@colN=0\relax - \loop - \advance\@colN by 1\relax - \newflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#6}% - \iflefttorightcolumns - \addtolength{\@ff@tmp@x}{\columnwidth}% - \addtolength{\@ff@tmp@x}{\columnsep}% - \else - \addtolength{\@ff@tmp@x}{-\columnwidth}% - \addtolength{\@ff@tmp@x}{-\columnsep}% - \fi - \ifnum\@colN<#2 - \repeat -} + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -% -% Set up something similar but have another frame (of type -% \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 "\Ncolumntop" etc is given by: +% No, it isn't. If this is an odd page, is it on or off on the next +% page? First, is this an odd page? % \begin{macrocode} -\newlength{\vcolumnsep} -\setlength{\vcolumnsep}{\columnsep} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\onecolumntop} -% "\onecolumntop" makes one \gls{flow}, and one \meta{type} -% frame in the area specified, where the \meta{type} frame is -% \meta{H} high. -% The distance between the top frame and the column \gls{flow} -% will be approximately "\vcolumnsep". (The height of \gls{flow} -% may be adjusted to make it an integer multiple of -% "\baselineskip".) -% -% First the special case where the area is the \gls{typeblock}. -% Syntax:\newline -% \cs{onecolumntop}\oarg{pages}\marg{type}\marg{H} +% Yes, it's odd. So this frame isn't on this page, but is it on or +% off on the next page? % \begin{macrocode} -\newcommand*{\onecolumntop}[3][all]{% -\onecolumntopinarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} -\@onlypreamble{\onecolumntop} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@ff@chckifthispg{\count@}{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\onecolumnStop} -% Special case for \gls{static}. -% Syntax: \cs{onecolumnStop}\oarg{pages}\marg{H} +% It's not switched on either on this (odd) page or the next (even) page. So +% the page list should be just the next odd page after this one. % \begin{macrocode} -\newcommand*{\onecolumnStop}[2][all]{% -\onecolumntopinarea[#1]{static}{#2}{\textwidth}{\textheight}{0pt}{0pt}} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\onecolumnDtop} -% Special case for \gls{dynamic}. -% Syntax: \cs{onecolumnDtop}\oarg{pages}\marg{H} +% It's not switched on for this (odd) page but it is for the next (even) page. So +% the page list should be the next even and odd pages after this +% page. % \begin{macrocode} -\newcommand*{\onecolumnDtop}[2][all]{% -\onecolumntopinarea[#1]{dynamic}{#2}{\textwidth}{\textheight}{0pt}{0pt}} + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\newframe} -% Create a frame of given type. -% Syntax:\newline -% \cs{newframe}\oarg{pages}\marg{type}\marg{w}\marg{h}\marg{x}\marg{y}. +% No, it's even. So it's not on this (even) page, but needs to be on +% for the following (odd) page. % \begin{macrocode} -\newcommand*{\newframe}[6][all]{% -\ifthenelse{\equal{#2}{flow}}{% -\@n@wflowframe[#1]{#3}{#4}{#5}{#6}% -}{% -\ifthenelse{\equal{#2}{dynamic}}{% -\@n@wdynamicframe[#1]{#3}{#4}{#5}{#6}}{% -\ifthenelse{\equal{#2}{static}}{% -\@n@wstaticframe[#1]{#3}{#4}{#5}{#6}}{% -\PackageError{flowfram}{Unknown frame type '#2'}{% -Available frame types are: 'flow', 'static' and 'dynamic'}}}}} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\onecolumntopinarea} -% Now for a specified area. -% Syntax:\newline -% \cs{onecolumntopinarea}\oarg{pages}\marg{type}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% Frame is on this page. If this is an odd page, is it on or off on +% the next page? First, is this an odd page? % \begin{macrocode} -\newlength\@ff@staticH - -\newcommand*{\onecolumntopinarea}[7][all]{% -\setlength{\@ff@staticH}{#3}% -\setlength{\@ff@tmp@y}{#5}% -\addtolength{\@ff@tmp@y}{-\@ff@staticH}% -\setlength{\columnheight}{\@ff@tmp@y}% -\addtolength{\columnheight}{-\vcolumnsep}% -\ifffvadjust\adjustheight{\columnheight}\fi% -\addtolength{\@ff@tmp@y}{#7}% -\newframe[#1]{#2}{#4}{\@ff@staticH}{#6}{\@ff@tmp@y}% -\@n@wflowframe[#1]{#4}{\columnheight}{#6}{#7}% -} - -\@onlypreamble{\onecolumntopinarea} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\onecolumnStopinarea} -% Special case for \gls{static}. -% Syntax:\newline -% \cs{onecolumnStopinarea}\oarg{pages}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% Yes, it's odd. Is the frame on or off for the next (even) page? % \begin{macrocode} -\newcommand*{\onecolumnStopinarea}[6][all]{% -\onecolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@ff@chckifthispg{\count@}{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\onecolumnDtopinarea} -% Special case for \gls{dynamic}. -% Syntax:\newline -% \cs{onecolumnDtopinarea}\oarg{pages}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% Frame is off. So the frame is switched on for this (odd) page but +% is off for the next (even) page. So the page list needs to be this +% (odd) page and the following odd page, skipping the even page in +% between. % \begin{macrocode} -\newcommand*{\onecolumnDtopinarea}[6][all]{% -\onecolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumntop} -% Now for two \glspl{flow}, with a single \meta{type} frame -% above both of them. -% Syntax:\newline -% \cs{twocolumntop}\oarg{pages}\marg{type}\marg{H} -% -% First the special case where the area is the entire -% \gls{typeblock}: +% Frame is on. So the frame is switched on for this (odd) page and +% the next (even) page. So the page list needs to be this +% (odd) page, the next even page and the following odd page. % \begin{macrocode} -\newcommand*{\twocolumntop}[3][all]{% -\twocolumntopinarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} -\@onlypreamble{\twocolumntop} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumnStop} -% Special case for \gls{static}. +% Frame is switched on for this page and this page is even. So the +% page list needs to be this (even) page and the next (odd) page. % \begin{macrocode} -\newcommand*{\twocolumnStop}[2][all]{% -\@twocolumntopinarea[#1]{static}{#2}{\textwidth}{\textheight}{0pt}{0pt}} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumnDtop} -% Special case for \gls{dynamic}. % \begin{macrocode} -\newcommand*{\twocolumnDtop}[2][all]{% -\twocolumntop[#1]{dynamic}{#2}} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} % \end{macrocode} %\end{macro} % -% Now for a general area. -%\begin{macro}{\twocolumntopinarea} -% Syntax:\newline -% \cs{twocolumntopinarea}\oarg{pages}\marg{type}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% +%\begin{macro}{\flowswitchoffnextonly} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed flow frames for just the next page % \begin{macrocode} -\newcommand*{\twocolumntopinarea}{\@twocolumntopinarea} -\newcommand*{\@twocolumntopinarea}[7][all]{% - \setlength{\@ff@staticH}{#3}% +\newcommand*{\flowswitchoffnextonly}{% + \@ifstar\@sflowswitchoffnextonly\@flowswitchoffnextonly +} % \end{macrocode} -% work out where to put the static frame -% \begin{macrocode} - \setlength{\@ff@tmp@y}{#5}% - \addtolength{\@ff@tmp@y}{-\@ff@staticH}% - \setlength{\columnheight}{\@ff@tmp@y}% - \addtolength{\@ff@tmp@y}{#7}% - \newframe[#1]{#2}{#4}{\@ff@staticH}{#6}{\@ff@tmp@y}% +%\end{macro} +% +%\begin{macro}{\@sflowswitchoffnextonly} +% The starred version uses \glspl{idl}. +% \begin{macrocode} +\newcommand{\@sflowswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowaddexclusion{\number\ff@id}{\number\count@}% + }% + }% +} % \end{macrocode} -% work out height of the flow frames -% \begin{macrocode} - \addtolength{\columnheight}{-\vcolumnsep}% - \ifffvadjust\adjustheight{\columnheight}\fi +%\end{macro} +% +%\begin{macro}{\@flowswitchoffnextonly} +% The unstarred version uses \glspl{idn}. +% \begin{macrocode} +\newcommand{\@flowswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} % \end{macrocode} -% work out the widths of the flow frames +%\end{macro} +% +%\begin{macro}{\flowswitchoffnextoddonly} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed flow frames for just the next odd page % \begin{macrocode} - \setlength{\columnwidth}{#4}% - \addtolength{\columnwidth}{-\columnsep}% - \divide\columnwidth by 2\relax +\newcommand*{\flowswitchoffnextoddonly}{% + \@ifstar\@sflowswitchoffnextoddonly\@flowswitchoffnextoddonly +} % \end{macrocode} -% work out the offset of the right column +%\end{macro} +% +%\begin{macro}{\@sflowswitchoffnextoddonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} - \setlength{\@ff@tmp@x}{\columnwidth}% - \addtolength{\@ff@tmp@x}{\columnsep}% - \addtolength{\@ff@tmp@x}{#6}% - \iflefttorightcolumns - \@n@wflowframe[#1]{\columnwidth}{\columnheight}{#6}{#7}% - \setflowframe{\c@maxflow}{margin=left}% +\newcommand{\@sflowswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax \else - \@n@wflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#7}% - \setflowframe{\c@maxflow}{margin=right}% + \advance\count@ by 1\relax \fi - \iflefttorightcolumns - \@n@wflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#7}% - \setflowframe{\c@maxflow}{margin=right}% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowaddexclusion{\number\ff@id}{\number\count@}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@flowswitchoffnextoddonly} +% The unstarred version uses \glspl{idn}. +% \begin{macrocode} +\newcommand{\@flowswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax \else - \@n@wflowframe[#1]{\columnwidth}{\columnheight}{#6}{#7}% - \setflowframe{\c@maxflow}{margin=left}% + \advance\count@ by 1\relax \fi + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% } -\@onlypreamble{\twocolumntopinarea} % \end{macrocode} %\end{macro} -%\begin{macro}{\twocolumnStopinarea} -% Special case for \gls{static}. +% +%\begin{macro}{\dynamicswitchonnext} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed dynamic frames from the next page onwards % \begin{macrocode} -\newcommand*{\twocolumnStopinarea}[6][all]{% -\twocolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}} +\newcommand*{\dynamicswitchonnext}{% + \@ifstar\@sdynamicswitchonnext\@dynamicswitchonnext +} % \end{macrocode} %\end{macro} -%\begin{macro}{\twocolumnDtopinarea} -% Special case for \gls{dynamic}. -% \begin{macrocode} -\newcommand*{\twocolumnDtopinarea}[6][all]{% -\twocolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}} +% +%\begin{macro}{\@sdynamicswitchonnext} +% The starred version uses \glspl{idl}. +% \begin{macrocode} +\newcommand{\@sdynamicswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% +% \end{macrocode} +% Is this frame already on? +% \begin{macrocode} + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\Ncolumntop} -% Similarly for an arbitrary number of \glspl{flow}. -% Special case where the area is the \gls{typeblock}. % -% Syntax:\newline -% \cs{Ncolumntop}\oarg{pages}\marg{type}\marg{n}\marg{H} +%\begin{macro}{\@dynamicswitchonnext} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\Ncolumntop}[4][all]{% -\Ncolumntopinarea[#1]{#2}{#3}{#4}{\textwidth}{\textheight}{0pt}{0pt}} -\@onlypreamble{\Ncolumntop} +\newcommand{\@dynamicswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\NcolumnStop} -% Special case for \gls{static}. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\NcolumnStop}[3][all]{% -\Ncolumntop[#1]{static}{#2}{#3}} + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\NcolumnDtop} -% Special case for \gls{dynamic}. -% \begin{macrocode} -\newcommand*{\NcolumnDtop}[3][all]{% -\Ncolumntop[#1]{dynamic}{#2}{#3}} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\Ncolumntopinarea} -% Again test to make sure the user requested a sensible -% number. +% +%\begin{macro}{\dynamicswitchonnextodd} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed dynamic frames from the next odd page onwards % \begin{macrocode} -\newcommand*{\Ncolumntopinarea}[8][all]{% -\ifnum#3>2\relax - \@Ncolumntopinarea[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% -\else - \ifcase#3\relax - \PackageError{flowfram}{% - You have requested 0 flowframes!}{% - It does not make much sense to ask to create 0 flow frames} - \or - \onecolumntopinarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% - \or - \twocolumntopinarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% - \else - \PackageError{flowfram}{% - Can't create a negative number of flow frames!}{% - You have asked for \number#3 \space flow frames - which really doesn't make sense}% - \fi -\fi +\newcommand*{\dynamicswitchonnextodd}{% + \@ifstar\@sdynamicswitchonnextodd\@dynamicswitchonnextodd } -\@onlypreamble{\Ncolumntopinarea} % \end{macrocode} %\end{macro} -%\begin{macro}{\@Ncolumntopinarea} -% Fit the frames into specified area. -% Syntax:\newline -% \cs{Ncolumntopinarea}\oarg{pages}\marg{type}\marg{n}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. -% \begin{macrocode} -\newcommand*{\@Ncolumntopinarea}[8][all]{% - \setlength{\@ff@staticH}{#4}% -% \end{macrocode} -% work out where to put the static frame +% +%\begin{macro}{\@sdynamicswitchonnextodd} +% The starred version uses \glspl{idl}. % \begin{macrocode} - \setlength{\@ff@tmp@y}{#6}% - \addtolength{\@ff@tmp@y}{-\@ff@staticH}% - \setlength{\columnheight}{\@ff@tmp@y}% - \addtolength{\@ff@tmp@y}{#8}% - \newframe[#1]{#2}{#5}{\@ff@staticH}{#7}{\@ff@tmp@y}% +\newcommand{\@sdynamicswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% % \end{macrocode} -% work out height of the flow frames +% Is this frame already on? % \begin{macrocode} - \addtolength{\columnheight}{-\vcolumnsep}% + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi % \end{macrocode} -% adjust the flow frame height so that it is a multiple of -% \cs{baselineskip} +% Is this frame already switched on for the next page? % \begin{macrocode} - \ifffvadjust\adjustheight{\columnheight}\fi% + \@df@chckifthispg[\count@]{\ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% +} % \end{macrocode} -% work out the widths of the flow frames +%\end{macro} +% +%\begin{macro}{\@dynamicswitchonnextodd} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} - \@colN=#3\relax - \advance\@colN by -1\relax - \setlength{\columnwidth}{#5}% - \addtolength{\columnwidth}{-\@colN\columnsep}% - \divide\columnwidth by #3\relax +\newcommand{\@dynamicswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% % \end{macrocode} -% Set the $x$ position of the first frame +% Is this frame already on? % \begin{macrocode} - \setlength{\@ff@tmp@x}{#7}% - \iflefttorightcolumns - \else - \addtolength{\@ff@tmp@x}{#5}% - \addtolength{\@ff@tmp@x}{-\columnwidth}% - \fi - \@colN=0\relax - \loop - \advance\@colN by 1\relax - \newflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#8}% + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi % \end{macrocode} -% work out the offset for the next column +% Is this frame already switched on for the next page? % \begin{macrocode} - \iflefttorightcolumns - \addtolength{\@ff@tmp@x}{\columnwidth}% - \addtolength{\@ff@tmp@x}{\columnsep}% + \@df@chckifthispg[\count@]{\@ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax \else - \addtolength{\@ff@tmp@x}{-\columnwidth}% - \addtolength{\@ff@tmp@x}{-\columnsep}% + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi \fi - \ifnum\@colN<#3 - \repeat + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\NcolumnStopinarea} -% Specific case for \gls{static}. +% +%\begin{macro}{\dynamicswitchoffnext} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed dynamic frames from the next page onwards % \begin{macrocode} -\newcommand*{\NcolumnStopinarea}[7][all]{% -\Ncolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}{#7}} +\newcommand*{\dynamicswitchoffnext}{% + \@ifstar\@sdynamicswitchoffnext\@dynamicswitchoffnext +} % \end{macrocode} %\end{macro} -%\begin{macro}{\NcolumnDtopinarea} -% Specific case for \gls{dynamic}. +% +%\begin{macro}{\@sdynamicswitchoffnext} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\NcolumnDtopinarea}[7][all]{% -\Ncolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}{#7}} +\newcommand{\@sdynamicswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -% Now the same kind of thing but with the \meta{type} frame at the -% bottom. Firstly, a single \gls{flow} with a \meta{type} -% frame below it. -% -%\begin{macro}{\onecolumnbottom} -% Syntax:\newline -% \cs{onecolumnbottom}\oarg{pages}\marg{type}\marg{H} +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\onecolumnbottom}[3][all]{% -\onecolumnbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% +} % \end{macrocode} %\end{macro} -% This command may only be used in the preamble. +% +%\begin{macro}{\@dynamicswitchoffnext} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\@onlypreamble{\onecolumnbottom} +\newcommand{\@dynamicswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\begin{macro}{\onecolumnSbottom} -% Special case for \gls{static}. +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\onecolumnSbottom}[2][all]{% -\onecolumnbottom[#1]{static}{#2}} + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\onecolumnDbottom} -% Special case for \gls{dynamic}. +% +%\begin{macro}{\dynamicswitchoffnextodd} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed dynamic frames from the next odd page onwards % \begin{macrocode} -\newcommand*{\onecolumnDbottom}[2][all]{% -\onecolumnbottom[#1]{dynamic}{#2}} +\newcommand*{\dynamicswitchoffnextodd}{% + \@ifstar\@sdynamicswitchoffnextodd\@dynamicswitchoffnextodd +} % \end{macrocode} %\end{macro} % -% General case of the above, but fit in specified area. -%\begin{macro}{\onecolumnbottominarea} -% Syntax:\newline -% \cs{onecolumnbottominarea}\oarg{pages}\marg{type}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y},\newline -% where \meta{H} is the \meta{type} frame's height. -% The area is defined by bottom -% left co-ordinates (\meta{x}, \meta{y}) width \meta{w}, and -% height \meta{h}. +%\begin{macro}{\@sdynamicswitchoffnextodd} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\onecolumnbottominarea}[7][all]{% - \setlength{\@ff@staticH}{#3}% - \setlength{\columnheight}{#5}% - \addtolength{\columnheight}{-\@ff@staticH}% - \addtolength{\columnheight}{-\vcolumnsep}% - \ifffvadjust\adjustheight{\columnheight}\fi% - \setlength{\@ff@tmp@y}{#5}% - \addtolength{\@ff@tmp@y}{-\columnheight}% - \addtolength{\@ff@tmp@y}{#7}% - \newframe[#1]{#2}{#4}{\@ff@staticH}{#6}{#7}% - \newflowframe[#1]{#4}{\columnheight}{#6}{\@ff@tmp@y}% -} +\newcommand{\@sdynamicswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -% Again, this command may only be used in the preamble. +% Is this frame already off on this page? % \begin{macrocode} -\@onlypreamble{\onecolumnbottominarea} + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\begin{macro}{\onecolumnSbottominarea} -% Special case for \gls{static}. +% It's off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand*{\onecolumnSbottominarea}[6][all]{% -\onecolumnbottominarea[#1]{static}{#2}{#3}{#4}{#5}{#6}} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\onecolumnDbottominarea} -% Special case for \gls{dynamic}. +% This page is even and the frame is off on this page, so set to +% none. % \begin{macrocode} -\newcommand*{\onecolumnDbottominarea}[6][all]{% -\onecolumnbottominarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumnbottom} -% Now for two \glspl{flow} side by side with a static -% frame underneath both of them. Firstly, the specific -% case where the area is the entire \gls{typeblock}. -% Syntax:\newline -% \cs{twocolumnbottom}\oarg{pages}\marg{type}\marg{H}. +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcommand*{\twocolumnbottom}[3][all]{% -\twocolumnSbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} -\@onlypreamble{\twocolumnbottom} + \@df@chckifthispg[\count@]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumnSbottom} -% Special case for \gls{static}. +% Off on the next page as well, so set to none. % \begin{macrocode} -\newcommand*{\twocolumnSbottom}[2][all]{% -\twocolumnbottom[#1]{static}{#2}} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumnDbottom} -% Special case for \gls{dynamic}. +% Not off on the next page, so set to next page only. % \begin{macrocode} -\newcommand*{\twocolumnDbottom}[2][all]{% -\twocolumnbottom[#1]{dynamic}{#2}} + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumnbottominarea} -% Now for a general area. -% Syntax:\newline -% \cs{twocolumnbottominarea}\oarg{pages}\marg{type}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% It's not off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand*{\twocolumnbottominarea}[7][all]{% - \setlength{\@ff@staticW}{#4}% - \setlength{\@ff@staticH}{#3}% + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -% work out height of the flow frames +% This page is even and the frame is not off on this page, so set to +% this page. % \begin{macrocode} - \setlength{\columnheight}{#5}% - \addtolength{\columnheight}{-\@ff@staticH}% - \addtolength{\columnheight}{-\vcolumnsep}% - \ifffvadjust\adjustheight{\columnheight}\fi% - \newframe[#1]{#2}{\@ff@staticW}{\@ff@staticH}{#6}{#7}% + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -% work out the $y$ position of the flow frames +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} - \setlength{\@ff@tmp@y}{#5}% - \addtolength{\@ff@tmp@y}{-\columnheight}% - \addtolength{\@ff@tmp@y}{#7}% + \@df@chckifthispg[\count@]{\ff@id}% + \if@notthiscol % \end{macrocode} -% work out the widths of the flow frames +% Off on the next page but not off on this page. So set to just this +% page. % \begin{macrocode} - \setlength{\columnwidth}{\@ff@staticW}% - \addtolength{\columnwidth}{-\columnsep}% - \divide\columnwidth by 2\relax + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -% work out the $x$ offset of the right column +% Not off on the next page as well, so set to this page and next page. % \begin{macrocode} - \setlength{\@ff@tmp@x}{\columnwidth}% - \addtolength{\@ff@tmp@x}{\columnsep}% - \addtolength{\@ff@tmp@x}{#6}% + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi % \end{macrocode} -% Define the frames % \begin{macrocode} - \iflefttorightcolumns - \newflowframe[#1]{\columnwidth}{\columnheight}{#6}{\@ff@tmp@y}% - \setflowframe{\c@maxflow}{margin=left}% - \else - \newflowframe[#1]{\columnwidth}{\columnheight}% - {\@ff@tmp@x}{\@ff@tmp@y}% - \setflowframe{\c@maxflow}{margin=right}% - \fi - \iflefttorightcolumns - \newflowframe[#1]{\columnwidth}{\columnheight}% - {\@ff@tmp@x}{\@ff@tmp@y}% - \setflowframe{\c@maxflow}{margin=right}% - \else - \newflowframe[#1]{\columnwidth}{\columnheight}{#6}{\@ff@tmp@y}% - \setflowframe{\c@maxflow}{margin=left}% - \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{\@ff@nextpages}% + }% + }% } -\@onlypreamble{\twocolumnbottominarea} % \end{macrocode} %\end{macro} -%\begin{macro}{\twocolumnSbottominarea} -% Special case for \gls{static}. +% +%\begin{macro}{\@dynamicswitchoffnextodd} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\twocolumnSbottominarea}[6][all]{% -\twocolumnbottominarea[#1]{static}{#2}{#3}{#4}{#5}{#6}} +\newcommand{\@dynamicswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\twocolumnDbottominarea} -% Special case for \gls{dynamic}. +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\twocolumnDbottominarea}[6][all]{% -\twocolumnbottominarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}} + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -% Now for an arbitrary number of parallel \glspl{flow} -% with a \gls{static} beneath all of them. -% -%\begin{macro}{\Ncolumnbottom} -% First make them fill the entire \gls{typeblock}. -% Syntax:\newline -% \cs{Ncolumnbottom}\oarg{pages}\marg{type}\marg{H}. +% It's off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand*{\Ncolumnbottom}[4][all]{% -\Ncolumnbottominarea[#1]{#2}{#3}{#4}{\textwidth}{\textheight}{0pt}{0pt}} -\@onlypreamble{\Ncolumnbottom} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\NcolumnSbottom} -% Special case for \gls{static}. +% This page is even and the frame is off on this page, so set to +% none. % \begin{macrocode} -\newcommand*{\NcolumnSbottom}[3][all]{% -\Ncolumnbottom[#1]{static}{#2}{#3}} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\NcolumnDbottom} -% Special case for \gls{dynamic}. +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcommand*{\NcolumnDbottom}[3][all]{% -\Ncolumnbottom[#1]{dynamic}{#2}{#3}} + \@df@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\Ncolumnbottominarea} -% Again check the user has requested a sensible number. +% Off on the next page as well, so set to none. % \begin{macrocode} -\newcommand*{\Ncolumnbottominarea}[8][all]{% -\ifnum#3>2\relax - \@Ncolumnbottominarea[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% -\else - \ifcase#3\relax - \PackageError{flowfram}{% - You have requested 0 flowframes!}{% - It does not make much sense to ask to create 0 flow frames} - \or - \onecolumnbottominarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% - \or - \twocolumnbottominarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% - \else - \PackageError{flowfram}{% - Can't create a negative number of flow frames!}{% - You have asked for \number#3 \space flow frames - which really doesn't make sense}% - \fi -\fi -} -\@onlypreamble{\Ncolumnbottominarea} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@NcolumnSbottominarea} -% An arbitrary number of columns with a \gls{static} -% underneath them all, filling the specified area. +% Not off on the next page, so set to next page only. % \begin{macrocode} -\newcommand*{\@NcolumnSbottominarea}[8][all]{% - \setlength{\@ff@staticH}{#4}% + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else % \end{macrocode} -% work out height of the flow frames +% It's not off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} - \setlength{\columnheight}{#6}% - \addtolength{\columnheight}{-\@ff@staticH}% - \addtolength{\columnheight}{-\vcolumnsep}% + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -% adjust the flow frame height so that it is a multiple of -% \cs{baselineskip} +% This page is even and the frame is not off on this page, so set to +% this page. % \begin{macrocode} - \ifffvadjust\adjustheight{\columnheight}\fi - \newframe[#1]{#2}{#5}{\@ff@staticH}{#7}{#8}% + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -% work out the $y$ offset of the flow frames +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} - \setlength{\@ff@tmp@y}{#6}% - \addtolength{\@ff@tmp@y}{-\columnheight}% - \addtolength{\@ff@tmp@y}{#8}% + \@df@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol % \end{macrocode} -% work out the widths of the flow frames +% Off on the next page but not off on this page. So set to just this +% page. % \begin{macrocode} - \@colN=#3\relax - \advance\@colN by -1\relax - \setlength{\columnwidth}{#5}% - \addtolength{\columnwidth}{-\@colN\columnsep}% - \divide\columnwidth by #3\relax + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -% Set the $x$ offset of the first frame. +% Not off on the next page as well, so set to this page and next page. % \begin{macrocode} - \setlength{\@ff@tmp@x}{#7}% - \iflefttorightcolumns - \else - \addtolength{\@ff@tmp@x}{#5}% - \addtolength{\@ff@tmp@x}{-\columnwidth}% - \fi - \@colN=0\relax - \loop - \advance\@colN by 1\relax - \newflowframe[#1]{\columnwidth}{\columnheight}% - {\@ff@tmp@x}{\@ff@tmp@y}% + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi % \end{macrocode} -% work out the offset for the next column % \begin{macrocode} - \iflefttorightcolumns - \addtolength{\@ff@tmp@x}{\columnwidth}% - \addtolength{\@ff@tmp@x}{\columnsep}% - \else - \addtolength{\@ff@tmp@x}{-\columnwidth}% - \addtolength{\@ff@tmp@x}{-\columnsep}% \fi - \ifnum\@colN<#3 - \repeat + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{\@ff@nextpages}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\NcolumnSbottominarea} -% Specific case for \gls{static}. +% +%\begin{macro}{\dynamicswitchonnextonly} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed dynamic frames for just the next page % \begin{macrocode} -\newcommand*{\NcolumnSbottominarea}[1][all]{% -\Ncolumnbottominarea[#1]{static}} +\newcommand*{\dynamicswitchonnextonly}{% + \@ifstar\@sdynamicswitchonnextonly\@dynamicswitchonnextonly +} % \end{macrocode} %\end{macro} -%\begin{macro}{\NcolumnDbottominarea} -% Specific case for \gls{dynamic}. +% +%\begin{macro}{\@sdynamicswitchonnextonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\NcolumnDbottominarea}[1][all]{% -\Ncolumnbottominarea[#1]{dynamic}} +\newcommand{\@sdynamicswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -%\begin{macro}{\adjustheight} -% Given a height "#1" (a length), adjust it so that it is a multiple of "\baselineskip". +% Is this frame already on? % \begin{macrocode} -\newcount\@ff@adjh -\newcommand*{\adjustheight}[1]{% + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol % \end{macrocode} -% convert to an integer +% Not, it isn't, so just set to the next page: % \begin{macrocode} -\@ff@adjh=#1\relax -\divide\@ff@adjh by \baselineskip\relax -#1=\baselineskip\relax -\multiply#1 by \@ff@adjh\relax -} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{\number\count@}% + }% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\adjustcolsep} -% Adjust the value of "\columnsep" so that the margins will fit between columns. +% Yes, it is, so set to this page and the next page: % \begin{macrocode} -\newcommand*{\adjustcolsep}{% -\multiply\columnsep by 2\relax -\addtolength{\columnsep}{\marginparwidth}} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% +} % \end{macrocode} %\end{macro} % -%\subsubsection{Backdrop Effects} -% Set up some commands to make \glspl{static} for different styles -% of backdrop. -%\begin{macro}{\vtwotone} -% Syntax:\newline -% \cs{vtwotone}\oarg{pages}\oarg{xoffset}\marg{W1}\marg{C1}\marg{L1}\marg{W2}\marg{C2}\marg{L2} -%\newline where the first frame -% has width \meta{W1} with background colour \meta{C1} and label \meta{L1}. -% The second frame has width \meta{W2} with background colour \meta{C2} -% and label \meta{L2}. Unlike earlier commands, the $x$-offset is -% relative to the left page edge \emph{not} the \gls{typeblock}. -% This is because they are designed for backdrops, which -% tend to span the entire page. -% Note that the colour specs must be -% completely enclosed in braces. e.g.\ "{[gray]{0.5}}" \emph{not} "[gray]{0.5}". -% -% Need a length to store the width of the \gls{static}. -% \begin{macrocode} -\newlength\@ff@staticW -% \end{macrocode} -% Vertical two tone effect where the height of the static -% frames is equal to the paper height. +%\begin{macro}{\@dynamicswitchonnextonly} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\vtwotone}[1][all]{% -\def\ff@pages{#1}\@vtwotone} - -\newcommand*{\@vtwotone}[1][0pt]{\@@vtwotonebottom{#1}{\paperheight}} +\newcommand{\@dynamicswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\vtwotonebottom} -% Vertical two tone effect along the bottom of the page, of -% height \meta{H}. -% Syntax:\newline -% \cs{vtwotonebottom}\oarg{pages}\oarg{xoffset}\marg{H}\marg{W1}\marg{C1}\marg{L1}\marg{W2}\marg{C2}\marg{L2} -% where the first frame starts at \meta{xoffset}. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\@@vtwotonebottom}[8]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@x}{#1}% -\addtolength{\@ff@tmp@x@even}{#1}% -\@nextvband{\ff@pages}{#2}{#3}{#4}{#5}% -\@nextvband{\ff@pages}{#2}{#6}{#7}{#8}% -} - -\@onlypreamble{\vtwotone} + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\vtwotonebottom} -% Border strip along the bottom of the page +% Not, it isn't, so just set to the next page: % \begin{macrocode} -\newcommand*{\vtwotonebottom}[1][all]{% -\def\ff@pages{#1}\@vtwotonebottom} - -\@onlypreamble{\vtwotonebottom} - -\newcommand*{\@vtwotonebottom}[2][0pt]{\@@vtwotonebottom{#1}{#2}} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{\number\count@}% + }% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\vtwotonetop} -% Border strip along the top of the page +% Yes, it is, so set to this page and the next page: % \begin{macrocode} -\newcommand*{\vtwotonetop}[1][all]{% -\def\ff@pages{#1}\@vtwotonetop} - -\newcommand*{\@vtwotonetop}[2][0pt]{\@@vtwotonetop{#1}{#2}} - -\newcommand*{\@@vtwotonetop}[8]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computetopedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{-#2}% -\addtolength{\@ff@tmp@x}{#1}% -\addtolength{\@ff@tmp@x@even}{#1}% -\@nextvband{\ff@pages}{#2}{#3}{#4}{#5}% -\@nextvband{\ff@pages}{#2}{#6}{#7}{#8}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@nextvband} -% Make next \gls{static}. Syntax:\newline -% \cs{@nextvband}\marg{pages}\marg{height}\marg{width}\marg{colour specs}\marg{label}\newline -% $x$ and $y$ offsets are given by "\@ff@tmp@x" and "\@ff@tmp@y". -% On exit, "\@ff@tmp@x" is set to the right border. +% +%\begin{macro}{\dynamicswitchonnextoddonly} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed dynamic frames for just the next odd page % \begin{macrocode} -\newcommand*{\@nextvband}[5]{% -\setlength{\@ff@staticW}{#3}% -\ifthenelse{\equal{#5}{}}{% -\newstaticframe[#1]{\@ff@staticW}{#2}{\@ff@tmp@x}{\@ff@tmp@y}}% -{\newstaticframe[#1]{\@ff@staticW}{#2}{\@ff@tmp@x}{\@ff@tmp@y}[#5]}% -\expandafter\global\expandafter\setlength - \csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{% - \@ff@tmp@x@even}% -\@setframecol#4\end{\c@maxstatic}{backcol}{sf}% -\addtolength{\@ff@tmp@x}{\@ff@staticW}% -\addtolength{\@ff@tmp@x@even}{\@ff@staticW}% +\newcommand*{\dynamicswitchonnextoddonly}{% + \@ifstar\@sdynamicswitchonnextoddonly\@dynamicswitchonnextoddonly } % \end{macrocode} %\end{macro} -%\begin{macro}{\vNtone} -% Similarly for N colours. Syntax:\newline -% \cs{vNtone}\oarg{pages}\oarg{xoffset}\marg{n}\marg{W1}\marg{C1}\marg{L1}\ldots\marg{Wn}\marg{Cn}\marg{Ln}\newline -% where the first frame has width \meta{W1} with background -% colour \meta{C1} and label \meta{L1} all the way up to -% the \meta{n}th frame which has width \meta{Wn}, background -% colour \meta{Cn} and \gls{idl} \meta{Ln}. % -% Keep track of which strip we are doing. +%\begin{macro}{\@sdynamicswitchonnextoddonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcount\@thisstrip +\newcommand{\@sdynamicswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% % \end{macrocode} -% This command needs two optional arguments, so store -% first optional argument, and look for the next. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\vNtone}[1][all]{% -\def\ff@pages{#1}\@vNtone} + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@vNtone} -% Got the first argument, now get the next. +% No, it isn't. If this is an odd page, is it on or off on the next +% page? First, is this an odd page? % \begin{macrocode} -\newcommand*{\@vNtone}[2][0pt]{% -\@@vNtone{#1}{#2}{\paperheight}} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@vNtone} -% Vertical \meta{n} tone aligned along the -% bottom of the page with height "#3". +% Yes, it's odd. So this frame isn't on this page, but is it on or +% off on the next page? % \begin{macrocode} -\newcommand*{\@@vNtone}[3]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@x}{#1}% -\addtolength{\@ff@tmp@x@even}{#1}% -\@thisstrip=#2\relax -\setlength{\@ff@staticH}{#3}% -\@nextvNband% -} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@df@chckifthispg[\count@]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@nextvNband} -% Recursively do the next strip. +% It's not switched on either on this (odd) page or the next (even) page. So +% the page list should be just the next odd page after this one. % \begin{macrocode} -\newcommand*{\@nextvNband}{% -\ifnum\@thisstrip>0\relax - \let\flf@next\@@nextvNband -\else - \let\flf@next\relax -\fi -\advance\@thisstrip by -1\relax -\flf@next} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@nextvNband} -% Do current strip, and go on to next one. +% It's not switched on for this (odd) page but it is for the next (even) page. So +% the page list should be the next even and odd pages after this +% page. % \begin{macrocode} -\newcommand*{\@@nextvNband}[3]{% -\@nextvband{\ff@pages}{\@ff@staticH}{#1}{#2}{#3}\@nextvNband} - -\@onlypreamble{\vNtone} + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\vNtonebottom} -% Border strip along the bottom of the page. Same as above -% but user specifies the height. +% No, it's even. So it's not on this (even) page, but needs to be on +% for the following (odd) page. % \begin{macrocode} -\newcommand*{\vNtonebottom}[1][all]{% -\def\ff@pages{#1}\@vNtonebottom} -\@onlypreamble{\vNtonebottom} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@vNtonebottom} +% Frame is on this page. If this is an odd page, is it on or off on +% the next page? First, is this an odd page? % \begin{macrocode} -\newcommand*{\@vNtonebottom}[3][0pt]{% -\@@vNtone{#1}{#2}{#3}} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\vNtonetop} -% Border strip along the top of the page. Again two -% optional arguments are required. Get first optional -% argument. +% Yes, it's odd. Is the frame on or off for the next (even) page? % \begin{macrocode} -\newcommand*{\vNtonetop}[1][all]{% -\def\ff@pages{#1}\@vNtonetop} -\@onlypreamble{\vNtonetop} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@df@chckifthispg[\count@]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@vNtonetop} -% Get next optional argument. +% Frame is off. So the frame is switched on for this (odd) page but +% is off for the next (even) page. So the page list needs to be this +% (odd) page and the following odd page, skipping the even page in +% between. % \begin{macrocode} -\newcommand*{\@vNtonetop}[3][0pt]{% -\@@vNtonetop{#1}{#2}{#3}} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@vNtonetop} -% Now get on with it. Again, it has to be done -% recursively. +% Frame is on. So the frame is switched on for this (odd) page and +% the next (even) page. So the page list needs to be this +% (odd) page, the next even page and the following odd page. % \begin{macrocode} -\newcommand*{\@@vNtonetop}[3]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computetopedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{-#3}% -\addtolength{\@ff@tmp@x}{#1}% -\addtolength{\@ff@tmp@x@even}{#1}% -\@thisstrip=#2\relax -\setlength{\@ff@staticH}{#3}% -\@nextvNband% -} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\htwotone} -% Now do horizontal strips. Syntax:\newline -% \cs{htwotone}\oarg{pages}\oarg{y offset}\marg{H1}\marg{C1}\marg{L1}\marg{H2}\marg{C2}\marg{L2} +% Frame is switched on for this page and this page is even. So the +% page list needs to be this (even) page and the next (odd) page. % \begin{macrocode} -\newcommand*{\htwotone}[1][all]{% -\def\ff@pages{#1}\@htwotone} -% \end{macrocode} -%\end{macro} -%\begin{macro}{\@htwotone} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi % \begin{macrocode} -\newcommand*{\@htwotone}[1][0pt]{\@@htwotoneleft{#1}{\paperwidth}} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@@htwotoneleft} -% This is all done in much the same way as the vertical -% strips. +% +%\begin{macro}{\@dynamicswitchonnextoddonly} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\@@htwotoneleft}[8]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{#1}% -\@nexthband{\ff@pages}{#2}{#3}{#4}{#5}% -\@nexthband{\ff@pages}{#2}{#6}{#7}{#8}% -} - -\@onlypreamble{\htwotone} +\newcommand{\@dynamicswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\htwotoneleft} -% Two tone horizontal strips along left border -% Syntax: \cs{htwotoneleft}\oarg{pages}\oarg{y offset}\marg{width}\marg{H1}\marg{C1}\marg{L1}\marg{H2}\marg{C2}\marg{L2} +% Is this frame already on? % \begin{macrocode} -\newcommand*{\htwotoneleft}[1][all]{% -\def\ff@pages{#1}\@htwotoneleft} -\@onlypreamble{\htwotoneleft} + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@htwotoneleft} +% No, it isn't. If this is an odd page, is it on or off on the next +% page? First, is this an odd page? % \begin{macrocode} -\newcommand*{\@htwotoneleft}[2][0pt]{\@@htwotoneleft{#1}{#2}} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\htwotoneright} -% Two tone horizontal strips along right border +% Yes, it's odd. So this frame isn't on this page, but is it on or +% off on the next page? % \begin{macrocode} -\newcommand*{\htwotoneright}[1][all]{% -\def\ff@pages{#1}\@htwotoneright} -\@onlypreamble{\htwotoneright} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@df@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@htwotoneright} +% It's not switched on either on this (odd) page or the next (even) page. So +% the page list should be just the next odd page after this one. % \begin{macrocode} -\newcommand*{\@htwotoneright}[2][0pt]{\@@htwotoneright{#1}{#2}} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@htwotoneright} +% It's not switched on for this (odd) page but it is for the next (even) page. So +% the page list should be the next even and odd pages after this +% page. % \begin{macrocode} -\newcommand*{\@@htwotoneright}[8]{% -\computerightedgeodd{\@ff@tmp@x}% -\if@twoside - \computerightedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{#1}% -\addtolength{\@ff@tmp@x}{-#2}% -\addtolength{\@ff@tmp@x@even}{-#2}% -\@nexthband{\ff@pages}{#2}{#3}{#4}{#5}% -\@nexthband{\ff@pages}{#2}{#6}{#7}{#8}% -} + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\hNtone} -% Now for \meta{N} coloured horizontal strips +% No, it's even. So it's not on this (even) page, but needs to be on +% for the following (odd) page. % \begin{macrocode} -\newcommand*{\hNtone}[1][all]{% -\def\ff@pages{#1}\@hNtone} -\@onlypreamble{\hNtone} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@hNtone} +% Frame is on this page. If this is an odd page, is it on or off on +% the next page? First, is this an odd page? % \begin{macrocode} -\newcommand*{\@hNtone}[2][0pt]{% -\@@hNtone{#1}{#2}{\paperwidth}} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@hNtone} +% Yes, it's odd. Is the frame on or off for the next (even) page? % \begin{macrocode} -\newcommand*{\@@hNtone}[3]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{#1}% -\@thisstrip=#2\relax -\setlength{\@ff@staticW}{#3}% -\@nexthNband% -} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@df@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\hNtoneleft} -% Now for the N tone strips along the left border +% Frame is off. So the frame is switched on for this (odd) page but +% is off for the next (even) page. So the page list needs to be this +% (odd) page and the following odd page, skipping the even page in +% between. % \begin{macrocode} -\newcommand*{\hNtoneleft}[1][all]{% -\def\ff@pages{#1}\@hNtoneleft} -\@onlypreamble{\hNtoneleft} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@hNtoneleft} +% Frame is on. So the frame is switched on for this (odd) page and +% the next (even) page. So the page list needs to be this +% (odd) page, the next even page and the following odd page. % \begin{macrocode} -\newcommand*{\@hNtoneleft}[3][0pt]{% -\@@hNtone{#1}{#2}{#3}} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\hNtoneright} -% Border strip along the right border +% Frame is switched on for this page and this page is even. So the +% page list needs to be this (even) page and the next (odd) page. % \begin{macrocode} -\newcommand*{\hNtoneright}[1][all]{% -\def\ff@pages{#1}\@hNtoneright} -\@onlypreamble{\hNtoneright} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi % \end{macrocode} -%\end{macro} -%\begin{macro}{\@hNtoneright} % \begin{macrocode} -\newcommand*{\@hNtoneright}[3][0pt]{% -\@@hNtoneright{#1}{#2}{#3}} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@@hNtoneright} +% +% +%\begin{macro}{\dynamicswitchoffnextonly} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed dynamic frames for just the next page % \begin{macrocode} -\newcommand*{\@@hNtoneright}[3]{% -\computerightedgeodd{\@ff@tmp@x}% -\if@twoside - \computerightedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{#1}% -\addtolength{\@ff@tmp@x}{-#3}% -\addtolength{\@ff@tmp@x@even}{-#3}% -\@thisstrip=#2\relax -\setlength{\@ff@staticW}{#3}% -\@nexthNband% +\newcommand*{\dynamicswitchoffnextonly}{% + \@ifstar\@sdynamicswitchoffnextonly\@dynamicswitchoffnextonly } % \end{macrocode} %\end{macro} -%\begin{macro}{\@nexthband} -% Make next \gls{static}. Syntax:\newline -% \cs{@nexthband}\marg{pages}\marg{width}\marg{height}\marg{colour specs}\marg{label}\newline -% $x$ and $y$ offsets are given by "\@ff@tmp@x" and "\@ff@tmp@y". -% On exit, "\@ff@tmp@y" is set to the top border. +% +%\begin{macro}{\@sdynamicswitchoffnextonly} +% The starred version uses \glspl{idl}. +% \begin{macrocode} +\newcommand{\@sdynamicswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicaddexclusion{\number\ff@id}{\number\count@}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dynamicswitchoffnextonly} +% The unstarred version uses \glspl{idn}. +% \begin{macrocode} +\newcommand{\@dynamicswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dynamicswitchoffnextoddonly} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed dynamic frames for just the next odd page % \begin{macrocode} -\newcommand*{\@nexthband}[5]{% -\setlength{\@ff@staticH}{#3}% -\ifthenelse{\equal{#5}{}}{% -\newstaticframe[#1]{#2}{\@ff@staticH}{\@ff@tmp@x}{\@ff@tmp@y}}% -{\newstaticframe[#1]{#2}{\@ff@staticH}{\@ff@tmp@x}{\@ff@tmp@y}[#5]}% -\expandafter\global\expandafter -\setlength\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{% -\@ff@tmp@x@even}% -\@setframecol#4\end{\c@maxstatic}{backcol}{sf}% -\addtolength{\@ff@tmp@y}{\@ff@staticH}% +\newcommand*{\dynamicswitchoffnextoddonly}{% + \@ifstar\@sdynamicswitchoffnextoddonly\@dynamicswitchoffnextoddonly } % \end{macrocode} %\end{macro} -%\begin{macro}{\@nexthNband} -% Get next horizontal strip recursively. +% +%\begin{macro}{\@sdynamicswitchoffnextoddonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@nexthNband}{% -\ifnum\@thisstrip>0\relax - \let\flf@next\@@nexthNband% -\else - \let\flf@next\relax% -\fi -\advance\@thisstrip by -1\relax -\flf@next} +\newcommand{\@sdynamicswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax + \else + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicaddexclusion{\number\ff@id}{\number\count@}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@@nexthNband} +% +%\begin{macro}{\@dynamicswitchoffnextoddonly} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\@@nexthNband}[3]{% -\@nexthband{\ff@pages}{\@ff@staticW}{#1}{#2}{#3}\@nexthNband} +\newcommand{\@dynamicswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax + \else + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\makebackgroundframe} -% Make one big \gls{static} that covers the entire page. -% This command should come before all other commands that create -% \glspl{static}, otherwise it will obscure all the ones defined -% before it. Syntax:\newline -% \cs{makebackgroundframe}\oarg{pages}\oarg{label}. +% +%\begin{macro}{\staticswitchonnext} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed static frames from the next page onwards % \begin{macrocode} -\newcommand*{\makebackgroundframe}[1][all]{% -\ifnum\c@maxstatic>0\relax - \PackageWarning{flowfram}{Background frame is not - first static frame to be defined. All previously defined - static frames may be obscured.}% -\fi -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\newstaticframe[#1]{\paperwidth}{\paperheight}{\@ff@tmp@x}% -{\@ff@tmp@y}% -\expandafter\global\expandafter -\setlength\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname -{\@ff@tmp@x@even}} +\newcommand*{\staticswitchonnext}{% + \@ifstar\@sstaticswitchonnext\@staticswitchonnext +} % \end{macrocode} %\end{macro} % -%\subsubsection{Lines Between Frames} -%\DescribeMacro{\insertvrule} -% Insert a \gls{static} between two frames with a vertical -% 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{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 -% by \meta{y bottom}. +%\begin{macro}{\@sstaticswitchonnext} +% The starred version uses \glspl{idl}. +% \begin{macrocode} +\newcommand{\@sstaticswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% +% \end{macrocode} +% Is this frame already on? +% \begin{macrocode} + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} +% \end{macrocode} +%\end{macro} % -%\begin{macro}{\ffcolumnseprule} -% This has changed in v1.09. Define "\ffcolumnseprule" and use -% instead of "\columnseprule" +%\begin{macro}{\@staticswitchonnext} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newlength\ffcolumnseprule -\setlength{\ffcolumnseprule}{2pt} +\newcommand{\@staticswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% % \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. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\ffruledeclarations}{} + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\insertvrule} -% Determine whether or not the starred version is being -% used. +% +%\begin{macro}{\staticswitchonnextodd} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed static frames from the next odd page onwards % \begin{macrocode} -\newcommand*{\insertvrule}{\@ifstar\@sinsertvrule\@insertvrule} +\newcommand*{\staticswitchonnextodd}{% + \@ifstar\@sstaticswitchonnextodd\@staticswitchonnextodd +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@insertvrule} -% Two optional arguments required. +% +%\begin{macro}{\@sstaticswitchonnextodd} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@insertvrule}[1][0pt]{% -\@ifnextchar[{\@@insertvrule[#1]}{\@@insertvrule[#1][0pt]}} +\newcommand{\@sstaticswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -% Need some lengths: +% Is this frame already on? % \begin{macrocode} -\newlength\@ff@left@x -\newlength\@ff@left@y -\newlength\@ff@left@evenx -\newlength\@ff@left@eveny -\newlength\@ff@left@width -\newlength\@ff@left@height + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi % \end{macrocode} -%\begin{macro}{\@@insertvrule} -% Arguments all accounted for. Convert the frame type -% into a number to make life easier +% Is this frame already switched on for the next page? % \begin{macrocode} -\def\@@insertvrule[#1][#2]#3#4#5#6{% -\ifthenelse{\equal{#3}{flow}}{% -\def\@ff@type@i{1}}{\ifthenelse{\equal{#3}{static}}{% -\def\@ff@type@i{2}}{\ifthenelse{\equal{#3}{dynamic}}{% -\def\@ff@type@i{3}}{\PackageError{flowfram}{Unknown frame -type '#3'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\ifthenelse{\equal{#5}{flow}}{% -\def\@ff@type@ii{1}}{\ifthenelse{\equal{#5}{static}}{% -\def\@ff@type@ii{2}}{\ifthenelse{\equal{#5}{dynamic}}{% -\def\@ff@type@ii{3}}{\PackageError{flowfram}{Unknown frame -type '#5'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\@@insert@vrule{#1}{#2}{\@ff@type@i}{#4}{\@ff@type@ii}{#6}% + \@sf@chckifthispg[\count@]{\ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@@insert@vrule} -% Insert a new \gls{static} between the two specified frames. -% Check to make sure which one is on the left and which one -% is on the right. -% Syntax:\newline -%\cs{@@insert@vrule}\marg{y top}\marg{y bottom}\marg{type ID}\marg{IDN}\marg{type ID}\marg{IDN}. +% +%\begin{macro}{\@staticswitchonnextodd} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\@@insert@vrule}[6]{% -\@ff@getdim{#3}{#4}% -\setlength{\@ff@left@x}{\ffareax}% -\setlength{\@ff@left@y}{\ffareay}% -\setlength{\@ff@left@width}{\ffareawidth}% -\setlength{\@ff@left@height}{\ffareaheight}% -\@ff@getdim{#5}{#6}% -\ifnum\@ff@left@x>\ffareax\relax - \@ff@swaplen{\@ff@left@x}{\ffareax}% - \@ff@swaplen{\@ff@left@y}{\ffareax}% - \@ff@swaplen{\@ff@left@evenx}{\ffareaevenx}% - \@ff@swaplen{\@ff@left@eveny}{\ffareaevenx}% - \@ff@swaplen{\@ff@left@width}{\ffareawidth}% - \@ff@swaplen{\@ff@left@height}{\ffareaheight}% -\fi -\setlength{\@ff@tmp@x}{\@ff@left@x} -\addtolength{\@ff@tmp@x}{\@ff@left@width}% -\setlength{\@ff@staticW}{\ffareax}% -\addtolength{\@ff@staticW}{-\@ff@tmp@x}% -\setlength{\@ff@staticH}{\@ff@left@y}% -\addtolength{\@ff@staticH}{\@ff@left@height}% -\setlength{\@ff@tmp@y}{\ffareay}% -\addtolength{\@ff@tmp@y}{\ffareaheight}% -\ifnum\@ff@tmp@y>\@ff@staticH - \setlength{\@ff@staticH}{\@ff@tmp@y}% -\fi -\ifnum\@ff@left@y<\ffareay\relax - \setlength{\@ff@tmp@y}{\@ff@left@y}% -\else - \setlength{\@ff@tmp@y}{\ffareay}% -\fi -\addtolength{\@ff@staticH}{-\@ff@tmp@y}% -\newstaticframe{\@ff@staticW}{\@ff@staticH}% -{\@ff@tmp@x}{\@ff@tmp@y}% -\addtolength{\@ff@staticH}{#1}% -\addtolength{\@ff@staticH}{#2}% -\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}% -\or \edef\@ff@pages{\csname @df@pages@\romannumeral#4\endcsname}% -\fi -\setstaticframe{\c@maxstatic}{pages=\@ff@pages}% +\newcommand{\@staticswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% % \end{macrocode} -% check the difference between odd and even page co-ordinates -% and shift new frame in same direction. (Assumes the two -% original frames stay in the same relative position.) +% Is this frame already on? +% \begin{macrocode} + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi +% \end{macrocode} +% Is this frame already switched on for the next page? % \begin{macrocode} -\addtolength{\@ff@tmp@x}{\@ff@left@evenx}% -\addtolength{\@ff@tmp@x}{-\@ff@left@x}% -\addtolength{\@ff@tmp@y}{\@ff@left@eveny}% -\addtolength{\@ff@tmp@y}{-\@ff@left@y}% -\setstaticframe{\c@maxstatic}{evenx=\@ff@tmp@x,eveny=\@ff@tmp@y}% + \@sf@chckifthispg[\count@]{\@ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% } % \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{macro}{\staticswitchoffnext} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed static frames from the next page onwards % \begin{macrocode} -\newcommand*{\ffvrule}[3]{% -\hfill \rule[-#1]{#2}{#3}\hfill\mbox{}} +\newcommand*{\staticswitchoffnext}{% + \@ifstar\@sstaticswitchoffnext\@staticswitchoffnext +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@sinsertvrule} -% Starred version. Two optional arguments required. +% +%\begin{macro}{\@sstaticswitchoffnext} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@sinsertvrule}[1][0pt]{% -\@ifnextchar[{\@@sinsertvrule[#1]}{\@@sinsertvrule[#1][0pt]}} +\newcommand{\@sstaticswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@sinsertvrule} -% Find out the frame types and their \gls{idn}. +% Is this frame already off on this page? % \begin{macrocode} -\def\@@sinsertvrule[#1][#2]#3#4#5#6{% -\ifthenelse{\equal{#3}{flow}}{% -\def\@ff@type@i{1}\@flowframeid{#4}\@ff@tmpN=\ff@id}{% -\ifthenelse{\equal{#3}{static}}{% -\def\@ff@type@i{2}\@staticframeid{#4}\@ff@tmpN=\ff@id}{% -\ifthenelse{\equal{#3}{dynamic}}{% -\def\@ff@type@i{3}\@dynamicframeid{#4}\@ff@tmpN=\ff@id}{% -\PackageError{flowfram}{Unknown frame -type '#3'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\ifthenelse{\equal{#5}{flow}}{% -\def\@ff@type@ii{1}\@flowframeid{#6}}{% -\ifthenelse{\equal{#5}{static}}{% -\def\@ff@type@ii{2}\@staticframeid{#6}}{% -\ifthenelse{\equal{#5}{dynamic}}{% -\def\@ff@type@ii{3}\@dynamicframeid{#6}}{% -\PackageError{flowfram}{Unknown frame -type '#5'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\@@insert@vrule{#1}{#2}{\@ff@type@i}{\@ff@tmpN}% -{\@ff@type@ii}{\ff@id}% + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\inserthrule} -% Now for a horizontal rule. Syntax similar to "\insertvrule". -% Determine whether or not the starred version is being -% used. +% +%\begin{macro}{\@staticswitchoffnext} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\inserthrule}{\@ifstar\@sinserthrule\@inserthrule} +\newcommand{\@staticswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@inserthrule} -% Two optional arguments required. +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\@inserthrule}[1][0pt]{% -\@ifnextchar[{\@@inserthrule[#1]}{\@@inserthrule[#1][0pt]}} + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@@inserthrule} -% Arguments all accounted for. Convert the frame type -% into a number to make life easier +% +%\begin{macro}{\staticswitchoffnextodd} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed static frames from the next odd page onwards % \begin{macrocode} -\def\@@inserthrule[#1][#2]#3#4#5#6{% -\ifthenelse{\equal{#3}{flow}}{% -\def\@ff@type@i{1}}{\ifthenelse{\equal{#3}{static}}{% -\def\@ff@type@i{2}}{\ifthenelse{\equal{#3}{dynamic}}{% -\def\@ff@type@i{3}}{\PackageError{flowfram}{Unknown frame -type '#3'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\ifthenelse{\equal{#5}{flow}}{% -\def\@ff@type@ii{1}}{\ifthenelse{\equal{#5}{static}}{% -\def\@ff@type@ii{2}}{\ifthenelse{\equal{#5}{dynamic}}{% -\def\@ff@type@ii{3}}{\PackageError{flowfram}{Unknown frame -type '#5'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\@@insert@hrule{#1}{#2}{\@ff@type@i}{#4}{\@ff@type@ii}{#6}% +\newcommand*{\staticswitchoffnextodd}{% + \@ifstar\@sstaticswitchoffnextodd\@staticswitchoffnextodd } % \end{macrocode} %\end{macro} -%\begin{macro}{\@@insert@hrule} -% Insert a new \gls{static} between the two specified frames. -% Check to make sure which one is on the top and which one -% is on the bottom. -% Syntax:\newline -%\cs{@@insert@hrule}\marg{x left}\marg{x right}\marg{type ID}\marg{IDN}\marg{type ID}\marg{IDN}. +% +%\begin{macro}{\@sstaticswitchoffnextodd} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@@insert@hrule}[6]{% -\@ff@getdim{#3}{#4}% -\setlength{\@ff@left@x}{\ffareax}% -\setlength{\@ff@left@y}{\ffareay}% -\setlength{\@ff@left@width}{\ffareawidth}% -\setlength{\@ff@left@height}{\ffareaheight}% -\@ff@getdim{#5}{#6}% -\ifnum\@ff@left@y>\ffareay\relax - \@ff@swaplen{\@ff@left@x}{\ffareax}% - \@ff@swaplen{\@ff@left@y}{\ffareay}% - \@ff@swaplen{\@ff@left@width}{\ffareawidth}% - \@ff@swaplen{\@ff@left@height}{\ffareaheight}% -\fi -\setlength{\@ff@tmp@y}{\@ff@left@y}% -\addtolength{\@ff@tmp@y}{\@ff@left@height}% -\setlength{\@ff@staticH}{\ffareay}% -\addtolength{\@ff@staticH}{-\@ff@tmp@y}% -\setlength{\@ff@staticW}{\@ff@left@x}% -\addtolength{\@ff@staticW}{\@ff@left@width}% -\setlength{\@ff@tmp@x}{\ffareax}% -\addtolength{\@ff@tmp@x}{\ffareawidth}% -\ifnum\@ff@tmp@x>\@ff@staticW\relax - \setlength{\@ff@staticW}{\@ff@tmp@x}% -\fi -\ifnum\@ff@left@x<\ffareax\relax - \setlength{\@ff@tmp@x}{\@ff@left@x}% -\else - \setlength{\@ff@tmp@x}{\ffareax}% -\fi -\addtolength{\@ff@staticW}{-\@ff@tmp@x}% -\newstaticframe{\@ff@staticW}{\@ff@staticH}% -{\@ff@tmp@x}{\@ff@tmp@y}% -\addtolength{\@ff@staticW}{#1}% -\addtolength{\@ff@staticW}{#2}% -\setstaticcontents{\c@maxstatic}{% -\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}% -\or \edef\@ff@pages{\csname @df@pages@\romannumeral#4\endcsname}% -\fi -\setstaticframe{\c@maxstatic}{pages=\@ff@pages}% -\addtolength{\@ff@tmp@x}{\@ff@left@evenx}% -\addtolength{\@ff@tmp@x}{-\@ff@left@x}% -\addtolength{\@ff@tmp@y}{\@ff@left@eveny}% -\addtolength{\@ff@tmp@y}{-\@ff@left@y}% -\setstaticframe{\c@maxstatic}{evenx=\@ff@tmp@x,eveny=\@ff@tmp@y}% -} +\newcommand{\@sstaticswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% % \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} +% Is this frame already off on this page? % \begin{macrocode} -\newcommand*{\ffhrule}[3]{% -\hspace*{-#1}\rule{#2}{#3}} + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@sinserthrule} -% Starred version. Two optional arguments required. +% It's off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand*{\@sinserthrule}[1][0pt]{% -\@ifnextchar[{\@@sinserthrule[#1]}{\@@sinserthrule[#1][0pt]}} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@sinserthrule} -% Find out the frame types and their \gls{idn}. +% This page is even and the frame is off on this page, so set to +% none. % \begin{macrocode} -\def\@@sinserthrule[#1][#2]#3#4#5#6{% -\ifthenelse{\equal{#3}{flow}}{% -\def\@ff@type@i{1}\@flowframeid{#4}\@ff@tmpN=\ff@id}{% -\ifthenelse{\equal{#3}{static}}{% -\def\@ff@type@i{2}\@staticframeid{#4}\@ff@tmpN=\ff@id}{% -\ifthenelse{\equal{#3}{dynamic}}{% -\def\@ff@type@i{3}\@dynamicframeid{#4}\@ff@tmpN=\ff@id}{% -\PackageError{flowfram}{Unknown frame -type '#3'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\ifthenelse{\equal{#5}{flow}}{% -\def\@ff@type@ii{1}\@flowframeid{#6}}{% -\ifthenelse{\equal{#5}{static}}{% -\def\@ff@type@ii{2}\@staticframeid{#6}}{% -\ifthenelse{\equal{#5}{dynamic}}{% -\def\@ff@type@ii{3}\@dynamicframeid{#6}}{% -\PackageError{flowfram}{Unknown frame -type '#5'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\@@insert@hrule{#1}{#2}{\@ff@type@i}{\@ff@tmpN}% -{\@ff@type@ii}{\ff@id}% -} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -% -% \subsection{Putting Chapter Headings in Dynamic Frames} -%\begin{macro}{\dfchaphead} -% Provide facility to make chapter headings appear -% in specified \gls{dynamic}. -% I originally called this macro "\putchapterheadingsindynamicframe" -% which was descriptive, but overly long, so I changed it -% to the rather more cryptic name "\dfchaphead". -% If the starred form is used, the frame is identified by \gls{idl}, -% the unstarred form identifies the frame \gls{idn}. +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcommand*{\dfchaphead}{% -\@ifstar\@sdynamicchap\@dynamicchap} + \@sf@chckifthispg[\count@]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -% Define style for the chapter heading. These commands -% are should only be used when "\dfchaphead" has been used. -%\begin{macro}{\DFchapterstyle} +% Off on the next page as well, so set to none. % \begin{macrocode} -\newcommand{\DFchapterstyle}[1]{#1} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\DFschapterstyle} +% Not off on the next page, so set to next page only. % \begin{macrocode} -\newcommand{\DFschapterstyle}[1]{#1} + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@dynamicchap} -% Unstarred version. +% It's not off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand{\@dynamicchap}[1]{% -\@ifundefined{chapter}{\PackageError{flowfram}{Chapters aren't -defined}{The document -class you are using does not define chapters}}{% -\let\@ff@OLDmakechapterhead\@makechapterhead -\let\@ff@OLDmakeschapterhead\@makeschapterhead -\renewcommand{\DFchapterstyle}[1]{\@ff@OLDmakechapterhead{##1}}% -\renewcommand{\DFschapterstyle}[1]{\@ff@OLDmakeschapterhead{##1}}% -% -\xdef\@makechapterhead##1{% -\noexpand\@setdynamiccontents{\number#1}{% -\noexpand\DFchapterstyle{##1}}}% -\xdef\@makeschapterhead##1{% -\noexpand\@setdynamiccontents{\number#1}{% -\noexpand\DFschapterstyle{##1}}}% -}} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\@sdynamicchap} -% Starred form. +% This page is even and the frame is not off on this page, so set to +% this page. % \begin{macrocode} -\newcommand{\@sdynamicchap}[1]{% -\@dynamicframeid{#1}\@dynamicchap{\ff@id}} + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -%\end{macro} -% There is no facility for placing other sectional types -% in \glspl{dynamic}. This is because, either (1) the sectioning -% command does not start a new page, in which case there -% is no way of telling where exactly the new section will start, -% and having a section title in some other location on the -% page is ambiguous, and would really confuse the reader, or -% (2) in the case of "\part" in report or book class files, the -% title appears on a page of its own, so where is the point in -% putting it in a \gls{dynamic}? -% -%\subsection{Thumbtabs} -% Define counter to keep track of total number of -% thumbtabs. +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcounter{maxthumbtabs} + \@sf@chckifthispg[\count@]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\begin{macro}{\defaultthumbtabtype} -% Check to see if chapters are defined, if they are make -% thumbtabs correspond to chapters, otherwise make -% thumbtabs correspond to sections. +% Off on the next page but not off on this page. So set to just this +% page. % \begin{macrocode} -\@ifundefined{chapter}{% -\newcommand*{\defaultthumbtabtype}{section}}{ -\newcommand*{\defaultthumbtabtype}{chapter} -} + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ttb@type} -% Section type to assign to thumbtabs. +% Not off on the next page as well, so set to this page and next page. % \begin{macrocode} -\newcommand*{\@ttb@type}{\defaultthumbtabtype} + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi % \end{macrocode} -%\end{macro} -%\begin{macro}{\makethumbtabs} -% Make the thumbtabs. Read in information from ".ttb" -% file, and open it for output. -% Syntax:\newline -% \cs{makethumbtabs}\oarg{y offset}\marg{height}\oarg{sec type}. -% -% First check to see if there is a second optional argument. % \begin{macrocode} -\newcommand*{\makethumbtabs}[2][0pt]{% -\@ifnextchar[{\@makethumbtabs[#1]{#2}}{% -\@makethumbtabs[#1]{#2}[\defaultthumbtabtype]}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{\@ff@nextpages}% + }% + }% } % \end{macrocode} %\end{macro} -%\begin{macro}{\@makethumbtabs} -% Now all arguments are known, first redefine the -% appropriate sectioning command, then input the ttb file, -% and create the thumbtabs. +% +%\begin{macro}{\@staticswitchoffnextodd} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\def\@makethumbtabs[#1]#2[#3]{% -\@ifundefined{#3}{\PackageError{flowfram}{% -Unknown section type '#3'}{}}{% -\renewcommand{\@ttb@type}{#3}% -\ifthenelse{\equal{#3}{chapter}}{\@makethumbchapter}{% -\ifthenelse{\equal{#3}{part}}{\@makethumbpart}{% -\@makethumbsection{#3}}}} -\@starttoc{ttb}% -\@dothumbtabs{#1}{#2}% -} +\newcommand{\@staticswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@makethumbchapter} -% If thumbtabs correspond to chapters, redefine "\@chapter" -% so that each unstarred chapter writes an entry to the -% ".ttb" file. +% Is this frame already off on this page? % \begin{macrocode} -\newcommand{\@makethumbchapter}{ -\let\@ttb@old@chapter\@chapter -\def\@chapter[##1]##2{% -\@ttb@old@chapter[##1]{##2}% -\addtocontents{ttb}{\protect\thumbtab - {\thepage}{\thechapter}{##1}{chapter.\thechapter}}% -\@afterheading -}} + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@makethumbpart} -% For parts in books or reports, the thumbtab needs to be -% saved after the part counter has been incremented, but -% before the page break so that the page number and part -% numbers are correct. If "\@endpart" is not defined, then -% the document class probably does not start a new page after -% "\part". (This can't be guaranteed for non standard class -% files, but there's nothing that can be done about that.) -% If this happens, just redefine "\@part", and hope for the -% best. +% It's off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\newcommand{\@makethumbpart}{ -\let\@ttb@old@part\@part -\@ifundefined{@endpart}{% -\def\@part[##1]##2{\@ttb@old@part[##1]{##2}% -\addtocontents{ttb}{\protect\thumbtab - {\thepage}{\thepart}{##1}{part.\thepage}}% -\@afterheading}}{% -\let\@ttb@old@endpart\@endpart -\def\@part[##1]##2{% -\def\@parttitle{##1}% -\@ttb@old@part[##1]{##2}% -}% -\def\@endpart{% -\addtocontents{ttb}{% -\protect\thumbtab{\thepage}% -{\thepart}{\@parttitle}{part.\thepage}}% -\@ttb@old@endpart -}}} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\@makethumbsection} -% Thumbtabs defined for one of the remaining standard -% sectioning commands. Since these commands use -% "\@startsection", it is necessary to redefine -% "\@sect" to add the thumbtab information to the .ttb file. +% This page is even and the frame is off on this page, so set to +% none. % \begin{macrocode} -\newcommand*{\@makethumbsection}[1]{% -\let\@ttb@old@sect=\@sect -\def\@sect##1##2##3##4##5##6[##7]##8{% -\@ttb@old@sect{##1}{##2}{##3}{##4}{##5}{##6}[##7]{##8}% -\ifthenelse{\equal{##1}{#1}}{% -\addtocontents{ttb}{% -\protect\thumbtab{\thepage}{\csname the#1\endcsname}% -{##7}{#1.\csname the#1\endcsname}}% -\@afterheading}{}% -}} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\thumbtab} -% The thumbtab file, ".ttb", will have a series of "\thumbtab" -% commands, when this file is read in, just store the -% information for now. +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\newcommand{\thumbtab}[4]{% -\stepcounter{maxthumbtabs}% -\expandafter -\gdef\csname thumbtab@pages@\romannumeral\c@maxthumbtabs\endcsname -{#1}% -\expandafter -\gdef\csname thumbtab@num@\romannumeral\c@maxthumbtabs\endcsname -{#2}% -\expandafter -\gdef\csname thumbtab@title@\romannumeral\c@maxthumbtabs\endcsname -{#3}% -\expandafter -\gdef\csname thumbtab@link@\romannumeral\c@maxthumbtabs\endcsname -{#4}} + \@sf@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@dothumbtabs} -% Once the thumbtab information has been read in and stored -% in the thumbtab macros, create the thumbtabs using this -% information. First need to work out the \glspl{pgrange} between -% each thumbtab. If the following thumbtab starts on the -% same page as the previous one, leave the page varable -% as a single number (this may happen if the thumbtabs -% correspond to sections rather than chapters). If the -% following thumbtab starts on a different page to the -% one before it, the preceding thumbtab page variable so -% be a range from its own initial page up to the page before -% the next thumbtab starts. The final thumbtab has an open -% ended range. This final thumbtab will continue to be displayed -% until cancelled by "\disablethumbtabs". -% -% Syntax: \cs{@dothumbtabs}\marg{y offset}\marg{height}. +% Off on the next page as well, so set to none. % \begin{macrocode} -\newcommand*{\@dothumbtabs}[2]{% -\@colN=0\relax -\whiledo{\@colN<\c@maxthumbtabs}{% - \advance\@colN by 1\relax - \edef\ff@pages{% - \csname thumbtab@pages@\romannumeral\@colN\endcsname}% - \ifnum\@colN=\c@maxthumbtabs - \expandafter - \xdef\csname thumbtab@pages@\romannumeral\@colN\endcsname{% - \ff@pages,>\ff@pages}% - \else - \advance\@colN by 1\relax - \edef\ff@endpage{% - \csname thumbtab@pages@\romannumeral\@colN\endcsname}% - \advance\@colN by -1\relax - \@ff@tmpN=\ff@endpage\relax - \advance\@ff@tmpN by -1\relax - \ifnum\@ff@tmpN>\ff@pages - \expandafter - \xdef\csname thumbtab@pages@\romannumeral\@colN\endcsname{% - \ff@pages-\number\@ff@tmpN}% - \fi - \fi -}% -\@@dothumbtabs{#1}{#2}% -} + \def\@ff@nextpages{none}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\thumbtabwidth} -% Default thumbtab width. +% Not off on the next page, so set to next page only. % \begin{macrocode} -\newlength{\thumbtabwidth} -\setlength{\thumbtabwidth}{1cm} + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\thumbtabindexformat} -% Thumbtab format. If hyperlinks have been defined, -% use a hyperlink in the thumbtab index. -% Syntax: \cs{thumbtabindexformat}\marg{link}\marg{text}\marg{height} +% It's not off on this page. Is it on or off on the next page, if this +% page is odd? First, is this page odd? % \begin{macrocode} -\@ifundefined{hyperlink}{% -\newcommand{\thumbtabindexformat}[3]{% -\thumbtabformat{#2}{#3}}}{% -\newcommand{\thumbtabindexformat}[3]{% -\hyperlink{#1}{\thumbtabformat{#2}{#3}}} -} + \ifnum\@ff@pages@countreg=\count@\relax % \end{macrocode} -%\end{macro} -%\begin{macro}{\thumbtabformat} -% Individual thumbtab format. If rotating has -% been disabled, stack the letters vertically (this -% doesn't look very good). -% Syntax: \cs{thumbtabformat}\marg{text}\marg{height} +% This page is even and the frame is not off on this page, so set to +% this page. % \begin{macrocode} -\newcommand{\thumbtabformat}[2]{% -\if@ttb@rotate -\rotatebox{-90}{\parbox[c][\thumbtabwidth]{#2}{% -\centering#1}}% -\else -\parbox[c][#2]{\thumbtabwidth}{% -\centering\@ttb@stack{#1}}% -\fi} + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@flf@subsp} -% Substitute spaces for \cs{space}. Stores resulting text in -% \cs{@flf@subsptext} which should be set to empty before use. -%\changes{1.10}{2007/08/21}{new} +% This page is odd. Is the frame on or off on the next page? % \begin{macrocode} -\def\@flf@subsp#1 #2{% -\expandafter\flf@ta\expandafter{\@flf@subsptext}% -\flf@tb{#1}% -\edef\@flf@subsptext{\the\flf@ta\the\flf@tb}% -\def\@flf@tmp{#2}% -\ifx\@flf@tmp\@nnil - \let\@flf@donextsubsp=\@gobble -\else - \expandafter\flf@ta\expandafter{\@flf@subsptext}% - \edef\@flf@subsptext{\the\flf@ta\noexpand\space}% - \let\@flf@donextsubsp=\@flf@subsp -\fi -\@flf@donextsubsp{#2}% -} + \@sf@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ttb@stack} -% Stack letters vertically. -% Any spaces first need to be substituted -% with \cs{space}, otherwise they will be ignored. -%\changes{1.10}{2007/08/21}{spaces now replaced with \cs{space}} +% Off on the next page but not off on this page. So set to just this +% page. % \begin{macrocode} -\newcommand{\@ttb@stack}[1]{% -\def\@flf@subsptext{}% -\expandafter\@flf@subsp#1 \@nil\relax -\begin{tabular}{l}% -\expandafter\@@ttb@stack\@flf@subsptext\@nil\relax -\end{tabular}} + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@ttb@stack} -%\changes{1.10}{2007/08/21}{now uses \cs{mbox}} +% Not off on the next page as well, so set to this page and next page. % \begin{macrocode} -\def\@@ttb@stack#1#2{% -\def\@flf@tmp{#1}% -\ifx\@flf@tmp\@nnil - \let\flf@next\relax -\else - #1\\% - \def\@flf@tmp{#2}% - \ifx\@nnil#2\relax - \let\flf@next\@gobble - \else - \let\flf@next\@@ttb@stack - \fi -\fi -\flf@next{#2}} + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi +% \end{macrocode} +% \begin{macrocode} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{\@ff@nextpages}% + }% + }% +} % \end{macrocode} %\end{macro} % -%\begin{macro}{\@greyscale} -% Count register to compute the grey scale. +%\begin{macro}{\staticswitchonnextonly} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed static frames for just the next page % \begin{macrocode} -\newcount\@greyscale +\newcommand*{\staticswitchonnextonly}{% + \@ifstar\@sstaticswitchonnextonly\@staticswitchonnextonly +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@@dothumbtabs} -% Once the \gls{pgrange} have been sorted, create the -% \glspl{dynamic} associated with each thumbtab. -% Thumbtabs will initially have a grey background, but -% this can be changed by the user. Each thumbtab is given -% an \gls{idl} "thumbtab"\meta{n} where \meta{n} is the index of -% the thumbtab (starting from 1 for the topmost thumbtab.) -% Each frame in the thumbtab index is given an \gls{idl} -% "thumbtabindex"\meta{n}, where \meta{n} is as before. +% +%\begin{macro}{\@sstaticswitchonnextonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand{\@@dothumbtabs}[2]{% -\setlength{\@ff@tmp@y}{\textheight}% -\addtolength{\@ff@tmp@y}{-#2}% -\addtolength{\@ff@tmp@y}{-#1}% -\computerightedgeodd{\@ff@tmp@x}% -\addtolength{\@ff@tmp@x}{-\thumbtabwidth}% -\computeleftedgeeven{\@ff@tmp@x@even}% -\@ff@tmpN=0\relax -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% - \advance\@ff@tmpN by 1\relax - \@greyscale=\@ff@tmpN\relax - \multiply\@greyscale by 60\relax - \divide\@greyscale by \c@maxthumbtabs - \advance\@greyscale by 25\relax - \edef\@ff@greyscale{0.\number\@greyscale}% +\newcommand{\@sstaticswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% % \end{macrocode} -% Thumbtab +% Is this frame already on? % \begin{macrocode} - \newdynamicframe[none]{\thumbtabwidth}{#2}% - {\@ff@tmp@x}{\@ff@tmp@y}[thumbtab\number\@ff@tmpN]% - \expandafter\global\expandafter - \setlength\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname - {\@ff@tmp@x@even}% + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol % \end{macrocode} -% set the contents of the dynamic frame +% Not, it isn't, so just set to the next page: % \begin{macrocode} - \ifthenelse{\boolean{@ttb@title}\and\boolean{@ttb@num}}{% - \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabformat{% - \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname\ - \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - }{% - \if@ttb@title - \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabformat{% - \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - \fi - \if@ttb@num - \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabformat{% - \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname - }{#2}}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{\number\count@}% + }% + \else +% \end{macrocode} +% Yes, it is, so set to this page and the next page: +% \begin{macrocode} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% \fi }% - \expandafter - \xdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname - {[gray]{\@ff@greyscale}} +} % \end{macrocode} -% Thumbtab index +%\end{macro} +% +%\begin{macro}{\@staticswitchonnextonly} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} - \newdynamicframe[none]{\thumbtabwidth}{#2}% - {\@ff@tmp@x}{\@ff@tmp@y}[thumbtabindex\number\@ff@tmpN]% - \expandafter\global\expandafter - \setlength\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname - {\@ff@tmp@x@even}% - \expandafter +\newcommand{\@staticswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% % \end{macrocode} -% set the contents of the dynamic frame +% Is this frame already on? % \begin{macrocode} - \ifthenelse{\boolean{@ttb@title}\and\boolean{@ttb@num}}{% - \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabindexformat{% - \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname}{% - \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname\ - \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - }{% - \if@ttb@title - \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabindexformat{% - \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname}{% - \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - \fi - \if@ttb@num - \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabindexformat{% - \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname}{% - \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname - }{#2}}% + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol +% \end{macrocode} +% Not, it isn't, so just set to the next page: +% \begin{macrocode} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{\number\count@}% + }% + \else +% \end{macrocode} +% Yes, it is, so set to this page and the next page: +% \begin{macrocode} + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% \fi }% - \expandafter - \xdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname - {[gray]{\@ff@greyscale}} - \addtolength{\@ff@tmp@y}{-#2}% -}% -}% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\enablethumbtabs} -% Enable thumbtabs. Once the \gls{idn} is obtained for the -% first thumbtab, the rest can be found by incrementing the -% number by 2 (the frames in between correspond to the -% thumbtab index.) +% +%\begin{macro}{\staticswitchonnextoddonly} +%\changes{1.14}{2012-11-10}{new} +% Switch on the listed static frames for just the next odd page % \begin{macrocode} -\newcommand*{\enablethumbtabs}{% -\ifnum\c@maxthumbtabs>0 -\@ff@tmpN=0\relax -\@dynamicframeid{thumbtab1}% -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax +\newcommand*{\staticswitchonnextoddonly}{% + \@ifstar\@sstaticswitchonnextoddonly\@staticswitchonnextoddonly +} % \end{macrocode} -% thumbtab +%\end{macro} +% +%\begin{macro}{\@sstaticswitchonnextoddonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\edef\@ff@pages{\csname thumbtab@pages@\romannumeral\@ff@tmpN\endcsname}% -\@@setdynamicframe{\ff@id}{pages=\@ff@pages}% -\advance\ff@id by 2\relax -}% -\else\PackageWarning{flowfram}{No thumb tabs defined}\fi} +\newcommand{\@sstaticswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% % \end{macrocode} -%\end{macro} -%\begin{macro}{\disablethumbtabs} -% Disable all thumbtabs. +% Is this frame already on? % \begin{macrocode} -\newcommand*{\disablethumbtabs}{% -\ifnum\c@maxthumbtabs>0 -\@ff@tmpN=0\relax -\@dynamicframeid{thumbtab1}% -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol % \end{macrocode} -%thumbtab +% No, it isn't. If this is an odd page, is it on or off on the next +% page? First, is this an odd page? % \begin{macrocode} -\expandafter\xdef\csname @df@pages@\romannumeral\ff@id\endcsname -{none}% -\advance\ff@id by 1\relax + \ifodd\@ff@pages@countreg % \end{macrocode} -%thumbtab index +% Yes, it's odd. So this frame isn't on this page, but is it on or +% off on the next page? % \begin{macrocode} -\expandafter\xdef\csname @df@pages@\romannumeral\ff@id\endcsname -{none}% -\advance\ff@id by 1\relax -}\fi} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@sf@chckifthispg[\count@]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\thumbtabindex} -% Show thumbtab index on current page. -% The "\@ff@doafter" bit circumvents the problem of duplicate page -% numbers, as the table of contents -% is quite frequently on page i while the first chapter starts on page 1. +% It's not switched on either on this (odd) page or the next (even) page. So +% the page list should be just the next odd page after this one. % \begin{macrocode} -\newcommand*{\thumbtabindex}{% -\ifnum\c@maxthumbtabs>0\relax -\@ff@tmpN=0\relax -\@dynamicframeid{thumbtabindex1}% -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax -\expandafter -\xdef\csname @df@pages@\romannumeral\ff@id\endcsname{\c@page}% -\edef\@ff@doafter{% -\noexpand\afterpage{% -\noexpand\setdynamicframe{\number\ff@id}{pages=none}}} -\@ff@doafter -\advance\ff@id by 2\relax -}\fi} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\setthumbtab} -% Modify the settings for all the thumbtabs (including thumbtab -% index). Since the thumbtabs are \glspl{dynamic} -% you could just use "\setdynamicframe", however, the thumbtabs -% will not be generated on the first run, as there will be no -% information in the ttb file, so "\setdynamicframe" would -% generate an error. "\setthumbtab" will only give -% a warning message if it can not find the thumbtab. -% The argument "#1" is the index of the thumbtab (starting -% from 1), the second argument "#2" is the -% frame settings. +% It's not switched on for this (odd) page but it is for the next (even) page. So +% the page list should be the next even and odd pages after this +% page. % \begin{macrocode} -\newcommand{\setthumbtab}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\@ff@tmpN=0\relax -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax -\@setthumbtab{\@ff@tmpN}{#2}}}{% -\@for\@ttb@id:=#1\do{\@setthumbtab{\@ttb@id}{#2}}}} + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@setthumbtab} -% Set individual thumbtab and its index tab. +% No, it's even. So it's not on this (even) page, but needs to be on +% for the following (odd) page. % \begin{macrocode} -\newcommand{\@setthumbtab}[2]{% -% check if this thumbtab exists -\ifthenelse{\(\c@maxthumbtabs<#1\) \or \(#1<1\)}{% -\PackageWarning{flowfram}{Can't find thumbtab number '#1', -ttb file may not be up-to-date}}{% -\@dynamicframeid{thumbtab\number#1}% -\@@setdynamicframe{\ff@id}{#2}% -\@dynamicframeid{thumbtabindex\number#1}% -\@@setdynamicframe{\ff@id}{#2}}} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\setthumbtabindex} -% Only change settings for the thumbtab index. This can -% take a comma-separated number list. +% Frame is on this page. If this is an odd page, is it on or off on +% the next page? First, is this an odd page? % \begin{macrocode} -\newcommand{\setthumbtabindex}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\@ff@tmpN=0\relax -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax -\@setthumbtabindex{\@ff@tmpN}{#2}}}{% -\@for\@ttb@id:=#1\do{\@setthumbtabindex{\@ttb@id}{#2}}}} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\@setthumbtabindex} -% Change setting for individual thumbtab index entry. +% Yes, it's odd. Is the frame on or off for the next (even) page? % \begin{macrocode} -\newcommand{\@setthumbtabindex}[2]{% -% check if this thumbtab exists -\ifthenelse{\(\c@maxthumbtabs<#1\) \or \(#1<1\)}{% -\PackageWarning{flowfram}{Can't find thumbtab number `\number#1', -ttb file may not be up-to-date}}{% -\@dynamicframeid{thumbtabindex\number#1}% -\@@setdynamicframe{\ff@id}{#2}}} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@sf@chckifthispg[\count@]{\ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\tocandhumbtabindex} -% Do both the table of contents and the thumbtab index +% Frame is off. So the frame is switched on for this (odd) page but +% is off for the next (even) page. So the page list needs to be this +% (odd) page and the following odd page, skipping the even page in +% between. % \begin{macrocode} -\newcommand*{\tocandthumbtabindex}{% -\aligntoctrue -\tableofcontents -\thumbtabindex -\aligntocfalse + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else +% \end{macrocode} +% Frame is on. So the frame is switched on for this (odd) page and +% the next (even) page. So the page list needs to be this +% (odd) page, the next even page and the following odd page. +% \begin{macrocode} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else +% \end{macrocode} +% Frame is switched on for this page and this page is even. So the +% page list needs to be this (even) page and the next (odd) page. +% \begin{macrocode} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi +% \end{macrocode} +% \begin{macrocode} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% } % \end{macrocode} %\end{macro} % -% \subsection{Minitocs} -%\begin{macro}{\@ttb@minitoctype} -% Sectioning type for the minitoc, by default it is the -% same as the thumbtabs +%\begin{macro}{\@staticswitchonnextoddonly} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\@ttb@minitoctype}{\@ttb@type} +\newcommand{\@staticswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@starttoc} -% In order to align the table of contents with the thumbtabs, -% or to use minitocs, the toc information must be stored, -% rather than simply input. -% Therefore, modify "\@starttoc" so that it can store the contents -% of the file. "\if@storetoc" is used to determine whether -% to store the contents, or act as normal. +% Is this frame already on? % \begin{macrocode} -\let\@ttb@old@starttoc\@starttoc -\newif\if@storetoc -\@storetocfalse -\renewcommand*{\@starttoc}[1]{% -\if@storetoc - \@ttb@storetoc{#1}% -\else - \@ttb@old@starttoc{#1}% -\fi} + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -%\begin{macro}{\@ttb@storetoc} -% store the contents of the file with the given extension +% No, it isn't. If this is an odd page, is it on or off on the next +% page? First, is this an odd page? % \begin{macrocode} -\newcommand*{\@ttb@storetoc}[1]{% -\begingroup -\makeatletter -\@storefileconts{\jobname.#1}% -\if@filesw - \expandafter\newwrite\csname tf@#1\endcsname - \immediate\openout\csname tf@#1\endcsname\jobname.#1\relax -\fi -\@nobreakfalse -\endgroup} + \ifodd\@ff@pages@countreg % \end{macrocode} -%\end{macro} -%\begin{macro}{\@storefileconts} -% store the contents of named file, if it exists. -%\changes{1.10}{2007/08/21}{uses \cs{PackageInfo} instead of -% \cs{typeout}} +% Yes, it's odd. So this frame isn't on this page, but is it on or +% off on the next page? % \begin{macrocode} -\newcommand*{\@storefileconts}[1]{\IfFileExists{#1}{% -\@@storefileconts\@filef@und}{% -\PackageInfo{flowfram}{No file #1.}}} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@sf@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -% store the number of units corresponding to the -% thumbtab type, and minitoc units. These will usually -% have the same value, but this is not always -% guaranteed. -%\begin{macro}{\c@maxtocunits} -% Total number of toc units +% It's not switched on either on this (odd) page or the next (even) page. So +% the page list should be just the next odd page after this one. % \begin{macrocode} -\newcount\c@maxtocunits + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\c@maxminitoc} -% Total number of minitoc units +% It's not switched on for this (odd) page but it is for the next (even) page. So +% the page list should be the next even and odd pages after this +% page. % \begin{macrocode} -\newcount\c@maxminitoc + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@@storefileconts} -% Read each line in from the file, and add to the contents -% list. +% No, it's even. So it's not on this (even) page, but needs to be on +% for the following (odd) page. % \begin{macrocode} -\newcommand{\@@storefileconts}[1]{% -\@ifundefined{\@ttb@minitoctype}{\@ttb@minitoclevel=6\relax}{% -\expandafter\@ttb@minitoclevel\expandafter - =\csname @ttb@\@ttb@minitoctype @level\endcsname}% -\newread\@ttb@toc -\openin\@ttb@toc=#1\relax -\c@maxtocunits=0\relax -\c@maxminitoc=0\relax -\whiledo{\not\boolean{eof}\@ttb@toc}{% -\read\@ttb@toc to\tocline -\@addtotoclist{\tocline}{\c@maxtocunits}% -}% -\closein\@ttb@toc} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@addtotoclist} -% Before each line is added to the contents list, it is -% first checked to see whether the line starts with -% "\contentsline". If it does, then check to see if the -% sectioning type corresponds to the thumbtab level. If -% it does, then start a new list. There will be "\c@maxtocunits" -% lists, each one corresponding to each thumbtab group. -% In addition, each contents line needs to be added to -% the minitoclists, but only if the sectioning type level -% is greater than "\@ttb@minitoctype". The number of minitoc -% lists is given by "\c@maxminitoc". +% Frame is on this page. If this is an odd page, is it on or off on +% the next page? First, is this an odd page? % \begin{macrocode} -\newif\if@contsline -\newcount\@ttb@level -\newcount\@ttb@minitoclevel - -\newcommand{\@addtotoclist}[2]{% -\expandafter\@checkcontentsline#1\end -\if@contsline -\expandafter\@gettype#1\end -\ifthenelse{\equal{\@ttb@contstype}{\@ttb@type}}{% -\global\advance#2 by 1\relax -}{% -}% -\fi -\@ifundefined{@toc@\romannumeral#2}{% -\flf@ta=\expandafter{#1}% -\expandafter\xdef\csname @toc@\romannumeral#2\endcsname{\the\flf@ta}}{% -\flf@ta=\expandafter{#1}% -\flf@tb=\expandafter\expandafter\expandafter{\csname @toc@\romannumeral#2\endcsname}% -\expandafter\xdef\csname @toc@\romannumeral#2\endcsname{\the\flf@tb\the\flf@ta}}% + \ifodd\@ff@pages@countreg % \end{macrocode} -% now do minitoc stuff. If the sectioning type is unknown, -% assume it comes last +% Yes, it's odd. Is the frame on or off for the next (even) page? % \begin{macrocode} -\if@minitoc - \if@contsline - \@ifundefined{\@ttb@contstype}{\@ttb@level=6}{% - \@ttb@level=\csname @ttb@\@ttb@contstype @level\endcsname}% - \relax - \ifnum\@ttb@level=\@ttb@minitoclevel - \global\advance\c@maxminitoc by 1\relax - \expandafter - \gdef\csname @minitoc@\romannumeral\c@maxminitoc\endcsname{}% - \else - \ifnum\@ttb@level>\@ttb@minitoclevel - \flf@ta=\expandafter{#1}\relax - \flf@tb=\expandafter\expandafter\expandafter - {\csname @minitoc@\romannumeral\c@maxminitoc\endcsname}\relax - \expandafter - \xdef\csname @minitoc@\romannumeral\c@maxminitoc\endcsname{% - \the\flf@tb\the\flf@ta} - \fi - \fi - \fi -\fi -} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@sf@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol % \end{macrocode} -%\end{macro} -% Is there already a way of determining the sectioning -% level from its name? +% Frame is off. So the frame is switched on for this (odd) page but +% is off for the next (even) page. So the page list needs to be this +% (odd) page and the following odd page, skipping the even page in +% between. % \begin{macrocode} -\def\@ttb@part@level{-1} -\def\@ttb@chapter@level{0} -\def\@ttb@section@level{1} -\def\@ttb@subsection@level{2} -\def\@ttb@subsubsection@level{3} -\def\@ttb@paragraph@level{4} -\def\@ttb@subparagraph@level{5} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else % \end{macrocode} -%\begin{macro}{\@checkcontentsline} -% Check to see if line starts with "\contentsline" +% Frame is on. So the frame is switched on for this (odd) page and +% the next (even) page. So the page list needs to be this +% (odd) page, the next even page and the following odd page. % \begin{macrocode} -\long\def\@checkcontentsline#1#2\end{% -\ifx#1\contentsline - \@contslinetrue -\else - \@contslinefalse -\fi} + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else % \end{macrocode} -%\end{macro} -%\begin{macro}{\@gettype} -% Given that the line starts with "\contentsline", extract -% the first argument of "\contentsline" to get the sectioning -% type. +% Frame is switched on for this page and this page is even. So the +% page list needs to be this (even) page and the next (odd) page. % \begin{macrocode} -\def\@gettype\contentsline#1#2\end{% -\def\@ttb@contstype{#1}} + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi % \end{macrocode} -%\end{macro} -%\begin{macro}{\tableofcontents} -% Modify "\tableofcontents". It first stores the contents -% of the toc file, and then, either simply prints it on the -% page (so it appears no different to the standard -% "\tableofcontents"), or it prints it out so that each -% thumbtab unit has the same height as the thumbtabs. -% Note: this assumes that the actual table of contents -% starts at the same height as the thumbtabs. The thumbtab -% vertical position may need to be adjusted to compensate -% for space taken up by the contents title. % \begin{macrocode} -\newif\ifaligntoc -\aligntocfalse - -\let\@ttb@old@tableofcontents\tableofcontents -\renewcommand{\tableofcontents}{% -\@storetoctrue -\@ttb@old@tableofcontents -\ifaligntoc - \@printalignedtoc -\else - \@printtoc -\fi -\@storetocfalse -\global\c@minitoc=0\relax} + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\beforeminitocskip} -% Vertical space to add before minitoc. +% +% +%\begin{macro}{\staticswitchoffnextonly} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed static frames for just the next page % \begin{macrocode} -\newlength\beforeminitocskip -\setlength{\beforeminitocskip}{0pt} +\newcommand*{\staticswitchoffnextonly}{% + \@ifstar\@sstaticswitchoffnextonly\@staticswitchoffnextonly +} % \end{macrocode} %\end{macro} -%\begin{macro}{\afterminitocskip} -% Vertical space to add after minitoc. -% \begin{macrocode} -\newlength\afterminitocskip -\setlength{\afterminitocskip}{\baselineskip} +% +%\begin{macro}{\@sstaticswitchoffnextonly} +% The starred version uses \glspl{idl}. +% \begin{macrocode} +\newcommand{\@sstaticswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticaddexclusion{\number\ff@id}{\number\count@}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\dominitoc} -% Do the minitoc for unit "#1". Check first that -% minitocs have been enabled. -% \begin{macrocode} -\newcommand*{\dominitoc}[1]{% -\if@minitoc \@dominitoc{#1}\fi} -\newcommand*{\@dominitoc}[1]{\@@dominitoc{#1}} +% +%\begin{macro}{\@staticswitchoffnextonly} +% The unstarred version uses \glspl{idn}. +% \begin{macrocode} +\newcommand{\@staticswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\minitocstyle} -% Style in which to display the minitoc. +% +%\begin{macro}{\staticswitchoffnextoddonly} +%\changes{1.14}{2012-11-10}{new} +% Switch off the listed static frames for just the next odd page % \begin{macrocode} -\newcommand{\minitocstyle}[1]{\normalfont\normalsize\normalcolor -#1} +\newcommand*{\staticswitchoffnextoddonly}{% + \@ifstar\@sstaticswitchoffnextoddonly\@staticswitchoffnextoddonly +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@@dominitoc} -% Now do the actual minitoc for unit "#1". +% +%\begin{macro}{\@sstaticswitchoffnextoddonly} +% The starred version uses \glspl{idl}. % \begin{macrocode} -\newcommand*{\@@dominitoc}[1]{% -{\minitocstyle{% -\vskip\beforeminitocskip -\csname @minitoc@\romannumeral#1\endcsname}} -\vskip\afterminitocskip} +\newcommand{\@sstaticswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax + \else + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticaddexclusion{\number\ff@id}{\number\count@}% + }% + }% +} % \end{macrocode} %\end{macro} % -%\begin{macro}{\appenddfminitoc} -% Modify "\dominitoc" so that the minitoc is appended -% to specified \gls{dynamic}. Starred version uses -% \gls{dynamic} \gls{idl}, unstarred version uses \gls{dynamic} -% \gls{idn}. I originally called this macro "\appendminitoctodynamicframe" -% but decided it was too long, for I've opted instead -% for a slightly more cryptic name. +%\begin{macro}{\@staticswitchoffnextoddonly} +% The unstarred version uses \glspl{idn}. % \begin{macrocode} -\newcommand*{\appenddfminitoc}{% -\renewcommand{\beforeminitocskip}{\baselineskip}% -\@ifstar\@sappendminitocdf\@appendminitocdf} +\newcommand{\@staticswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax + \else + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@sappendminitocdf} -% Starred version +% +%\begin{macro}{\ffaddtoadjustframeshook} +%\changes{1.14}{2012-11-10}{new} +% Add stuff to the output hook. % \begin{macrocode} -\newcommand*{\@sappendminitocdf}[1]{% -\renewcommand{\@dominitoc}[1]{% -\@sappenddynamic{#1}{\@@dominitoc{##1}}}} +\newcommand*{\ffaddtoadjustframeshook}[1]{% + \@ff@addtolist\@ff@output@adjustframes\entry{#1}% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@appendminitocdf} -% Unstarred version +% +%\begin{macro}{\@g@tnextcol} +% Find the next \gls{flow}. If there are no more flow +% frames, define a new one the size of the \gls{typeblock}. +% (Otherwise the remaining document text will be lost.) % \begin{macrocode} -\newcommand*{\@appendminitocdf}[1]{% -\renewcommand{\@dominitoc}[1]{% -\@appenddynamic{#1}{\@@dominitoc{##1}}}} +\newif\if@notthiscol +\newif\if@ff@nwpg +\newcount\c@curpg +\newcommand*{\@g@tnextcol}[1]{% % \end{macrocode} -%\end{macro} -%\begin{macro}{\@printtoc} -% Do the table of contents, which has been stored -% in "\c@maxtocunits" macros. (or possibly -% "\c@maxtocunits + 1", if information was added -% before the first group---which corresponds to -% "\@colN=0".) +% Do any frame adjustments % \begin{macrocode} -\newcommand*{\@printtoc}{% -\@colN=0\relax -\csname @toc@\romannumeral\@colN\endcsname -\whiledo{\@colN<\c@maxtocunits}{% -\advance\@colN by 1\relax -\csname @toc@\romannumeral\@colN\endcsname}} + \@ff@output@adjustframes % \end{macrocode} -%\end{macro} -%\begin{macro}{\@printalignedtoc} -% Print the table of contents so that each unit is -% has vertical height the same as the height of the -% thumbtabs. Note that you may have to adjust the -% vertical offset of the thumbtabs (in "\makethumbtabs") -% in order to make them correctly aligned. +% Now clear the hook % \begin{macrocode} -\newcommand{\@printalignedtoc}{% -\@ff@tmpN=0\relax -\@ifundefined{@toc@\romannumeral\@ff@tmpN}{% -}{% -\csname @toc@\romannumeral\@ff@tmpN\endcsname -\par\noindent\hrulefill -}% -\whiledo{\@ff@tmpN<\c@maxtocunits}{% -\advance\@ff@tmpN by 1\relax -\ifnum\@ff@tmpN>\c@maxthumbtabs -\csname @toc@\romannumeral\@ff@tmpN\endcsname -\else -\@dynamicframeid{thumbtabindex\number\@ff@tmpN}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @df@dim@\romannumeral\ff@id\endcsname -\vbox to \@ff@tmp@y{% -\noindent\parbox{\linewidth}{% -\csname @toc@\romannumeral\@ff@tmpN\endcsname}% -\vfill -\par\noindent\hrulefill -}% -\fi}} + \global\let\@ff@output@adjustframes\@empty +% \end{macrocode} +% Now check for any more frames. +% \begin{macrocode} + \@ff@checkifmoreframes + \if@ff@moreframes + \else +% \end{macrocode} +% No more frames, add new frame +% \begin{macrocode} + \PackageWarning{flowfram}% + {Run out of flows frames on page \number\@ff@pages@countreg, adding new one}% + \flf@doifverbose + {% + \def\flf@messinfo{Here's the list of flow frames:}% + \count@=0\relax + \loop + \advance\count@ by 1\relax + \expandafter\toks@\expandafter{\flf@messinfo\MessageBreak}% + \edef\flf@messinfo{\the\toks@ + \number\count@. + Pages: \csname @ff@pages@\romannumeral\count@\endcsname. + Exclusions: \csname @ff@xpages@\romannumeral\count@\endcsname. + }% + \ifnum\count@<\c@maxflow + \repeat + \PackageInfo{flowfram}{\flf@messinfo\@gobbletwo}% + }% + \@onecolumn + #1=\c@maxflow + \fi + \@notthiscoltrue + \@ff@nwpgfalse + \@colN=#1\relax +% \end{macrocode} +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} +% \begin{macrocode} + \c@curpg=\@ff@pages@countreg + \loop + \ifnum\@colN=\c@maxflow +% \end{macrocode} +% Reached the end of the page. Try the next one. +% \begin{macrocode} + \@colN=1\relax + \@ff@nwpgtrue + \advance\c@curpg by 1\relax + \else +% \end{macrocode} +% Move on to the next flow frame on this page. +% \begin{macrocode} + \advance\@colN by 1\relax + \fi + \@ff@chckifthispg{\c@curpg}{\@colN}% + \if@notthiscol + \repeat + #1=\@colN\relax +} % \end{macrocode} %\end{macro} -%\begin{macro}{\enableminitoc} -% Make mini tocs appear at the start of given sectional unit. +%\begin{macro}{\@ff@chckifthispg} +% This is used to determine the next \gls{flow}, since not +% all \glspl{flow} may be defined on every page. Checks to +% see if \gls{flow} "#2" is defined on page "#1". +% First set up some variables. % \begin{macrocode} -\newcounter{minitoc} -\newif\if@minitoc -\@minitocfalse - -\newcommand*{\enableminitoc}[1][\@ttb@type]{% -\@minitoctrue -\setcounter{minitoc}{0}% -\@ifundefined{#1}{% -\PackageError{flowfram}{Sectioning type `#1' not defined}{}}{% -\renewcommand{\@ttb@minitoctype}{#1}% -\ifthenelse{\equal{#1}{chapter}}{\@makeminitocchapter}{% -\ifthenelse{\equal{#1}{part}}{\@makeminitocpart}{% -\@makeminitocsection{#1}}}}% +\newcommand*{\@ff@chckifthispg}[2]{% + \@notthiscolfalse + \edef\ff@xpages{\csname @ff@xpages@\romannumeral#2\endcsname}% + \@for\@ff@pp:=\ff@xpages\do + {% + \ifnum0\@ff@pp=#1\relax + \@notthiscoltrue + \@endfortrue + \fi + }% + \if@notthiscol + \else + \@notthiscoltrue + \edef\ff@pages{\csname @ff@pages@\romannumeral#2\endcsname}% + \@@ff@chckifthispg{#1}% + \fi } % \end{macrocode} %\end{macro} -% This command should only appear in the preamble. (This -% ensures that it is used before "\tableofcontents". +%\begin{macro}{\@@ff@chckifthispg} +% Now go ahead and check. % \begin{macrocode} -\@onlypreamble{\enableminitoc} +\newcommand*{\@@ff@chckifthispg}[1]{% + \ifthenelse{\equal{\ff@pages}{none}}% + {}% + {% + \ifthenelse{\equal{\ff@pages}{all}}% + {% + \@notthiscolfalse + }% + {% + \ifthenelse{\equal{\ff@pages}{odd}}% + {% + \ifodd#1\@notthiscolfalse\fi + }% + {% + \ifthenelse{\equal{\ff@pages}{even}}% + {% + \ifodd#1\else\@notthiscolfalse\fi + }% + {% % \end{macrocode} -%\begin{macro}{\@makeminitocchapter} -% If minitocs are associated with chapters, redefine -% "\@chapter" so that the minitoc appears after the -% chapter heading. +% check through list of page numbers % \begin{macrocode} -\newcommand{\@makeminitocchapter}{ -\let\@mtoc@old@chapter\@chapter -\def\@chapter[##1]##2{% -\@mtoc@old@chapter[##1]{##2}% -\stepcounter{minitoc}% -\dominitoc{\c@minitoc}% -\@afterheading -}} + \@for\@ff@pp:=\ff@pages\do{% + \def\@ff@numstart{0}% + \def\@ff@numend{0}% + \@ff@getrange{\@ff@pp}% + \ifthenelse{#1<\@ff@numstart \or #1>\@ff@numend}% + {}% + {% + \@notthiscolfalse + }% + }% + }% + }% + }% + }% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@makeminitocpart} -% Again, for parts. As before, need to redefine -% "\@endpart" if it exists, otherwise redefine -% "\@part". +%\begin{macro}{\@sf@chckifthispg} +% Checks to see if \gls{static} "#1" is defined on the +% current page (or the page given by the optional argument). +%\changes{1.14}{2012-11-10}{added optional argument} +% \begin{macrocode} +\newcommand*{\@sf@chckifthispg}[2][\@ff@pages@countreg]{% + \@notthiscoltrue + \edef\ff@pages{\csname @sf@pages@\romannumeral#2\endcsname}% +% \end{macrocode} +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} % \begin{macrocode} -\newcommand{\@makeminitocpart}{ -\@ifundefined{@endpart}{% -\let\@mtoc@old@part\@part -\def\@part[##1]##2{% -\@mtoc@old@part[##1]{##2}% -\stepcounter{minitoc}% -\dominitoc{\c@minitoc}% -\@afterheading -}}{% -\let\@mtoc@old@endpart\@endpart -\def\@endpart{% -\stepcounter{minitoc}% -\dominitoc{\c@minitoc}% -\@mtoc@old@endpart -}}} + \@@ff@chckifthispg{#1}% +} % \end{macrocode} %\end{macro} -%\begin{macro}{\@makeminitocsection} -% Now for the remaining sectional units. +%\begin{macro}{\@df@chckifthispg} +% Checks to see if \gls{dynamic} "#1" is defined on the +% current page (or the page given by the optional argument). +%\changes{1.14}{2012-11-10}{added optional argument} % \begin{macrocode} -\newcommand{\@makeminitocsection}[1]{% -\let\@mtoc@old@sect=\@sect -\def\@sect##1##2##3##4##5##6[##7]##8{% -\@mtoc@old@sect{##1}{##2}{##3}{##4}{##5}{##6}[##7]{##8}% -\ifthenelse{\equal{##1}{#1}}{% -\stepcounter{minitoc}% -\dominitoc{\c@minitoc}\@afterheading}{}% -}} +\newcommand*{\@df@chckifthispg}[2][\@ff@pages@countreg]{% + \@notthiscoltrue + \edef\ff@pages{\csname @df@pages@\romannumeral#2\endcsname}% +% \end{macrocode} +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} +% \begin{macrocode} + \@@ff@chckifthispg{#1}% +} % \end{macrocode} %\end{macro} -%\iffalse +%\begin{macro}{\@setcolbox} +% Sets the \TeX\ box defining the \gls{flow} to the output +% box. This saves the output until the page is shipped out after +% all the \glspl{flow} have been filled for that page. % \begin{macrocode} -% +\newcommand*{\@setcolbox}[1]{% + \flf@message{Setting contents of box for flow frame \number#1}% + \expandafter\global\expandafter\setbox + \csname column\romannumeral#1\endcsname\box\@outputbox +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@docolbox} +% Put \gls{flow} on the page with the correct border, if it +% has one. +% \begin{macrocode} +\newcommand*{\@docolbox}[1]{% + \flf@message{Doing flow frame \number#1\space + (page \number\@ff@pages@countreg)}% + \edef\ff@frametype{% + \csname @ff@frametype@\romannumeral#1\endcsname}% +% \end{macrocode} +% Frame colour +% \begin{macrocode} + \edef\ff@col{\csname @ff@col@\romannumeral#1\endcsname}% +% \end{macrocode} +% Text colour +% \begin{macrocode} + \edef\ff@txtcol{\csname @ff@txtcol@\romannumeral#1\endcsname}% +% \end{macrocode} +% Background colour +% \begin{macrocode} + \edef\ff@backcol{\csname @ff@backcol@\romannumeral#1\endcsname}% +% \end{macrocode} +% Compute offset for this frame +% \begin{macrocode} + \@ff@setoffset{#1}% +% \end{macrocode} +% Rotate frame if required +% \begin{macrocode} + \rotateframe{\csname @ff@angle@\romannumeral#1\endcsname}% + {% +% \end{macrocode} +% Check if frame has a border +% \begin{macrocode} + \ifthenelse{\boolean{columnframe\romannumeral#1}}% + {% +% \end{macrocode} +% Put the required border around the frame +% \begin{macrocode} + \@ff@fbox + {\csname colwidth\romannumeral#1\endcsname}% + {\csname colheight\romannumeral#1\endcsname}% + {% + \expandafter\box\csname column\romannumeral#1\endcsname + }% + {% + \csname\ff@frametype\endcsname + }% + }% + {% +% \end{macrocode} +% Do the frame without a border +% \begin{macrocode} + \@ff@box + {\csname colwidth\romannumeral#1\endcsname}% + {\csname colheight\romannumeral#1\endcsname}% + {% + \expandafter\box\csname column\romannumeral#1\endcsname + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@docolbbox} +% Do the \gls{bbox} for given \gls{flow}. +% \begin{macrocode} +\newcommand*{\@docolbbox}[1]{% + \@ff@setoffset{#1}% + \def\ff@col{}\def\ff@txtcol{}% + \@fr@meifdraft + {% + \@ff@box + {\csname colwidth\romannumeral#1\endcsname}% + {\csname colheight\romannumeral#1\endcsname}% + {% + \expandafter\box\csname column\romannumeral#1\endcsname + }% + }% + {F:\number#1;\csname @col@id@\romannumeral#1\endcsname}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@fbox} +% Put the \TeX\ box "#3" of width "#1" and +% height "#2", and frame making command +% specified by "#4". +% \begin{macrocode} +\newcommand{\@ff@fbox}[4]{% + {% + \fboxsep=\flowframesep + \fboxrule=\flowframerule + \@s@tffcol + \kern\@ff@offset + #4{\@ff@box{#1}{#2}{#3}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@box} +% Put the \TeX\ box "#3" of width "#1" and height "#2" on +% the page. +% \begin{macrocode} +\newcommand{\@ff@box}[3]{% + {% + \@ffbackground + {% + \vbox to#2 {\hb@xt@ #1{\hss{\@s@tfftextcol #3}\hss}\vss\kern\z@}% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@putcolbox} +% Display the \gls{flow} on the page, at its given position. +% If the document is two-sided, need to check whether +% the current page is odd or even to determine the correct +% location. +% \begin{macrocode} +\newcommand*{\@putcolbox}[1]{% +% \end{macrocode} +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} +% \begin{macrocode} + \@ff@chckifthispg{\@ff@pages@countreg}{#1}% +% \end{macrocode} +%\changes{1.14}{2012-11-10}{added check for non-void box} +% \begin{macrocode} + \if@notthiscol + \expandafter\ifvoid\csname column\romannumeral#1\endcsname + \else + \PackageWarning{flowfram}{Box \number#1\space is not void. + Dumping. This page: \number\@ff@pages@countreg. + Page list: "\csname @ff@pages@\romannumeral#1\endcsname". + Exclusion list: "\csname @ff@xpages@\romannumeral#1\endcsname". + (Maybe the page list was changed after this frame was + selected or maybe you should use package option pages=absolute)}% + \@notthiscolfalse + \fi + \fi + \if@notthiscol + \flf@message{Flow frame \number#1\space is not required on page + \number\@ff@pages@countreg}% + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname col@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@posx\endcsname + \@docolbox{#1}\hss + }% + \else + \expandafter\raise\csname col@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@evenx\endcsname + \@docolbox{#1}\hss + }% + \fi + \else + \expandafter\raise\csname col@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@posx\endcsname + \@docolbox{#1}\hss + }% + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@putcolbbox} +% Same for \gls{flow} \gls{bbox}: +% \begin{macrocode} +\newcommand*{\@putcolbbox}[1]{% +% \end{macrocode} +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with \cs{@ff@pages@countreg}} +% \begin{macrocode} + \@ff@chckifthispg{\@ff@pages@countreg}{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname col@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@posx\endcsname + \@docolbbox{#1}\hss + }% + \else + \expandafter\raise\csname col@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@evenx\endcsname + \@docolbbox{#1}\hss + }% + \fi + \else + \expandafter\raise\csname col@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@posx\endcsname + \@docolbbox{#1}\hss + }% + \fi + \fi +} +% \end{macrocode} +%\end{macro} +% If an offset hasn't been specified, compute it. If the +% frame making command is known (e.g. doublebox), compute +% the offset according to known specifications, otherwise +% set the negative offset to "\flowframesep" plus +% "\flowframerule", which may or may not be correct. +% +%\begin{macro}{\@ff@s@t@doubleboxoffset} +% Compute offset for "\doublebox": +% \begin{macrocode} +\newcommand*{\@ff@s@t@doubleboxoffset}{% + \setlength{\@ff@offset}{-\flowframesep}% + \addtolength{\@ff@offset}{-3.75\flowframerule}% + \addtolength{\@ff@offset}{-.5pt}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@s@t@ovalboxoffset} +% Compute offset for "\ovalbox": +% \begin{macrocode} +\newcommand*{\@ff@s@t@ovalboxoffset}{% + \@ff@offset=-\fontdimen 8\tenln\relax + \advance\@ff@offset by -\flowframesep\relax +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@s@t@Ovalboxoffset} +% Compute offset for "\ovalbox": +% \begin{macrocode} +\newcommand*{\@ff@s@t@Ovalboxoffset}{% + \@ff@offset=-\fontdimen 8\tenlnw\relax + \advance\@ff@offset by -\flowframesep\relax +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@s@t@defaultoffset} +% Compute default offset: +% \begin{macrocode} +\newcommand*{\@ff@s@t@defaultoffset}{% + \@ff@offset=-\flowframesep\relax + \addtolength{\@ff@offset}{-\flowframerule}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@setoffset} +% Compute offset for \gls{flow} "#1". Stores offset value +% in "\ff@offset". +% \begin{macrocode} +\newcommand*{\@ff@setoffset}[1]{% + \ifthenelse + {\equal{\csname @ff@offset@\romannumeral#1\endcsname}{compute}}% + {% + \ifthenelse{\boolean{columnframe\romannumeral#1}}% + {% + \ifthenelse + {% + \equal{\csname @ff@frametype@\romannumeral#1\endcsname}% + {doublebox}% + }% + {% + \@ff@s@t@doubleboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @ff@frametype@\romannumeral#1\endcsname}% + {ovalbox}% + }% + {% + \@ff@s@t@ovalboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @ff@frametype@\romannumeral#1\endcsname}% + {Ovalbox}% + }% + {% + \@ff@s@t@Ovalboxoffset + }% + {% + \@ff@s@t@defaultoffset + }% + }% + }% + }% + {}% + }% + {% + \setlength{\@ff@offset}% + {\csname @ff@offset@\romannumeral#1\endcsname}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@sf@setoffset} +% Compute offset for \gls{static} "#1". Stores offset value +% in "\ff@offset". +% \begin{macrocode} +\newcommand*{\@sf@setoffset}[1]{% + \ifthenelse + {% + \equal{\csname @sf@offset@\romannumeral#1\endcsname}% + {compute}% + }% + {% + \ifthenelse{\boolean{staticframe\romannumeral#1}}% + {% + \ifthenelse + {% + \equal{\csname @sf@frametype@\romannumeral#1\endcsname}% + {doublebox}% + }% + {% + \@ff@s@t@doubleboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @sf@frametype@\romannumeral#1\endcsname}% + {ovalbox}% + }% + {% + \@ff@s@t@ovalboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @sf@frametype@\romannumeral#1\endcsname}% + {Ovalbox}% + }% + {% + \@ff@s@t@Ovalboxoffset + }% + {% + \@ff@s@t@defaultoffset + }% + }% + }% + }% + {}% + }% + {% + \setlength{\@ff@offset}% + {\csname @sf@offset@\romannumeral#1\endcsname}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@df@setoffset} +% Compute offset for \gls{dynamic} "#1". Stores offset value +% in "\ff@offset". +% \begin{macrocode} +\newcommand*{\@df@setoffset}[1]{% + \ifthenelse + {% + \equal{\csname @df@offset@\romannumeral#1\endcsname}% + {compute}% + }% + {% + \setlength{\@ff@offset}{0pt}% + \ifthenelse{\boolean{dynamicframe\romannumeral#1}}% + {% + \ifthenelse + {% + \equal{\csname @df@frametype@\romannumeral#1\endcsname}% + {doublebox}% + }% + {% + \@ff@s@t@doubleboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @df@frametype@\romannumeral#1\endcsname}% + {ovalbox}% + }% + {% + \@ff@s@t@ovalboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @df@frametype@\romannumeral#1\endcsname}% + {Ovalbox}% + }% + {% + \@ff@s@t@Ovalboxoffset + }% + {% + \@ff@s@t@defaultoffset + }% + }% + }% + }% + {}% + }% + {% + \setlength{\@ff@offset}% + {\csname @df@offset@\romannumeral#1\endcsname}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@putmarginbox} +% Draw box representing the margin for \gls{flow} "#1". +% \begin{macrocode} +\newcommand*{\@putmarginbox}[1]{% +% \end{macrocode} +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} +% \begin{macrocode} + \@ff@chckifthispg{\@ff@pages@countreg}{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \edef\ff@x{\csname col@\romannumeral#1@posx\endcsname}% + \edef\ff@y{\csname col@\romannumeral#1@posy\endcsname}% + \else + \edef\ff@x{\csname col@\romannumeral#1@evenx\endcsname}% + \edef\ff@y{\csname col@\romannumeral#1@eveny\endcsname}% + \fi + \else + \edef\ff@x{\csname col@\romannumeral#1@posx\endcsname}% + \edef\ff@y{\csname col@\romannumeral#1@posy\endcsname}% + \fi + \setlength{\@ff@tmp@x}{\ff@x}% + \setlength{\@ff@tmp@y}{\ff@y}% + \@getmarginpos{\csname @ff@margin@\romannumeral#1\endcsname}% + \ifthenelse{\equal{\ff@margin}{left}}% + {% + \addtolength{\@ff@tmp@x}{-\marginparwidth}% + \addtolength{\@ff@tmp@x}{-\marginparsep}% + \ifthenelse{\boolean{columnframe\romannumeral#1}}% + {}% + {}% + }% + {% + \addtolength{\@ff@tmp@x}% + {\csname colwidth\romannumeral#1\endcsname}% + \addtolength{\@ff@tmp@x}{\marginparsep}% + \ifthenelse{\boolean{columnframe\romannumeral#1}}% + {}% + {}% + }% + \raise\@ff@tmp@y + \hb@xt@\z@ + {% + \expandafter\kern\@ff@tmp@x + \@fr@meifdraft{\@ff@box{\marginparwidth}% + {\csname colheight\romannumeral#1\endcsname}{}}% + {M:\number#1}\hss + }% + \fi + \ignorespaces +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@drawmargins} +% Draw all the margins associated with the \glspl{flow} defined +% on the current page. +% \begin{macrocode} +\newcommand*{\@ff@drawmargins}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \makebox[0pt][l]{\@putmarginbox{\@colN}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@getstaticpos} +% Extract the width and height for static or \gls{dynamic} +% specified in the form \oarg{c}\oarg{height}\oarg{valign}\marg{width} +% \begin{macrocode} +\def\@ff@getstaticpos[#1][#2][#3]#4{% + \@ff@tmp@x=#4\relax + \@ff@tmp@y=#2\relax + \def\ff@valign{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dostaticbox} +% Display the savebox associated with \gls{static} "#1" +% \begin{macrocode} +\newcommand*{\@dostaticbox}[1]{% + \edef\ff@frametype{% + \csname @sf@frametype@\romannumeral#1\endcsname + }% + \edef\ff@col{\csname @sf@col@\romannumeral#1\endcsname}% + \edef\ff@backcol{\csname @sf@backcol@\romannumeral#1\endcsname}% + \@sf@setoffset{#1}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname + \rotateframe + {\csname @sf@angle@\romannumeral#1\endcsname}% + {% + \ifthenelse{\boolean{staticframe\romannumeral#1}}% + {% + \@ff@fbox{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname + } + {\csname\ff@frametype\endcsname}% + }% + {% + \@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dostaticbbox} +% Now for the \gls{bbox}: +% \begin{macrocode} +\newcommand*{\@dostaticbbox}[1]{% + \edef\ff@col{}% + \@sf@setoffset{#1}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname + \@fr@meifdraft + {% + \@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname + }% + }% + {S:\number#1;\csname @sf@id@\romannumeral#1\endcsname}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@putstaticbox} +% Put the static box "#1" at its given position, with its +% associated border. +% \begin{macrocode} +\newcommand*{\@putstaticbox}[1]{% + \@sf@chckifthispg{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname + \@dostaticbox{#1}\hss + }% + \else + \expandafter\raise\csname @sf@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@evenx\endcsname + \@dostaticbox{#1}\hss + }% + \fi + \else + \expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname + \@dostaticbox{#1}\hss + }% + \fi +\fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@putstaticbbox} +% Now for the \gls{bbox}: +% \begin{macrocode} +\newcommand*{\@putstaticbbox}[1]{% + \@sf@chckifthispg{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname + \@dostaticbbox{#1}\hss + }% + \ignorespaces + \else + \expandafter\raise\csname @sf@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@evenx\endcsname + \@dostaticbbox{#1}\hss + }% + \ignorespaces + \fi + \else + \expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname + \@dostaticbbox{#1}\hss + }% + \ignorespaces + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@resetst@tics} +% Clear the contents of all the \glspl{static} that have +% the "clear" option set. +% \begin{macrocode} +\newcommand*{\@resetst@tics}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax +% \end{macrocode} +% Has the clear flag been set? +% \begin{macrocode} + \ifthenelse{\boolean{@sf@clear@\romannumeral\@colN}}% + {% +% \end{macrocode} +% Set the contents of the box to empty +% \begin{macrocode} + \global\sbox + {% + \csname @staticframe@\romannumeral\@colN\endcsname + }% + {}% + }% + {}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@resetdyn@mics} +% Clear the contents of the \glspl{dynamic} that have the "clear" option +% set. +% \begin{macrocode} +\newcommand*{\@resetdyn@mics}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \ifthenelse{\boolean{@df@clear@\romannumeral\@colN}}% + {% + \expandafter\global\expandafter + \gdef\csname @dynamicframe@\romannumeral\@colN\endcsname{}% + }% + {}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dodfparbox} +% Display contents of dynamic box (contents stored in +% "\ff@contents", style given by "\ff@style"): +% \begin{macrocode} +\newcommand*{\@dodfparbox}[1]{% + \expandafter\let\expandafter + \@ff@parshape\csname @df@shape@\romannumeral#1\endcsname + \expandafter\@ff@getshape\@ff@parshape\relax + \ifcase\ff@shape +% \end{macrocode} +% no shape +% \begin{macrocode} + \expandafter\expandafter\expandafter + \parbox\csname @df@dim@\romannumeral#1\endcsname + {% + \setlength\parindent\sdfparindent + \csname\ff@style\endcsname{\ff@contents}% + }% + \or +% \end{macrocode} +% \ics{parshape} +% \begin{macrocode} + \expandafter\expandafter\expandafter + \parbox\csname @df@dim@\romannumeral#1\endcsname + {% + \setlength\parindent\sdfparindent + \csname\ff@style\endcsname + {{% + \let\oldpar=\par + \let\par=\ffpshpar + \@ff@setsecthead + \@ff@parshape + \ff@contents\oldpar + }}% + }% + \or +% \end{macrocode} +% \ics{shapepar} +% \begin{macrocode} + \expandafter\expandafter\expandafter + \parbox\csname @df@dim@\romannumeral#1\endcsname + {% + \setlength\parindent\sdfparindent + \csname\ff@style\endcsname + {{% + \@ff@disablesec\@ff@parshape + \ff@contents\par + }}% + }% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dodynamicbox} +% Typeset the dynamic box with its associated border. +% \begin{macrocode} +\newcommand*{\@dodynamicbox}[1]{% + \edef\ff@frametype{% + \csname @df@frametype@\romannumeral#1\endcsname + }% + \edef\ff@col{\csname @df@col@\romannumeral#1\endcsname}% + \edef\ff@txtcol{\csname @df@txtcol@\romannumeral#1\endcsname}% + \edef\ff@backcol{\csname @df@backcol@\romannumeral#1\endcsname}% + \edef\ff@style{\csname @df@style@\romannumeral#1\endcsname}% + \def\ff@contents{\csname @dynamicframe@\romannumeral#1\endcsname}% + \@df@setoffset{#1}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname + \rotateframe{\csname @df@angle@\romannumeral#1\endcsname}% + {% + \ifthenelse{\boolean{dynamicframe\romannumeral#1}}% + {% + \@ff@fbox{\@ff@tmp@x}{\@ff@tmp@y}% + {\@dodfparbox{#1}}% + {\csname\ff@frametype\endcsname}% + }% + {% + \@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \@dodfparbox{#1}% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dodynamicbbox} +% Now for the \gls{bbox}: +% \begin{macrocode} +\newcommand*{\@dodynamicbbox}[1]{% + \edef\ff@col{}% + \@df@setoffset{#1}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname + \@fr@meifdraft + {% + \@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \expandafter\expandafter\expandafter + \parbox\csname @df@dim@\romannumeral#1\endcsname + {}% + }% + }% + {D:\number#1;\csname @df@id@\romannumeral#1\endcsname}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@putdynamicbox} +% Put the \gls{dynamic} "#1" at its given position +% \begin{macrocode} +\newcommand*{\@putdynamicbox}[1]{% + \@df@chckifthispg{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname @df@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@posx\endcsname + \@dodynamicbox{#1}\hss + }% + \ignorespaces + \else + \expandafter\raise\csname @df@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@evenx\endcsname + \@dodynamicbox{#1}\hss + }% + \ignorespaces + \fi + \else + \expandafter\raise\csname @df@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@posx\endcsname + \@dodynamicbox{#1}\hss + }% + \ignorespaces + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@putdynamicbbox} +% Bounding box: +% \begin{macrocode} +\newcommand*{\@putdynamicbbox}[1]{% + \@df@chckifthispg{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname @df@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@posx\endcsname + \@dodynamicbbox{#1}\hss + }% + \ignorespaces + \else + \expandafter\raise\csname @df@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@evenx\endcsname + \@dodynamicbbox{#1}\hss + }% + \ignorespaces + \fi + \else + \expandafter\raise\csname @df@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@posx\endcsname + \@dodynamicbbox{#1}\hss + }% + \ignorespaces + \fi + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@doheader} +% Do standard header in the standard place. +% \begin{macrocode} +\newcommand*{\@@doheader}{% + \setlength\@ff@tmp@y{\textheight}% + \addtolength{\@ff@tmp@y}{\headsep}% + \def\ff@col{}% + \def\ff@txtcol{}% + \def\ff@backcol{{none}}% + \@ff@box{0pt}{\@ff@tmp@y}{\makebox[0pt][l]{\@dothehead}}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@dofooter} +% Do standard footer in the standard place. +% \begin{macrocode} +\newcommand*{\@@dofooter}{% + \setlength\@ff@tmp@y{-\footskip}% + \def\ff@col{}% + \def\ff@txtcol{}% + \def\ff@backcol{{none}}% + \@ff@box{0pt}{\@ff@tmp@y}{\makebox[0pt][l]{\@dothefoot}}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@s@tfr@mes} +% This is a modified version of the way the picture environment +% works: +% \begin{macrocode} +\newcommand{\@s@tfr@mes}[1]{% + {% + \@picht\textheight + \setbox\@picbox\hb@xt@ \textwidth + \bgroup + \hbox + \bgroup + #1\relax + \egroup + \hss + \egroup + \ht\@picbox\@picht + \dp\@picbox\z@ + \mbox{\box\@picbox}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@doallflowframes} +% Puts all the \glspl{flow} defined on the current page +% \begin{macrocode} +\newcommand*{\@ff@doallflowframes}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \@putcolbox{\@colN}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@doallflowframesbbox} +% Flow frame \glspl{bbox}: +% \begin{macrocode} +\newcommand*{\@ff@doallflowframesbbox}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \@putcolbbox{\@colN}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@doallstatics} +% Puts all \glspl{static} defined on the current page +% \begin{macrocode} +\newcommand*{\@ff@doallstatics}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \@putstaticbox{\@colN}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@doallstaticsbbox} +% Static frame \glspl{bbox}: +% \begin{macrocode} +\newcommand*{\@ff@doallstaticsbbox}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \@putstaticbbox{\@colN}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@doalldynamics} +% Puts all the \glspl{dynamic} defined on the current page +% \begin{macrocode} +\newcommand*{\@ff@doalldynamics}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \@putdynamicbox{\@colN}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@doalldynamicsbbox} +% Dynamic frame \glspl{bbox}: +% \begin{macrocode} +\newcommand*{\@ff@doalldynamicsbbox}{% + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \@putdynamicbbox{\@colN}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@dotypeblock} +% Draw \gls{typeblock} frame if draft. +% \begin{macrocode} +\newcommand*{\@ff@dotypeblock}{% + \makebox[0pt][l]% + {% + \@fr@meifdraft[\setffdrafttypeblockcolor]% + {% + \vbox to \textheight{\hbox to \textwidth{}}% + }% + {}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ff@do@allframes} +% Put all frames defined on the current page. +% \begin{macrocode} +\newlength\ffevenoffset +\newcommand*{\@ff@do@allframes}{% + \ffevenoffset=0pt\relax + \if@twoside + \ifodd\c@page + \else + \ffevenoffset=-\oddsidemargin\relax + \advance\ffevenoffset by \evensidemargin\relax + \kern\ffevenoffset\relax + \fi + \fi + \setlength{\@ff@tmp@x}{\textwidth}% + \advance\@ff@tmp@x by -\ffevenoffset\relax + \makebox[\@ff@tmp@x][l]% + {% + \@s@tfr@mes + {% + \@ff@doallstatics + \@@doheader + \@@dofooter + \@ff@doallflowframes + \@ff@doalldynamics + \ifshowtypeblock + \@ff@dotypeblock + \fi + \ifshowframebbox + \@ff@doallstaticsbbox + \@ff@doallflowframesbbox + \@ff@doalldynamicsbbox + \fi + \ifshowmargins + \@ff@drawmargins + \fi + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@outputdblcol} +% This was modified from the output routine for standard +% two column format. After "\@g@tnextcol", the register +% "\c@curpg" contains the page that the next \gls{flow} +% is on. If "\c@curpg" minus "\c@page" is greater +% than 1, then there is at least one page without a \gls{flow}. +% These pages will have to be shipped before \TeX\ can +% continue with the rest of the document. +% \begin{macrocode} +\newcount\@nxtcol +\def\@outputdblcol{% + \@nxtcol=\c@thisframe +% \end{macrocode} +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} +% \begin{macrocode} + \c@curpg=\@ff@pages@countreg + \@g@tnextcol{\@nxtcol}% + \if@ff@nwpg +% \end{macrocode} +% Next flow frame starts on new page. +% \begin{macrocode} + \global\@firstcolumntrue + \@setcolbox\c@thisframe + \if@specialpage + \global\@specialpagefalse + \@nameuse{ps@\@specialstyle}\relax + \fi + \if@twoside + \ifodd\count\z@ + \let\@thehead\@oddhead + \let\@thefoot\@oddfoot + \else + \let\@thehead\@evenhead + \let\@thefoot\@evenfoot + \fi + \else + \let\@thehead\@oddhead + \let\@thefoot\@oddfoot + \fi + \@begindvi + \@dodynamicthehead\@dodynamicthefoot + \vbadness=\@M + \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% + \@combinedblfloats + \@outputpage +% \end{macrocode} +% Shipout pages without flow frames. +%\changes{1.14}{2012-11-10}{replaced \cs{c@page} with +%\cs{@ff@pages@countreg}} +% \begin{macrocode} + \advance\c@curpg by -\@ff@pages@countreg\relax + \whiledo{\c@curpg>0}% + {% + \advance\c@curpg by -1\relax + \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% + \@outputpage + } + \begingroup + \@dblfloatplacement + \@startdblcolumn + \@whilesw \if@fcolmade \fi + {\@outputpage \@startdblcolumn }% + \endgroup + \@resetst@tics + \@resetdyn@mics + \else +% \end{macrocode} +% Still on same page, save contents of box255 +% \begin{macrocode} + \global\@firstcolumnfalse + \@setcolbox\c@thisframe + \fi + \global\c@thisframe=\@nxtcol + \@setcol{\c@thisframe}\relax + \global\@colht\vsize +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dblfloatplacement} +% Modify "\@dblfloatplacement" replacing "\textheight" +% with "\vsize". +% \begin{macrocode} +\def\@dblfloatplacement{% + \global\@dbltopnum\c@dbltopnumber + \global\@dbltoproom\dbltopfraction\@colht\@textmin + \@colht\advance\@textmin -\@dbltoproom + \@fpmin\dblfloatpagefraction\vsize + \@fptop \@dblfptop \@fpsep \@dblfpsep \@fpbot \@dblfpbot +} +% \end{macrocode} +%\end{macro} +% +%\subsection{Static versions of floats} +% Floats can not go in saveboxes or minipages, so define +% static versions to go in static and \glspl{dynamic}. +% These just set "\@captype" so that the "\caption" +% command may be used. +%\begin{environment}{statictable} +% \begin{macrocode} +\newenvironment{statictable}{\def\@captype{table}}{} +% \end{macrocode} +%\end{environment} +%\begin{environment}{staticfigure} +% \begin{macrocode} +\newenvironment{staticfigure}{\def\@captype{figure}}{} +% \end{macrocode} +%\end{environment} +% +%\subsection{Standard Layouts} +%\subsubsection{Column Styles} +% Redefine "\twocolumn" and "\onecolumn" to set up \glspl{flow} from +% the dimensions of the \gls{typeblock}. Ignore the optional argument. +% The \gls{flow} height will be adjusted to make sure that it +% is an integer multiple of "\baselineskip", unless +% "\ffvajdustfalse" is used. +% \begin{macrocode} +\newif\ifffvadjust +\ffvadjusttrue +% \end{macrocode} +%\begin{macro}{\onecolumn} +% "\onecolumn" will make a single \gls{flow} that takes +% up the entire area of the \gls{typeblock} (adjusted according +% to "\ifffvadjust".) Frames should only be created in +% the preamble, otherwise the next \gls{flow} may not +% be detected by the output routine. The exception to this +% is when the output routine can't find any more \glspl{flow} +% to use, in which case it creates a single \gls{flow} using +% "\@onecolumn". Therefore, make "\onecolumn" use "\@onecolumn", +% and then set "\onecolumn" as a preamble command, so it +% can't be used in the document, but the output routine can +% use "\@onecolumn". Syntax: \cs{onecolumn}\oarg{pages}, +% where \meta{pages} is the \gls{pglist} for which the new +% \gls{flow} is defined. +% \begin{macrocode} +\renewcommand*{\onecolumn}{\@onecolumn} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@onecolumn} +% \begin{macrocode} +\newcommand*{\@onecolumn}[1][all]{% + \@onecolumninarea[#1]{\textwidth}{\textheight}{0pt}{0pt}% +} +% \end{macrocode} +%\end{macro} +% Need a length to store the height of +% the \gls{flow} so that it can be adjusted. +% \begin{macrocode} +\newlength\columnheight +% \end{macrocode} +%\begin{macro}{\onecolumninarea} +% "\onecolumn" is in fact a special case of "\onecolumninarea" +% which sets up one \gls{flow} in the specified area, given +% by bottom left corner (\meta{x}, \meta{y}), +% relative to the \gls{typeblock}, with width \meta{w} +% and height \meta{h}. +% The only difference between "\onecolumninarea" and +% explicitly creating the \gls{flow} using "\newflowframe" +% is the "\onecolumninarea" will adjust the vertical height +% the ensure it is a multiple of "\baselineskip". There +% is also no starred version, so if you want a border, you +% will need to set it explicitly using "\setflowframe". +% Syntax:\newline +% \cs{onecolumninarea}\oarg{pages}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\onecolumninarea}{\@onecolumninarea} +\@onlypreamble{\onecolumninarea} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@onecolumninarea} +% \begin{macrocode} +\newcommand*{\@onecolumninarea}[5][all]{% + \setlength{\columnheight}{#3}% + \ifffvadjust + \adjustheight{\columnheight}% + \fi + \@n@wflowframe[#1]{#2}{\columnheight}{#4}{#5}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumn} +% Set up two \glspl{flow} parallel to each other +% with a distance of "\columnsep" between them, to +% fill the entire \gls{typeblock} (although the frames may +% end up marginally shorter than "\textheight" after +% they have been adjusted.) Again, these commands may only +% be used in the preamble. Note that unlike the standard +% "\twocolumn" command, this one has an optional argument +% that indicates which pages the two \glspl{flow} should +% appear on. Syntax: \cs{twocolumn}\oarg{pages}. +% \begin{macrocode} +\renewcommand*{\twocolumn}{\@twocolumn} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@twocolumn} +% \begin{macrocode} +\newcommand*{\@twocolumn}[1][all]{% + \@twocolumninarea[#1]{\textwidth}{\textheight}{0pt}{0pt}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumninarea} +% Again, "\twocolumn" is actually a special case of +% "\twocolumninarea". +% Syntax:\newline +% \cs{twocolumninarea}\oarg{pages}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\twocolumninarea}{\@twocolumninarea} +\@onlypreamble{\twocolumninarea} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@twocolumninarea} +% \begin{macrocode} +\newcommand*{\@twocolumninarea}[5][all]{% + \setlength{\columnheight}{#3}% + \ifffvadjust + \adjustheight{\columnheight}% + \fi + \setlength{\columnwidth}{#2}% + \addtolength{\columnwidth}{-\columnsep}% + \divide\columnwidth by 2\relax + \setlength{\@ff@tmp@x}{#4}% + \addtolength{\@ff@tmp@x}{\columnwidth}% + \addtolength{\@ff@tmp@x}{\columnsep}% + \iflefttorightcolumns + \@n@wflowframe[#1]{\columnwidth}{\columnheight}{#4}{#5}% + \setflowframe{\c@maxflow}{margin=left}% + \else + \@n@wflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#5}% + \setflowframe{\c@maxflow}{margin=right}% + \fi + \iflefttorightcolumns + \@n@wflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#5}% + \setflowframe{\c@maxflow}{margin=right}% + \else + \@n@wflowframe[#1]{\columnwidth}{\columnheight}{#4}{#5}% + \setflowframe{\c@maxflow}{margin=left}% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\Ncolumn} +% Again for an aribtrary number of columns (\meta{n}). Syntax: +% \cs{Ncolumn}\oarg{pages}\marg{n}. +% \begin{macrocode} +\newcommand*{\Ncolumn}[2][all]{% + \Ncolumninarea[#1]{#2}{\textwidth}{\textheight}{0pt}{0pt}% +} +\@onlypreamble{\Ncolumn} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\Ncolumninarea} +% Check the number of \glspl{flow} requested, and do one +% of the special cases if available. +% Syntax:\newline +% \cs{Ncolumninarea}\oarg{pages}\marg{n}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\Ncolumninarea}[6][all]{% + \ifnum#2>2\relax + \@Ncolumninarea[#1]{#2}{#3}{#4}{#5}{#6}% + \else + \ifcase#2\relax + \PackageError{flowfram}% + {% + You have requested 0 flowframes!% + }% + {% + It does not make much sense to ask to create 0 flow frames% + }% + \or + \onecolumninarea[#1]{#3}{#4}{#5}{#6}% + \or + \twocolumninarea[#1]{#3}{#4}{#5}{#6}% + \else + \PackageError{flowfram}% + {% + Can't create a negative number of flow frames!% + }% + {% + You have asked for \number#2 \space flow frames + which really doesn't make sense% + }% + \fi + \fi +} + +\@onlypreamble{\Ncolumninarea} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@Ncolumninarea} +% Set up \meta{n} columns in the area specified. +% There is a horizontal distance of "\columnsep" +% between them all. +% \begin{macrocode} +\newcommand*{\@Ncolumninarea}[6][all]{% + \@colN=#2\relax + \advance\@colN by -1\relax + \setlength{\columnwidth}{#3}% + \addtolength{\columnwidth}{-\@colN\columnsep}% + \divide\columnwidth by #2\relax + \setlength{\@ff@tmp@x}{#5}% + \iflefttorightcolumns + \else + \addtolength{\@ff@tmp@x}{#3}% + \addtolength{\@ff@tmp@x}{-\columnwidth}% + \fi + \setlength{\columnheight}{#4}% + \ifffvadjust\adjustheight{\columnheight}\fi% + \@colN=0\relax + \loop + \advance\@colN by 1\relax + \newflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#6}% + \iflefttorightcolumns + \addtolength{\@ff@tmp@x}{\columnwidth}% + \addtolength{\@ff@tmp@x}{\columnsep}% + \else + \addtolength{\@ff@tmp@x}{-\columnwidth}% + \addtolength{\@ff@tmp@x}{-\columnsep}% + \fi + \ifnum\@colN<#2 + \repeat +} +% \end{macrocode} +%\end{macro} +% +% Set up something similar but have another frame (of type +% \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 "\Ncolumntop" etc is given by: +% \begin{macrocode} +\newlength{\vcolumnsep} +\setlength{\vcolumnsep}{\columnsep} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\onecolumntop} +% "\onecolumntop" makes one \gls{flow}, and one \meta{type} +% frame in the area specified, where the \meta{type} frame is +% \meta{H} high. +% The distance between the top frame and the column \gls{flow} +% will be approximately "\vcolumnsep". (The height of \gls{flow} +% may be adjusted to make it an integer multiple of +% "\baselineskip".) +% +% First the special case where the area is the \gls{typeblock}. +% Syntax:\newline +% \cs{onecolumntop}\oarg{pages}\marg{type}\marg{H} +% \begin{macrocode} +\newcommand*{\onecolumntop}[3][all]{% + \onecolumntopinarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}% +} +\@onlypreamble{\onecolumntop} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\onecolumnStop} +% Special case for \gls{static}. +% Syntax: \cs{onecolumnStop}\oarg{pages}\marg{H} +% \begin{macrocode} +\newcommand*{\onecolumnStop}[2][all]{% + \onecolumntopinarea[#1]{static}{#2}{\textwidth}{\textheight}{0pt}{0pt}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\onecolumnDtop} +% Special case for \gls{dynamic}. +% Syntax: \cs{onecolumnDtop}\oarg{pages}\marg{H} +% \begin{macrocode} +\newcommand*{\onecolumnDtop}[2][all]{% + \onecolumntopinarea[#1]{dynamic}{#2}{\textwidth}{\textheight}{0pt}{0pt}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\newframe} +% Create a frame of given type. +% Syntax:\newline +% \cs{newframe}\oarg{pages}\marg{type}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\newframe}[6][all]{% + \ifthenelse{\equal{#2}{flow}}% + {% + \@n@wflowframe[#1]{#3}{#4}{#5}{#6}% + }% + {% + \ifthenelse{\equal{#2}{dynamic}}% + {% + \@n@wdynamicframe[#1]{#3}{#4}{#5}{#6}% + }% + {% + \ifthenelse{\equal{#2}{static}}% + {% + \@n@wstaticframe[#1]{#3}{#4}{#5}{#6}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#2'}% + {% + Available frame types are: 'flow', 'static' and 'dynamic'% + }% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\onecolumntopinarea} +% Now for a specified area. +% Syntax:\newline +% \cs{onecolumntopinarea}\oarg{pages}\marg{type}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newlength\@ff@staticH + +\newcommand*{\onecolumntopinarea}[7][all]{% + \setlength{\@ff@staticH}{#3}% + \setlength{\@ff@tmp@y}{#5}% + \addtolength{\@ff@tmp@y}{-\@ff@staticH}% + \setlength{\columnheight}{\@ff@tmp@y}% + \addtolength{\columnheight}{-\vcolumnsep}% + \ifffvadjust + \adjustheight{\columnheight}% + \fi + \addtolength{\@ff@tmp@y}{#7}% + \newframe[#1]{#2}{#4}{\@ff@staticH}{#6}{\@ff@tmp@y}% + \@n@wflowframe[#1]{#4}{\columnheight}{#6}{#7}% +} + +\@onlypreamble{\onecolumntopinarea} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\onecolumnStopinarea} +% Special case for \gls{static}. +% Syntax:\newline +% \cs{onecolumnStopinarea}\oarg{pages}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\onecolumnStopinarea}[6][all]{% + \onecolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\onecolumnDtopinarea} +% Special case for \gls{dynamic}. +% Syntax:\newline +% \cs{onecolumnDtopinarea}\oarg{pages}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\onecolumnDtopinarea}[6][all]{% + \onecolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumntop} +% Now for two \glspl{flow}, with a single \meta{type} frame +% above both of them. +% Syntax:\newline +% \cs{twocolumntop}\oarg{pages}\marg{type}\marg{H} +% +% First the special case where the area is the entire +% \gls{typeblock}: +% \begin{macrocode} +\newcommand*{\twocolumntop}[3][all]{% + \twocolumntopinarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}% +} +\@onlypreamble{\twocolumntop} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnStop} +% Special case for \gls{static}. +% \begin{macrocode} +\newcommand*{\twocolumnStop}[2][all]{% + \@twocolumntopinarea[#1]{static}{#2}{\textwidth}{\textheight}{0pt}{0pt}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnDtop} +% Special case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\twocolumnDtop}[2][all]{% + \twocolumntop[#1]{dynamic}{#2}% +} +% \end{macrocode} +%\end{macro} +% +% Now for a general area. +%\begin{macro}{\twocolumntopinarea} +% Syntax:\newline +% \cs{twocolumntopinarea}\oarg{pages}\marg{type}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\twocolumntopinarea}{\@twocolumntopinarea} +\newcommand*{\@twocolumntopinarea}[7][all]{% + \setlength{\@ff@staticH}{#3}% +% \end{macrocode} +% work out where to put the static frame +% \begin{macrocode} + \setlength{\@ff@tmp@y}{#5}% + \addtolength{\@ff@tmp@y}{-\@ff@staticH}% + \setlength{\columnheight}{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#7}% + \newframe[#1]{#2}{#4}{\@ff@staticH}{#6}{\@ff@tmp@y}% +% \end{macrocode} +% work out height of the flow frames +% \begin{macrocode} + \addtolength{\columnheight}{-\vcolumnsep}% + \ifffvadjust\adjustheight{\columnheight}\fi +% \end{macrocode} +% work out the widths of the flow frames +% \begin{macrocode} + \setlength{\columnwidth}{#4}% + \addtolength{\columnwidth}{-\columnsep}% + \divide\columnwidth by 2\relax +% \end{macrocode} +% work out the offset of the right column +% \begin{macrocode} + \setlength{\@ff@tmp@x}{\columnwidth}% + \addtolength{\@ff@tmp@x}{\columnsep}% + \addtolength{\@ff@tmp@x}{#6}% + \iflefttorightcolumns + \@n@wflowframe[#1]{\columnwidth}{\columnheight}{#6}{#7}% + \setflowframe{\c@maxflow}{margin=left}% + \else + \@n@wflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#7}% + \setflowframe{\c@maxflow}{margin=right}% + \fi + \iflefttorightcolumns + \@n@wflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#7}% + \setflowframe{\c@maxflow}{margin=right}% + \else + \@n@wflowframe[#1]{\columnwidth}{\columnheight}{#6}{#7}% + \setflowframe{\c@maxflow}{margin=left}% + \fi +} +\@onlypreamble{\twocolumntopinarea} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnStopinarea} +% Special case for \gls{static}. +% \begin{macrocode} +\newcommand*{\twocolumnStopinarea}[6][all]{% + \twocolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnDtopinarea} +% Special case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\twocolumnDtopinarea}[6][all]{% + \twocolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\Ncolumntop} +% Similarly for an arbitrary number of \glspl{flow}. +% Special case where the area is the \gls{typeblock}. +% +% Syntax:\newline +% \cs{Ncolumntop}\oarg{pages}\marg{type}\marg{n}\marg{H} +% \begin{macrocode} +\newcommand*{\Ncolumntop}[4][all]{% + \Ncolumntopinarea[#1]{#2}{#3}{#4}{\textwidth}{\textheight}{0pt}{0pt}% +} +\@onlypreamble{\Ncolumntop} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NcolumnStop} +% Special case for \gls{static}. +% \begin{macrocode} +\newcommand*{\NcolumnStop}[3][all]{% + \Ncolumntop[#1]{static}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NcolumnDtop} +% Special case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\NcolumnDtop}[3][all]{% + \Ncolumntop[#1]{dynamic}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\Ncolumntopinarea} +% Again test to make sure the user requested a sensible +% number. +% \begin{macrocode} +\newcommand*{\Ncolumntopinarea}[8][all]{% + \ifnum#3>2\relax + \@Ncolumntopinarea[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% + \else + \ifcase#3\relax + \PackageError{flowfram}% + {% + You have requested 0 flowframes!% + }% + {% + It does not make much sense to ask to create 0 flow frames% + }% + \or + \onecolumntopinarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \or + \twocolumntopinarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \else + \PackageError{flowfram}% + {% + Can't create a negative number of flow frames!% + }% + {% + You have asked for \number#3 \space flow frames + which really doesn't make sense% + }% + \fi + \fi +} +\@onlypreamble{\Ncolumntopinarea} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@Ncolumntopinarea} +% Fit the frames into specified area. +% Syntax:\newline +% \cs{Ncolumntopinarea}\oarg{pages}\marg{type}\marg{n}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\@Ncolumntopinarea}[8][all]{% + \setlength{\@ff@staticH}{#4}% +% \end{macrocode} +% work out where to put the static frame +% \begin{macrocode} + \setlength{\@ff@tmp@y}{#6}% + \addtolength{\@ff@tmp@y}{-\@ff@staticH}% + \setlength{\columnheight}{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#8}% + \newframe[#1]{#2}{#5}{\@ff@staticH}{#7}{\@ff@tmp@y}% +% \end{macrocode} +% work out height of the flow frames +% \begin{macrocode} + \addtolength{\columnheight}{-\vcolumnsep}% +% \end{macrocode} +% adjust the flow frame height so that it is a multiple of +% \cs{baselineskip} +% \begin{macrocode} + \ifffvadjust + \adjustheight{\columnheight}% + \fi +% \end{macrocode} +% work out the widths of the flow frames +% \begin{macrocode} + \@colN=#3\relax + \advance\@colN by -1\relax + \setlength{\columnwidth}{#5}% + \addtolength{\columnwidth}{-\@colN\columnsep}% + \divide\columnwidth by #3\relax +% \end{macrocode} +% Set the $x$ position of the first frame +% \begin{macrocode} + \setlength{\@ff@tmp@x}{#7}% + \iflefttorightcolumns + \else + \addtolength{\@ff@tmp@x}{#5}% + \addtolength{\@ff@tmp@x}{-\columnwidth}% + \fi + \@colN=0\relax + \loop + \advance\@colN by 1\relax + \newflowframe[#1]{\columnwidth}{\columnheight}{\@ff@tmp@x}{#8}% +% \end{macrocode} +% work out the offset for the next column +% \begin{macrocode} + \iflefttorightcolumns + \addtolength{\@ff@tmp@x}{\columnwidth}% + \addtolength{\@ff@tmp@x}{\columnsep}% + \else + \addtolength{\@ff@tmp@x}{-\columnwidth}% + \addtolength{\@ff@tmp@x}{-\columnsep}% + \fi + \ifnum\@colN<#3 + \repeat +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NcolumnStopinarea} +% Specific case for \gls{static}. +% \begin{macrocode} +\newcommand*{\NcolumnStopinarea}[7][all]{% + \Ncolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}{#7}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NcolumnDtopinarea} +% Specific case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\NcolumnDtopinarea}[7][all]{% + \Ncolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}{#7}% +} +% \end{macrocode} +%\end{macro} +% Now the same kind of thing but with the \meta{type} frame at the +% bottom. Firstly, a single \gls{flow} with a \meta{type} +% frame below it. +% +%\begin{macro}{\onecolumnbottom} +% Syntax:\newline +% \cs{onecolumnbottom}\oarg{pages}\marg{type}\marg{H} +% \begin{macrocode} +\newcommand*{\onecolumnbottom}[3][all]{% + \onecolumnbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}% +} +% \end{macrocode} +%\end{macro} +% This command may only be used in the preamble. +% \begin{macrocode} +\@onlypreamble{\onecolumnbottom} +% \end{macrocode} +%\begin{macro}{\onecolumnSbottom} +% Special case for \gls{static}. +% \begin{macrocode} +\newcommand*{\onecolumnSbottom}[2][all]{% + \onecolumnbottom[#1]{static}{#2}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\onecolumnDbottom} +% Special case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\onecolumnDbottom}[2][all]{% + \onecolumnbottom[#1]{dynamic}{#2}% +} +% \end{macrocode} +%\end{macro} +% +% General case of the above, but fit in specified area. +%\begin{macro}{\onecolumnbottominarea} +% Syntax:\newline +% \cs{onecolumnbottominarea}\oarg{pages}\marg{type}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y},\newline +% where \meta{H} is the \meta{type} frame's height. +% The area is defined by bottom +% left co-ordinates (\meta{x}, \meta{y}) width \meta{w}, and +% height \meta{h}. +% \begin{macrocode} +\newcommand*{\onecolumnbottominarea}[7][all]{% + \setlength{\@ff@staticH}{#3}% + \setlength{\columnheight}{#5}% + \addtolength{\columnheight}{-\@ff@staticH}% + \addtolength{\columnheight}{-\vcolumnsep}% + \ifffvadjust + \adjustheight{\columnheight}% + \fi + \setlength{\@ff@tmp@y}{#5}% + \addtolength{\@ff@tmp@y}{-\columnheight}% + \addtolength{\@ff@tmp@y}{#7}% + \newframe[#1]{#2}{#4}{\@ff@staticH}{#6}{#7}% + \newflowframe[#1]{#4}{\columnheight}{#6}{\@ff@tmp@y}% +} +% \end{macrocode} +%\end{macro} +% Again, this command may only be used in the preamble. +% \begin{macrocode} +\@onlypreamble{\onecolumnbottominarea} +% \end{macrocode} +%\begin{macro}{\onecolumnSbottominarea} +% Special case for \gls{static}. +% \begin{macrocode} +\newcommand*{\onecolumnSbottominarea}[6][all]{% + \onecolumnbottominarea[#1]{static}{#2}{#3}{#4}{#5}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\onecolumnDbottominarea} +% Special case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\onecolumnDbottominarea}[6][all]{% + \onecolumnbottominarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnbottom} +% Now for two \glspl{flow} side by side with a static +% frame underneath both of them. Firstly, the specific +% case where the area is the entire \gls{typeblock}. +% Syntax:\newline +% \cs{twocolumnbottom}\oarg{pages}\marg{type}\marg{H}. +% \begin{macrocode} +\newcommand*{\twocolumnbottom}[3][all]{% + \twocolumnSbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}% +} +\@onlypreamble{\twocolumnbottom} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnSbottom} +% Special case for \gls{static}. +% \begin{macrocode} +\newcommand*{\twocolumnSbottom}[2][all]{% + \twocolumnbottom[#1]{static}{#2}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnDbottom} +% Special case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\twocolumnDbottom}[2][all]{% + \twocolumnbottom[#1]{dynamic}{#2}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnbottominarea} +% Now for a general area. +% Syntax:\newline +% \cs{twocolumnbottominarea}\oarg{pages}\marg{type}\marg{H}\marg{w}\marg{h}\marg{x}\marg{y}. +% \begin{macrocode} +\newcommand*{\twocolumnbottominarea}[7][all]{% + \setlength{\@ff@staticW}{#4}% + \setlength{\@ff@staticH}{#3}% +% \end{macrocode} +% work out height of the flow frames +% \begin{macrocode} + \setlength{\columnheight}{#5}% + \addtolength{\columnheight}{-\@ff@staticH}% + \addtolength{\columnheight}{-\vcolumnsep}% + \ifffvadjust\adjustheight{\columnheight}\fi% + \newframe[#1]{#2}{\@ff@staticW}{\@ff@staticH}{#6}{#7}% +% \end{macrocode} +% work out the $y$ position of the flow frames +% \begin{macrocode} + \setlength{\@ff@tmp@y}{#5}% + \addtolength{\@ff@tmp@y}{-\columnheight}% + \addtolength{\@ff@tmp@y}{#7}% +% \end{macrocode} +% work out the widths of the flow frames +% \begin{macrocode} + \setlength{\columnwidth}{\@ff@staticW}% + \addtolength{\columnwidth}{-\columnsep}% + \divide\columnwidth by 2\relax +% \end{macrocode} +% work out the $x$ offset of the right column +% \begin{macrocode} + \setlength{\@ff@tmp@x}{\columnwidth}% + \addtolength{\@ff@tmp@x}{\columnsep}% + \addtolength{\@ff@tmp@x}{#6}% +% \end{macrocode} +% Define the frames +% \begin{macrocode} + \iflefttorightcolumns + \newflowframe[#1]{\columnwidth}{\columnheight}{#6}{\@ff@tmp@y}% + \setflowframe{\c@maxflow}{margin=left}% + \else + \newflowframe[#1]{\columnwidth}{\columnheight}% + {\@ff@tmp@x}{\@ff@tmp@y}% + \setflowframe{\c@maxflow}{margin=right}% + \fi + \iflefttorightcolumns + \newflowframe[#1]{\columnwidth}{\columnheight}% + {\@ff@tmp@x}{\@ff@tmp@y}% + \setflowframe{\c@maxflow}{margin=right}% + \else + \newflowframe[#1]{\columnwidth}{\columnheight}{#6}{\@ff@tmp@y}% + \setflowframe{\c@maxflow}{margin=left}% + \fi +} +\@onlypreamble{\twocolumnbottominarea} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnSbottominarea} +% Special case for \gls{static}. +% \begin{macrocode} +\newcommand*{\twocolumnSbottominarea}[6][all]{% + \twocolumnbottominarea[#1]{static}{#2}{#3}{#4}{#5}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\twocolumnDbottominarea} +% Special case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\twocolumnDbottominarea}[6][all]{% + \twocolumnbottominarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}% +} +% \end{macrocode} +%\end{macro} +% Now for an arbitrary number of parallel \glspl{flow} +% with a \gls{static} beneath all of them. +% +%\begin{macro}{\Ncolumnbottom} +% First make them fill the entire \gls{typeblock}. +% Syntax:\newline +% \cs{Ncolumnbottom}\oarg{pages}\marg{type}\marg{H}. +% \begin{macrocode} +\newcommand*{\Ncolumnbottom}[4][all]{% + \Ncolumnbottominarea[#1]{#2}{#3}{#4}{\textwidth}{\textheight}{0pt}{0pt}% +} +\@onlypreamble{\Ncolumnbottom} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NcolumnSbottom} +% Special case for \gls{static}. +% \begin{macrocode} +\newcommand*{\NcolumnSbottom}[3][all]{% + \Ncolumnbottom[#1]{static}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NcolumnDbottom} +% Special case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\NcolumnDbottom}[3][all]{% + \Ncolumnbottom[#1]{dynamic}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\Ncolumnbottominarea} +% Again check the user has requested a sensible number. +% \begin{macrocode} +\newcommand*{\Ncolumnbottominarea}[8][all]{% + \ifnum#3>2\relax + \@Ncolumnbottominarea[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% + \else + \ifcase#3\relax + \PackageError{flowfram}{% + You have requested 0 flowframes!}{% + It does not make much sense to ask to create 0 flow frames} + \or + \onecolumnbottominarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \or + \twocolumnbottominarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \else + \PackageError{flowfram}% + {% + Can't create a negative number of flow frames!% + }% + {% + You have asked for \number#3 \space flow frames + which really doesn't make sense% + }% + \fi + \fi +} +\@onlypreamble{\Ncolumnbottominarea} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@NcolumnSbottominarea} +% An arbitrary number of columns with a \gls{static} +% underneath them all, filling the specified area. +% \begin{macrocode} +\newcommand*{\@NcolumnSbottominarea}[8][all]{% + \setlength{\@ff@staticH}{#4}% +% \end{macrocode} +% work out height of the flow frames +% \begin{macrocode} + \setlength{\columnheight}{#6}% + \addtolength{\columnheight}{-\@ff@staticH}% + \addtolength{\columnheight}{-\vcolumnsep}% +% \end{macrocode} +% adjust the flow frame height so that it is a multiple of +% \cs{baselineskip} +% \begin{macrocode} + \ifffvadjust + \adjustheight{\columnheight}% + \fi + \newframe[#1]{#2}{#5}{\@ff@staticH}{#7}{#8}% +% \end{macrocode} +% work out the $y$ offset of the flow frames +% \begin{macrocode} + \setlength{\@ff@tmp@y}{#6}% + \addtolength{\@ff@tmp@y}{-\columnheight}% + \addtolength{\@ff@tmp@y}{#8}% +% \end{macrocode} +% work out the widths of the flow frames +% \begin{macrocode} + \@colN=#3\relax + \advance\@colN by -1\relax + \setlength{\columnwidth}{#5}% + \addtolength{\columnwidth}{-\@colN\columnsep}% + \divide\columnwidth by #3\relax +% \end{macrocode} +% Set the $x$ offset of the first frame. +% \begin{macrocode} + \setlength{\@ff@tmp@x}{#7}% + \iflefttorightcolumns + \else + \addtolength{\@ff@tmp@x}{#5}% + \addtolength{\@ff@tmp@x}{-\columnwidth}% + \fi + \@colN=0\relax + \loop + \advance\@colN by 1\relax + \newflowframe[#1]{\columnwidth}{\columnheight}% + {\@ff@tmp@x}{\@ff@tmp@y}% +% \end{macrocode} +% work out the offset for the next column +% \begin{macrocode} + \iflefttorightcolumns + \addtolength{\@ff@tmp@x}{\columnwidth}% + \addtolength{\@ff@tmp@x}{\columnsep}% + \else + \addtolength{\@ff@tmp@x}{-\columnwidth}% + \addtolength{\@ff@tmp@x}{-\columnsep}% + \fi + \ifnum\@colN<#3 + \repeat +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NcolumnSbottominarea} +% Specific case for \gls{static}. +% \begin{macrocode} +\newcommand*{\NcolumnSbottominarea}[1][all]{% + \Ncolumnbottominarea[#1]{static}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NcolumnDbottominarea} +% Specific case for \gls{dynamic}. +% \begin{macrocode} +\newcommand*{\NcolumnDbottominarea}[1][all]{% + \Ncolumnbottominarea[#1]{dynamic}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\adjustheight} +% Given a height "#1" (a length), adjust it so that it is a multiple of "\baselineskip". +% \begin{macrocode} +\newcount\@ff@adjh +\newcommand*{\adjustheight}[1]{% +% \end{macrocode} +% convert to an integer +% \begin{macrocode} + \@ff@adjh=#1\relax + \divide\@ff@adjh by \baselineskip\relax + #1=\baselineskip\relax + \multiply#1 by \@ff@adjh\relax +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\adjustcolsep} +% Adjust the value of "\columnsep" so that the margins will fit between columns. +% \begin{macrocode} +\newcommand*{\adjustcolsep}{% + \multiply\columnsep by 2\relax + \addtolength{\columnsep}{\marginparwidth}% +} +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Backdrop Effects} +% Set up some commands to make \glspl{static} for different styles +% of backdrop. +%\begin{macro}{\vtwotone} +% Syntax:\newline +% \cs{vtwotone}\oarg{pages}\oarg{xoffset}\marg{W1}\marg{C1}\marg{L1}\marg{W2}\marg{C2}\marg{L2} +%\newline where the first frame +% has width \meta{W1} with background colour \meta{C1} and label \meta{L1}. +% The second frame has width \meta{W2} with background colour \meta{C2} +% and label \meta{L2}. Unlike earlier commands, the $x$-offset is +% relative to the left page edge \emph{not} the \gls{typeblock}. +% This is because they are designed for backdrops, which +% tend to span the entire page. +% Note that the colour specs must be +% completely enclosed in braces. e.g.\ "{[gray]{0.5}}" \emph{not} "[gray]{0.5}". +% +% Need a length to store the width of the \gls{static}. +% \begin{macrocode} +\newlength\@ff@staticW +% \end{macrocode} +% Vertical two tone effect where the height of the static +% frames is equal to the paper height. +% \begin{macrocode} +\newcommand*{\vtwotone}[1][all]{% + \def\ff@pages{#1}% + \@vtwotone +} + +\newcommand*{\@vtwotone}[1][0pt]{\@@vtwotonebottom{#1}{\paperheight}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\vtwotonebottom} +% Vertical two tone effect along the bottom of the page, of +% height \meta{H}. +% Syntax:\newline +% \cs{vtwotonebottom}\oarg{pages}\oarg{xoffset}\marg{H}\marg{W1}\marg{C1}\marg{L1}\marg{W2}\marg{C2}\marg{L2} +% where the first frame starts at \meta{xoffset}. +% \begin{macrocode} +\newcommand*{\@@vtwotonebottom}[8]{% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@x}{#1}% + \addtolength{\@ff@tmp@x@even}{#1}% + \@nextvband{\ff@pages}{#2}{#3}{#4}{#5}% + \@nextvband{\ff@pages}{#2}{#6}{#7}{#8}% +} + +\@onlypreamble{\vtwotone} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\vtwotonebottom} +% Border strip along the bottom of the page +% \begin{macrocode} +\newcommand*{\vtwotonebottom}[1][all]{% + \def\ff@pages{#1}% + \@vtwotonebottom +} + +\@onlypreamble{\vtwotonebottom} + +\newcommand*{\@vtwotonebottom}[2][0pt]{\@@vtwotonebottom{#1}{#2}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\vtwotonetop} +% Border strip along the top of the page +% \begin{macrocode} +\newcommand*{\vtwotonetop}[1][all]{% + \def\ff@pages{#1}% + \@vtwotonetop +} + +\newcommand*{\@vtwotonetop}[2][0pt]{\@@vtwotonetop{#1}{#2}} + +\newcommand*{\@@vtwotonetop}[8]{% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computetopedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{-#2}% + \addtolength{\@ff@tmp@x}{#1}% + \addtolength{\@ff@tmp@x@even}{#1}% + \@nextvband{\ff@pages}{#2}{#3}{#4}{#5}% + \@nextvband{\ff@pages}{#2}{#6}{#7}{#8}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@nextvband} +% Make next \gls{static}. Syntax:\newline +% \cs{@nextvband}\marg{pages}\marg{height}\marg{width}\marg{colour specs}\marg{label}\newline +% $x$ and $y$ offsets are given by "\@ff@tmp@x" and "\@ff@tmp@y". +% On exit, "\@ff@tmp@x" is set to the right border. +% \begin{macrocode} +\newcommand*{\@nextvband}[5]{% + \setlength{\@ff@staticW}{#3}% + \ifthenelse{\equal{#5}{}}% + {% + \newstaticframe[#1]{\@ff@staticW}{#2}{\@ff@tmp@x}{\@ff@tmp@y}% + }% + {% + \newstaticframe[#1]{\@ff@staticW}{#2}{\@ff@tmp@x}{\@ff@tmp@y}[#5]% + }% + \expandafter\global\expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{% + \@ff@tmp@x@even}% + \@setframecol#4\end{\c@maxstatic}{backcol}{sf}% + \addtolength{\@ff@tmp@x}{\@ff@staticW}% + \addtolength{\@ff@tmp@x@even}{\@ff@staticW}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\vNtone} +% Similarly for N colours. Syntax:\newline +% \cs{vNtone}\oarg{pages}\oarg{xoffset}\marg{n}\marg{W1}\marg{C1}\marg{L1}\ldots\marg{Wn}\marg{Cn}\marg{Ln}\newline +% where the first frame has width \meta{W1} with background +% colour \meta{C1} and label \meta{L1} all the way up to +% the \meta{n}th frame which has width \meta{Wn}, background +% colour \meta{Cn} and \gls{idl} \meta{Ln}. +% +% Keep track of which strip we are doing. +% \begin{macrocode} +\newcount\@thisstrip +% \end{macrocode} +% This command needs two optional arguments, so store +% first optional argument, and look for the next. +% \begin{macrocode} +\newcommand*{\vNtone}[1][all]{% + \def\ff@pages{#1}% + \@vNtone +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@vNtone} +% Got the first argument, now get the next. +% \begin{macrocode} +\newcommand*{\@vNtone}[2][0pt]{% + \@@vNtone{#1}{#2}{\paperheight}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@vNtone} +% Vertical \meta{n} tone aligned along the +% bottom of the page with height "#3". +% \begin{macrocode} +\newcommand*{\@@vNtone}[3]{% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@x}{#1}% + \addtolength{\@ff@tmp@x@even}{#1}% + \@thisstrip=#2\relax + \setlength{\@ff@staticH}{#3}% + \@nextvNband +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@nextvNband} +% Recursively do the next strip. +% \begin{macrocode} +\newcommand*{\@nextvNband}{% + \ifnum\@thisstrip>0\relax + \let\flf@next\@@nextvNband + \else + \let\flf@next\relax + \fi + \advance\@thisstrip by -1\relax + \flf@next +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@nextvNband} +% Do current strip, and go on to next one. +% \begin{macrocode} +\newcommand*{\@@nextvNband}[3]{% + \@nextvband{\ff@pages}{\@ff@staticH}{#1}{#2}{#3}% + \@nextvNband +} + +\@onlypreamble{\vNtone} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\vNtonebottom} +% Border strip along the bottom of the page. Same as above +% but user specifies the height. +% \begin{macrocode} +\newcommand*{\vNtonebottom}[1][all]{% + \def\ff@pages{#1}% + \@vNtonebottom +} +\@onlypreamble{\vNtonebottom} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@vNtonebottom} +% \begin{macrocode} +\newcommand*{\@vNtonebottom}[3][0pt]{% + \@@vNtone{#1}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\vNtonetop} +% Border strip along the top of the page. Again two +% optional arguments are required. Get first optional +% argument. +% \begin{macrocode} +\newcommand*{\vNtonetop}[1][all]{% + \def\ff@pages{#1}% + \@vNtonetop +} +\@onlypreamble{\vNtonetop} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@vNtonetop} +% Get next optional argument. +% \begin{macrocode} +\newcommand*{\@vNtonetop}[3][0pt]{% + \@@vNtonetop{#1}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@vNtonetop} +% Now get on with it. Again, it has to be done +% recursively. +% \begin{macrocode} +\newcommand*{\@@vNtonetop}[3]{% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computetopedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{-#3}% + \addtolength{\@ff@tmp@x}{#1}% + \addtolength{\@ff@tmp@x@even}{#1}% + \@thisstrip=#2\relax + \setlength{\@ff@staticH}{#3}% + \@nextvNband% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\htwotone} +% Now do horizontal strips. Syntax:\newline +% \cs{htwotone}\oarg{pages}\oarg{y offset}\marg{H1}\marg{C1}\marg{L1}\marg{H2}\marg{C2}\marg{L2} +% \begin{macrocode} +\newcommand*{\htwotone}[1][all]{% + \def\ff@pages{#1}% + \@htwotone +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@htwotone} +% \begin{macrocode} +\newcommand*{\@htwotone}[1][0pt]{\@@htwotoneleft{#1}{\paperwidth}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@htwotoneleft} +% This is all done in much the same way as the vertical +% strips. +% \begin{macrocode} +\newcommand*{\@@htwotoneleft}[8]{% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#1}% + \@nexthband{\ff@pages}{#2}{#3}{#4}{#5}% + \@nexthband{\ff@pages}{#2}{#6}{#7}{#8}% +} + +\@onlypreamble{\htwotone} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\htwotoneleft} +% Two tone horizontal strips along left border +% Syntax: \cs{htwotoneleft}\oarg{pages}\oarg{y offset}\marg{width}\marg{H1}\marg{C1}\marg{L1}\marg{H2}\marg{C2}\marg{L2} +% \begin{macrocode} +\newcommand*{\htwotoneleft}[1][all]{% + \def\ff@pages{#1}% + \@htwotoneleft +} +\@onlypreamble{\htwotoneleft} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@htwotoneleft} +% \begin{macrocode} +\newcommand*{\@htwotoneleft}[2][0pt]{\@@htwotoneleft{#1}{#2}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\htwotoneright} +% Two tone horizontal strips along right border +% \begin{macrocode} +\newcommand*{\htwotoneright}[1][all]{% + \def\ff@pages{#1}% + \@htwotoneright +} +\@onlypreamble{\htwotoneright} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@htwotoneright} +% \begin{macrocode} +\newcommand*{\@htwotoneright}[2][0pt]{\@@htwotoneright{#1}{#2}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@htwotoneright} +% \begin{macrocode} +\newcommand*{\@@htwotoneright}[8]{% + \computerightedgeodd{\@ff@tmp@x}% + \if@twoside + \computerightedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#1}% + \addtolength{\@ff@tmp@x}{-#2}% + \addtolength{\@ff@tmp@x@even}{-#2}% + \@nexthband{\ff@pages}{#2}{#3}{#4}{#5}% + \@nexthband{\ff@pages}{#2}{#6}{#7}{#8}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\hNtone} +% Now for \meta{N} coloured horizontal strips +% \begin{macrocode} +\newcommand*{\hNtone}[1][all]{% + \def\ff@pages{#1}% + \@hNtone +} +\@onlypreamble{\hNtone} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@hNtone} +% \begin{macrocode} +\newcommand*{\@hNtone}[2][0pt]{% + \@@hNtone{#1}{#2}{\paperwidth}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@hNtone} +% \begin{macrocode} +\newcommand*{\@@hNtone}[3]{% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#1}% + \@thisstrip=#2\relax + \setlength{\@ff@staticW}{#3}% + \@nexthNband +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\hNtoneleft} +% Now for the N tone strips along the left border +% \begin{macrocode} +\newcommand*{\hNtoneleft}[1][all]{% + \def\ff@pages{#1}% + \@hNtoneleft +} +\@onlypreamble{\hNtoneleft} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@hNtoneleft} +% \begin{macrocode} +\newcommand*{\@hNtoneleft}[3][0pt]{% + \@@hNtone{#1}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\hNtoneright} +% Border strip along the right border +% \begin{macrocode} +\newcommand*{\hNtoneright}[1][all]{% + \def\ff@pages{#1}% + \@hNtoneright +} +\@onlypreamble{\hNtoneright} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@hNtoneright} +% \begin{macrocode} +\newcommand*{\@hNtoneright}[3][0pt]{% + \@@hNtoneright{#1}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@hNtoneright} +% \begin{macrocode} +\newcommand*{\@@hNtoneright}[3]{% + \computerightedgeodd{\@ff@tmp@x}% + \if@twoside + \computerightedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#1}% + \addtolength{\@ff@tmp@x}{-#3}% + \addtolength{\@ff@tmp@x@even}{-#3}% + \@thisstrip=#2\relax + \setlength{\@ff@staticW}{#3}% + \@nexthNband +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@nexthband} +% Make next \gls{static}. Syntax:\newline +% \cs{@nexthband}\marg{pages}\marg{width}\marg{height}\marg{colour specs}\marg{label}\newline +% $x$ and $y$ offsets are given by "\@ff@tmp@x" and "\@ff@tmp@y". +% On exit, "\@ff@tmp@y" is set to the top border. +% \begin{macrocode} +\newcommand*{\@nexthband}[5]{% + \setlength{\@ff@staticH}{#3}% + \ifthenelse{\equal{#5}{}}% + {% + \newstaticframe[#1]{#2}{\@ff@staticH}{\@ff@tmp@x}{\@ff@tmp@y}% + }% + {% + \newstaticframe[#1]{#2}{\@ff@staticH}{\@ff@tmp@x}{\@ff@tmp@y}[#5]% + }% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname + {\@ff@tmp@x@even}% + \@setframecol#4\end{\c@maxstatic}{backcol}{sf}% + \addtolength{\@ff@tmp@y}{\@ff@staticH}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@nexthNband} +% Get next horizontal strip recursively. +% \begin{macrocode} +\newcommand*{\@nexthNband}{% + \ifnum\@thisstrip>0\relax + \let\flf@next\@@nexthNband + \else + \let\flf@next\relax + \fi + \advance\@thisstrip by -1\relax + \flf@next +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@nexthNband} +% \begin{macrocode} +\newcommand*{\@@nexthNband}[3]{% + \@nexthband{\ff@pages}{\@ff@staticW}{#1}{#2}{#3}% + \@nexthNband +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\makebackgroundframe} +% Make one big \gls{static} that covers the entire page. +% This command should come before all other commands that create +% \glspl{static}, otherwise it will obscure all the ones defined +% before it. Syntax:\newline +% \cs{makebackgroundframe}\oarg{pages}\oarg{label}. +% \begin{macrocode} +\newcommand*{\makebackgroundframe}[1][all]{% + \ifnum\c@maxstatic>0\relax + \PackageWarning{flowfram}% + {% + Background frame is not first static frame to be + defined. All previously defined static frames may be + obscured.% + }% + \fi + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \newstaticframe[#1]{\paperwidth}{\paperheight}{\@ff@tmp@x}% + {\@ff@tmp@y}% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname + {\@ff@tmp@x@even}% +} +% \end{macrocode} +%\end{macro} +% +%\subsubsection{Lines Between Frames} +%\DescribeMacro{\insertvrule} +% Insert a \gls{static} between two frames with a vertical +% 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{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 +% by \meta{y bottom}. +% +%\begin{macro}{\ffcolumnseprule} +% This has changed in v1.09. Define "\ffcolumnseprule" and use +% instead of "\columnseprule" +% \begin{macrocode} +\newlength\ffcolumnseprule +\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. +% \begin{macrocode} +\newcommand*{\insertvrule}{\@ifstar\@sinsertvrule\@insertvrule} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@insertvrule} +% Two optional arguments required. +% \begin{macrocode} +\newcommand*{\@insertvrule}[1][0pt]{% + \@ifnextchar[{\@@insertvrule[#1]}{\@@insertvrule[#1][0pt]}% +} +% \end{macrocode} +%\end{macro} +% Need some lengths: +% \begin{macrocode} +\newlength\@ff@left@x +\newlength\@ff@left@y +\newlength\@ff@left@evenx +\newlength\@ff@left@eveny +\newlength\@ff@left@width +\newlength\@ff@left@height +% \end{macrocode} +%\begin{macro}{\@@insertvrule} +% Arguments all accounted for. Convert the frame type +% into a number to make life easier +% \begin{macrocode} +\def\@@insertvrule[#1][#2]#3#4#5#6{% + \ifthenelse{\equal{#3}{flow}}% + {% + \def\@ff@type@i{1}% + }% + {% + \ifthenelse{\equal{#3}{static}}% + {% + \def\@ff@type@i{2}% + }% + {% + \ifthenelse{\equal{#3}{dynamic}}% + {% + \def\@ff@type@i{3}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#3'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \ifthenelse{\equal{#5}{flow}}% + {% + \def\@ff@type@ii{1}% + }% + {% + \ifthenelse{\equal{#5}{static}}% + {% + \def\@ff@type@ii{2}% + }% + {% + \ifthenelse{\equal{#5}{dynamic}}% + {% + \def\@ff@type@ii{3}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#5'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \@@insert@vrule{#1}{#2}{\@ff@type@i}{#4}{\@ff@type@ii}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@insert@vrule} +% Insert a new \gls{static} between the two specified frames. +% Check to make sure which one is on the left and which one +% is on the right. +% Syntax:\newline +%\cs{@@insert@vrule}\marg{y top}\marg{y bottom}\marg{type ID}\marg{IDN}\marg{type ID}\marg{IDN}. +% \begin{macrocode} +\newcommand*{\@@insert@vrule}[6]{% + \@ff@getdim{#3}{#4}% + \setlength{\@ff@left@x}{\ffareax}% + \setlength{\@ff@left@y}{\ffareay}% + \setlength{\@ff@left@width}{\ffareawidth}% + \setlength{\@ff@left@height}{\ffareaheight}% + \@ff@getdim{#5}{#6}% + \ifnum\@ff@left@x>\ffareax\relax + \@ff@swaplen{\@ff@left@x}{\ffareax}% + \@ff@swaplen{\@ff@left@y}{\ffareax}% + \@ff@swaplen{\@ff@left@evenx}{\ffareaevenx}% + \@ff@swaplen{\@ff@left@eveny}{\ffareaevenx}% + \@ff@swaplen{\@ff@left@width}{\ffareawidth}% + \@ff@swaplen{\@ff@left@height}{\ffareaheight}% + \fi + \setlength{\@ff@tmp@x}{\@ff@left@x} + \addtolength{\@ff@tmp@x}{\@ff@left@width}% + \setlength{\@ff@staticW}{\ffareax}% + \addtolength{\@ff@staticW}{-\@ff@tmp@x}% + \setlength{\@ff@staticH}{\@ff@left@y}% + \addtolength{\@ff@staticH}{\@ff@left@height}% + \setlength{\@ff@tmp@y}{\ffareay}% + \addtolength{\@ff@tmp@y}{\ffareaheight}% + \ifnum\@ff@tmp@y>\@ff@staticH + \setlength{\@ff@staticH}{\@ff@tmp@y}% + \fi + \ifnum\@ff@left@y<\ffareay\relax + \setlength{\@ff@tmp@y}{\@ff@left@y}% + \else + \setlength{\@ff@tmp@y}{\ffareay}% + \fi + \addtolength{\@ff@staticH}{-\@ff@tmp@y}% + \newstaticframe{\@ff@staticW}{\@ff@staticH}% + {\@ff@tmp@x}{\@ff@tmp@y}% + \addtolength{\@ff@staticH}{#1}% + \addtolength{\@ff@staticH}{#2}% + \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}% + \or \edef\@ff@pages{\csname @df@pages@\romannumeral#4\endcsname}% + \fi + \setstaticframe{\c@maxstatic}{pages=\@ff@pages}% +% \end{macrocode} +% Check the difference between odd and even page co-ordinates +% and shift new frame in same direction. (Assumes the two +% original frames stay in the same relative position.) +% \begin{macrocode} + \addtolength{\@ff@tmp@x}{\@ff@left@evenx}% + \addtolength{\@ff@tmp@x}{-\@ff@left@x}% + \addtolength{\@ff@tmp@y}{\@ff@left@eveny}% + \addtolength{\@ff@tmp@y}{-\@ff@left@y}% + \setstaticframe{\c@maxstatic}{evenx=\@ff@tmp@x,eveny=\@ff@tmp@y}% +} +% \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} +\newcommand*{\@sinsertvrule}[1][0pt]{% + \@ifnextchar[{\@@sinsertvrule[#1]}{\@@sinsertvrule[#1][0pt]}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@sinsertvrule} +% Find out the frame types and their \gls{idn}. +% \begin{macrocode} +\def\@@sinsertvrule[#1][#2]#3#4#5#6{% + \ifthenelse{\equal{#3}{flow}}% + {% + \def\@ff@type@i{1}% + \@flowframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \ifthenelse{\equal{#3}{static}}% + {% + \def\@ff@type@i{2}\@staticframeid{#4}\@ff@tmpN=\ff@id + }% + {% + \ifthenelse{\equal{#3}{dynamic}}% + {% + \def\@ff@type@i{3}% + \@dynamicframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#3'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \ifthenelse{\equal{#5}{flow}}% + {% + \def\@ff@type@ii{1}\@flowframeid{#6}% + }% + {% + \ifthenelse{\equal{#5}{static}}% + {% + \def\@ff@type@ii{2}% + \@staticframeid{#6}% + }% + {% + \ifthenelse{\equal{#5}{dynamic}}% + {% + \def\@ff@type@ii{3}% + \@dynamicframeid{#6}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#5'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \@@insert@vrule{#1}{#2}{\@ff@type@i}{\@ff@tmpN}% + {\@ff@type@ii}{\ff@id}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\inserthrule} +% Now for a horizontal rule. Syntax similar to "\insertvrule". +% Determine whether or not the starred version is being +% used. +% \begin{macrocode} +\newcommand*{\inserthrule}{\@ifstar\@sinserthrule\@inserthrule} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@inserthrule} +% Two optional arguments required. +% \begin{macrocode} +\newcommand*{\@inserthrule}[1][0pt]{% + \@ifnextchar[{\@@inserthrule[#1]}{\@@inserthrule[#1][0pt]}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@inserthrule} +% Arguments all accounted for. Convert the frame type +% into a number to make life easier +% \begin{macrocode} +\def\@@inserthrule[#1][#2]#3#4#5#6{% + \ifthenelse{\equal{#3}{flow}}% + {% + \def\@ff@type@i{1}% + }% + {% + \ifthenelse{\equal{#3}{static}}% + {% + \def\@ff@type@i{2}% + }% + {% + \ifthenelse{\equal{#3}{dynamic}}% + {% + \def\@ff@type@i{3}}% + {% + \PackageError{flowfram}% + {Unknown frame type '#3'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \ifthenelse{\equal{#5}{flow}}% + {% + \def\@ff@type@ii{1}% + }% + {% + \ifthenelse{\equal{#5}{static}}% + {% + \def\@ff@type@ii{2}% + }% + {% + \ifthenelse{\equal{#5}{dynamic}}% + {% + \def\@ff@type@ii{3}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#5'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \@@insert@hrule{#1}{#2}{\@ff@type@i}{#4}{\@ff@type@ii}{#6}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@insert@hrule} +% Insert a new \gls{static} between the two specified frames. +% Check to make sure which one is on the top and which one +% is on the bottom. +% Syntax:\newline +%\cs{@@insert@hrule}\marg{x left}\marg{x right}\marg{type ID}\marg{IDN}\marg{type ID}\marg{IDN}. +% \begin{macrocode} +\newcommand*{\@@insert@hrule}[6]{% + \@ff@getdim{#3}{#4}% + \setlength{\@ff@left@x}{\ffareax}% + \setlength{\@ff@left@y}{\ffareay}% + \setlength{\@ff@left@width}{\ffareawidth}% + \setlength{\@ff@left@height}{\ffareaheight}% + \@ff@getdim{#5}{#6}% + \ifnum\@ff@left@y>\ffareay\relax + \@ff@swaplen{\@ff@left@x}{\ffareax}% + \@ff@swaplen{\@ff@left@y}{\ffareay}% + \@ff@swaplen{\@ff@left@width}{\ffareawidth}% + \@ff@swaplen{\@ff@left@height}{\ffareaheight}% + \fi + \setlength{\@ff@tmp@y}{\@ff@left@y}% + \addtolength{\@ff@tmp@y}{\@ff@left@height}% + \setlength{\@ff@staticH}{\ffareay}% + \addtolength{\@ff@staticH}{-\@ff@tmp@y}% + \setlength{\@ff@staticW}{\@ff@left@x}% + \addtolength{\@ff@staticW}{\@ff@left@width}% + \setlength{\@ff@tmp@x}{\ffareax}% + \addtolength{\@ff@tmp@x}{\ffareawidth}% + \ifnum\@ff@tmp@x>\@ff@staticW\relax + \setlength{\@ff@staticW}{\@ff@tmp@x}% + \fi + \ifnum\@ff@left@x<\ffareax\relax + \setlength{\@ff@tmp@x}{\@ff@left@x}% + \else + \setlength{\@ff@tmp@x}{\ffareax}% + \fi + \addtolength{\@ff@staticW}{-\@ff@tmp@x}% + \newstaticframe{\@ff@staticW}{\@ff@staticH}% + {\@ff@tmp@x}{\@ff@tmp@y}% + \addtolength{\@ff@staticW}{#1}% + \addtolength{\@ff@staticW}{#2}% + \setstaticcontents{\c@maxstatic}% + {% + \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}% + \or \edef\@ff@pages{\csname @df@pages@\romannumeral#4\endcsname}% + \fi + \setstaticframe{\c@maxstatic}{pages=\@ff@pages}% + \addtolength{\@ff@tmp@x}{\@ff@left@evenx}% + \addtolength{\@ff@tmp@x}{-\@ff@left@x}% + \addtolength{\@ff@tmp@y}{\@ff@left@eveny}% + \addtolength{\@ff@tmp@y}{-\@ff@left@y}% + \setstaticframe{\c@maxstatic}{evenx=\@ff@tmp@x,eveny=\@ff@tmp@y}% +} +% \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} +\newcommand*{\@sinserthrule}[1][0pt]{% + \@ifnextchar[{\@@sinserthrule[#1]}{\@@sinserthrule[#1][0pt]}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@sinserthrule} +% Find out the frame types and their \gls{idn}. +% \begin{macrocode} +\def\@@sinserthrule[#1][#2]#3#4#5#6{% + \ifthenelse{\equal{#3}{flow}}% + {% + \def\@ff@type@i{1}% + \@flowframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \ifthenelse{\equal{#3}{static}}% + {% + \def\@ff@type@i{2}% + \@staticframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \ifthenelse{\equal{#3}{dynamic}}% + {% + \def\@ff@type@i{3}% + \@dynamicframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#3'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \ifthenelse{\equal{#5}{flow}}% + {% + \def\@ff@type@ii{1}% + \@flowframeid{#6}% + }% + {% + \ifthenelse{\equal{#5}{static}}% + {% + \def\@ff@type@ii{2}% + \@staticframeid{#6}% + }% + {% + \ifthenelse{\equal{#5}{dynamic}}% + {% + \def\@ff@type@ii{3}% + \@dynamicframeid{#6}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#5'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \@@insert@hrule{#1}{#2}{\@ff@type@i}{\@ff@tmpN}% + {\@ff@type@ii}{\ff@id}% +} +% \end{macrocode} +%\end{macro} +% +% \subsection{Putting Chapter Headings in Dynamic Frames} +%\begin{macro}{\dfchaphead} +% Provide facility to make chapter headings appear +% in specified \gls{dynamic}. +% I originally called this macro "\putchapterheadingsindynamicframe" +% which was descriptive, but overly long, so I changed it +% to the rather more cryptic name "\dfchaphead". +% If the starred form is used, the frame is identified by \gls{idl}, +% the unstarred form identifies the frame \gls{idn}. +% \begin{macrocode} +\newcommand*{\dfchaphead}{% + \@ifstar\@sdynamicchap\@dynamicchap +} +% \end{macrocode} +%\end{macro} +% Define style for the chapter heading. These commands +% are should only be used when "\dfchaphead" has been used. +%\begin{macro}{\DFchapterstyle} +% \begin{macrocode} +\newcommand{\DFchapterstyle}[1]{#1} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DFschapterstyle} +% \begin{macrocode} +\newcommand{\DFschapterstyle}[1]{#1} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dynamicchap} +% Unstarred version. +% \begin{macrocode} +\newcommand{\@dynamicchap}[1]{% + \@ifundefined{chapter}% + {% + \PackageError{flowfram}% + {Chapters aren't defined}% + {% + The document class you are using does not + define chapters% + }% + }% + {% +% \end{macrocode} +% Store current chapter head definitions for starred and unstarred +% versions +% \begin{macrocode} + \let\@ff@OLDmakechapterhead\@makechapterhead + \let\@ff@OLDmakeschapterhead\@makeschapterhead +% \end{macrocode} +% Define user commands that can be redefined to modify the chapter +% head style (in the event that the user is using a class that +% doesn't provide an easy means to do this.) +% \begin{macrocode} + \renewcommand{\DFchapterstyle}[1]{\@ff@OLDmakechapterhead{##1}}% + \renewcommand{\DFschapterstyle}[1]{\@ff@OLDmakeschapterhead{##1}}% +% \end{macrocode} +% Redefine chapter heads so that they put their contents in the +% requested dynamic frame. First the unstarred version: +% \begin{macrocode} + \xdef\@makechapterhead##1{% + \noexpand\@setdynamiccontents{\number#1}% + {% + \noexpand\DFchapterstyle{##1}% + }% + }% +% \end{macrocode} +% Now the starred version: +% \begin{macrocode} + \xdef\@makeschapterhead##1{% + \noexpand\@setdynamiccontents{\number#1}% + {% + \noexpand\DFschapterstyle{##1}% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@sdynamicchap} +% Starred form. +% \begin{macrocode} +\newcommand{\@sdynamicchap}[1]{% + \@dynamicframeid{#1}% + \@dynamicchap{\ff@id}% +} +% \end{macrocode} +%\end{macro} +% There is no facility for placing other sectional types +% in \glspl{dynamic}. This is because, either (1) the sectioning +% command does not start a new page, in which case there +% is no way of telling where exactly the new section will start, +% and having a section title in some other location on the +% page is ambiguous, and would really confuse the reader, or +% (2) in the case of "\part" in report or book class files, the +% title appears on a page of its own, so where is the point in +% putting it in a \gls{dynamic}? +% +%\subsection{Thumbtabs} +% Define counter to keep track of total number of +% thumbtabs. +% \begin{macrocode} +\newcounter{maxthumbtabs} +% \end{macrocode} +%\begin{macro}{\defaultthumbtabtype} +% Check to see if chapters are defined, if they are make +% thumbtabs correspond to chapters, otherwise make +% thumbtabs correspond to sections. +% \begin{macrocode} +\@ifundefined{chapter}% +{% + \newcommand*{\defaultthumbtabtype}{section}% +}% +{% + \newcommand*{\defaultthumbtabtype}{chapter}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ttb@type} +% Section type to assign to thumbtabs. +% \begin{macrocode} +\newcommand*{\@ttb@type}{\defaultthumbtabtype} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\makethumbtabs} +% Make the thumbtabs. Read in information from ".ttb" +% file, and open it for output. +% Syntax:\newline +% \cs{makethumbtabs}\oarg{y offset}\marg{height}\oarg{sec type}. +% +% First check to see if there is a second optional argument. +% \begin{macrocode} +\newcommand*{\makethumbtabs}[2][0pt]{% + \@ifnextchar[% + {\@makethumbtabs[#1]{#2}}% + {% + \@makethumbtabs[#1]{#2}[\defaultthumbtabtype]% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@makethumbtabs} +% Now all arguments are known, first redefine the +% appropriate sectioning command, then input the ttb file, +% and create the thumbtabs. +% \begin{macrocode} +\def\@makethumbtabs[#1]#2[#3]{% + \@ifundefined{#3}% + {% + \PackageError{flowfram}% + {% + Unknown section type '#3'% + }% + {}% + }% + {% + \renewcommand{\@ttb@type}{#3}% + \ifthenelse{\equal{#3}{chapter}}% + {% + \@makethumbchapter + }% + {% + \ifthenelse{\equal{#3}{part}}% + {\@makethumbpart}% + {% + \@makethumbsection{#3}% + }% + }% + }% + \@starttoc{ttb}% + \@dothumbtabs{#1}{#2}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@makethumbchapter} +% If thumbtabs correspond to chapters, redefine "\@chapter" +% so that each unstarred chapter writes an entry to the +% ".ttb" file. +% \begin{macrocode} +\newcommand{\@makethumbchapter}{% + \let\@ttb@old@chapter\@chapter + \def\@chapter[##1]##2{% + \@ttb@old@chapter[##1]{##2}% + \addtocontents{ttb}{\protect\thumbtab + {\thepage}{\thechapter}{##1}{chapter.\thechapter}}% + \@afterheading + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@makethumbpart} +% For parts in books or reports, the thumbtab needs to be +% saved after the part counter has been incremented, but +% before the page break so that the page number and part +% numbers are correct. If "\@endpart" is not defined, then +% the document class probably does not start a new page after +% "\part". (This can't be guaranteed for non standard class +% files, but there's nothing that can be done about that.) +% If this happens, just redefine "\@part", and hope for the +% best. +% \begin{macrocode} +\newcommand{\@makethumbpart}{% + \let\@ttb@old@part\@part + \@ifundefined{@endpart}% + {% + \def\@part[##1]##2{% + \@ttb@old@part[##1]{##2}% + \addtocontents{ttb}{\protect\thumbtab + {\thepage}{\thepart}{##1}{part.\thepage}}% + \@afterheading + }% + }% + {% + \let\@ttb@old@endpart\@endpart + \def\@part[##1]##2{% + \def\@parttitle{##1}% + \@ttb@old@part[##1]{##2}% + }% + \def\@endpart{% + \addtocontents{ttb}% + {% + \protect\thumbtab{\thepage}% + {\thepart}{\@parttitle}{part.\thepage}% + }% + \@ttb@old@endpart + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@makethumbsection} +% Thumbtabs defined for one of the remaining standard +% sectioning commands. Since these commands use +% "\@startsection", it is necessary to redefine +% "\@sect" to add the thumbtab information to the .ttb file. +% \begin{macrocode} +\newcommand*{\@makethumbsection}[1]{% + \let\@ttb@old@sect=\@sect + \def\@sect##1##2##3##4##5##6[##7]##8{% + \@ttb@old@sect{##1}{##2}{##3}{##4}{##5}{##6}[##7]{##8}% + \ifthenelse{\equal{##1}{#1}}% + {% + \addtocontents{ttb}% + {% + \protect\thumbtab{\thepage}{\csname the#1\endcsname}% + {##7}{#1.\csname the#1\endcsname}% + }% + \@afterheading + }% + {}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\thumbtab} +% The thumbtab file, ".ttb", will have a series of "\thumbtab" +% commands, when this file is read in, just store the +% information for now. +% \begin{macrocode} +\newcommand{\thumbtab}[4]{% + \stepcounter{maxthumbtabs}% + \expandafter + \gdef\csname thumbtab@pages@\romannumeral\c@maxthumbtabs\endcsname{#1}% + \expandafter + \gdef\csname thumbtab@num@\romannumeral\c@maxthumbtabs\endcsname{#2}% + \expandafter + \gdef\csname thumbtab@title@\romannumeral\c@maxthumbtabs\endcsname{#3}% + \expandafter + \gdef\csname thumbtab@link@\romannumeral\c@maxthumbtabs\endcsname{#4}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dothumbtabs} +% Once the thumbtab information has been read in and stored +% in the thumbtab macros, create the thumbtabs using this +% information. First need to work out the \glspl{pgrange} between +% each thumbtab. If the following thumbtab starts on the +% same page as the previous one, leave the page varable +% as a single number (this may happen if the thumbtabs +% correspond to sections rather than chapters). If the +% following thumbtab starts on a different page to the +% one before it, the preceding thumbtab page variable so +% be a range from its own initial page up to the page before +% the next thumbtab starts. The final thumbtab has an open +% ended range. This final thumbtab will continue to be displayed +% until cancelled by "\disablethumbtabs". +% +% Syntax: \cs{@dothumbtabs}\marg{y offset}\marg{height}. +% \begin{macrocode} +\newcommand*{\@dothumbtabs}[2]{% + \@colN=0\relax + \whiledo{\@colN<\c@maxthumbtabs}% + {% + \advance\@colN by 1\relax + \edef\ff@pages{% + \csname thumbtab@pages@\romannumeral\@colN\endcsname}% + \ifnum\@colN=\c@maxthumbtabs + \expandafter + \xdef\csname thumbtab@pages@\romannumeral\@colN\endcsname{% + \ff@pages,>\ff@pages}% + \else + \advance\@colN by 1\relax + \edef\ff@endpage{% + \csname thumbtab@pages@\romannumeral\@colN\endcsname}% + \advance\@colN by -1\relax + \@ff@tmpN=\ff@endpage\relax + \advance\@ff@tmpN by -1\relax + \ifnum\@ff@tmpN>\ff@pages + \expandafter + \xdef\csname thumbtab@pages@\romannumeral\@colN\endcsname{% + \ff@pages-\number\@ff@tmpN}% + \fi + \fi + }% + \@@dothumbtabs{#1}{#2}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\thumbtabwidth} +% Default thumbtab width. +% \begin{macrocode} +\newlength{\thumbtabwidth} +\setlength{\thumbtabwidth}{1cm} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\thumbtabindexformat} +% Thumbtab format. If hyperlinks have been defined, +% use a hyperlink in the thumbtab index. +% Syntax: \cs{thumbtabindexformat}\marg{link}\marg{text}\marg{height} +% \begin{macrocode} +\@ifundefined{hyperlink}% +{% + \newcommand{\thumbtabindexformat}[3]{% + \thumbtabformat{#2}{#3}% + }% +}% +{% + \newcommand{\thumbtabindexformat}[3]{% + \hyperlink{#1}{\thumbtabformat{#2}{#3}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\thumbtabformat} +% Individual thumbtab format. If rotating has +% been disabled, stack the letters vertically (this +% doesn't look very good). +% Syntax: \cs{thumbtabformat}\marg{text}\marg{height} +% \begin{macrocode} +\newcommand{\thumbtabformat}[2]{% + \if@ttb@rotate + \rotatebox{-90}% + {% + \parbox[c][\thumbtabwidth]{#2}{% + \centering#1% + }% + }% + \else + \parbox[c][#2]{\thumbtabwidth}{% + \centering\@ttb@stack{#1}% + }% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@flf@subsp} +% Substitute spaces for \cs{space}. Stores resulting text in +% \cs{@flf@subsptext} which should be set to empty before use. +%\changes{1.10}{2007/08/21}{new} +% \begin{macrocode} +\def\@flf@subsp#1 #2{% + \expandafter\flf@ta\expandafter{\@flf@subsptext}% + \flf@tb{#1}% + \edef\@flf@subsptext{\the\flf@ta\the\flf@tb}% + \def\@flf@tmp{#2}% + \ifx\@flf@tmp\@nnil + \let\@flf@donextsubsp=\@gobble + \else + \expandafter\flf@ta\expandafter{\@flf@subsptext}% + \edef\@flf@subsptext{\the\flf@ta\noexpand\space}% + \let\@flf@donextsubsp=\@flf@subsp + \fi + \@flf@donextsubsp{#2}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ttb@stack} +% Stack letters vertically. +% Any spaces first need to be substituted +% with \cs{space}, otherwise they will be ignored. +%\changes{1.10}{2007/08/21}{spaces now replaced with \cs{space}} +% \begin{macrocode} +\newcommand{\@ttb@stack}[1]{% + \def\@flf@subsptext{}% + \expandafter\@flf@subsp#1 \@nil\relax + \begin{tabular}{l}% + \expandafter\@@ttb@stack\@flf@subsptext\@nil\relax + \end{tabular}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@ttb@stack} +%\changes{1.10}{2007/08/21}{now uses \cs{mbox}} +% \begin{macrocode} +\def\@@ttb@stack#1#2{% + \def\@flf@tmp{#1}% + \ifx\@flf@tmp\@nnil + \let\flf@next\relax + \else + #1\\% + \def\@flf@tmp{#2}% + \ifx\@nnil#2\relax + \let\flf@next\@gobble + \else + \let\flf@next\@@ttb@stack + \fi + \fi + \flf@next{#2}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@greyscale} +% Count register to compute the grey scale. +% \begin{macrocode} +\newcount\@greyscale +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@dothumbtabs} +% Once the \gls{pgrange} have been sorted, create the +% \glspl{dynamic} associated with each thumbtab. +% Thumbtabs will initially have a grey background, but +% this can be changed by the user. Each thumbtab is given +% an \gls{idl} "thumbtab"\meta{n} where \meta{n} is the index of +% the thumbtab (starting from 1 for the topmost thumbtab.) +% Each frame in the thumbtab index is given an \gls{idl} +% "thumbtabindex"\meta{n}, where \meta{n} is as before. +% \begin{macrocode} +\newcommand{\@@dothumbtabs}[2]{% + \setlength{\@ff@tmp@y}{\textheight}% + \addtolength{\@ff@tmp@y}{-#2}% + \addtolength{\@ff@tmp@y}{-#1}% + \computerightedgeodd{\@ff@tmp@x}% + \addtolength{\@ff@tmp@x}{-\thumbtabwidth}% + \computeleftedgeeven{\@ff@tmp@x@even}% + \@ff@tmpN=0\relax + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \@greyscale=\@ff@tmpN\relax + \multiply\@greyscale by 60\relax + \divide\@greyscale by \c@maxthumbtabs + \advance\@greyscale by 25\relax + \edef\@ff@greyscale{0.\number\@greyscale}% +% \end{macrocode} +% Thumbtab +% \begin{macrocode} + \newdynamicframe[none]{\thumbtabwidth}{#2}% + {\@ff@tmp@x}{\@ff@tmp@y}[thumbtab\number\@ff@tmpN]% + \expandafter\global\expandafter + \setlength\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname + {\@ff@tmp@x@even}% +% \end{macrocode} +% set the contents of the dynamic frame +% \begin{macrocode} + \ifthenelse{\boolean{@ttb@title}\and\boolean{@ttb@num}}% + {% + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabformat + {% + \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname\ + \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + }% + {% + \if@ttb@title + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabformat + {% + \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + \fi + \if@ttb@num + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabformat + {% + \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + \fi + }% + \expandafter + \xdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname + {[gray]{\@ff@greyscale}} +% \end{macrocode} +% Thumbtab index +% \begin{macrocode} + \newdynamicframe[none]{\thumbtabwidth}{#2}% + {\@ff@tmp@x}{\@ff@tmp@y}[thumbtabindex\number\@ff@tmpN]% + \expandafter\global\expandafter + \setlength\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname + {\@ff@tmp@x@even}% + \expandafter +% \end{macrocode} +% set the contents of the dynamic frame +% \begin{macrocode} + \ifthenelse{\boolean{@ttb@title}\and\boolean{@ttb@num}}% + {% + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabindexformat + {% + \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname + }% + {% + \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname\ + \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + }% + {% + \if@ttb@title + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabindexformat + {% + \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname + }% + {% + \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + \fi + \if@ttb@num + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabindexformat + {% + \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname + }% + {% + \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + \fi + }% + \expandafter + \xdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname + {[gray]{\@ff@greyscale}} + \addtolength{\@ff@tmp@y}{-#2}% + }% +}% +% \end{macrocode} +%\end{macro} +%\begin{macro}{\enablethumbtabs} +% Enable thumbtabs. Once the \gls{idn} is obtained for the +% first thumbtab, the rest can be found by incrementing the +% number by 2 (the frames in between correspond to the +% thumbtab index.) +% \begin{macrocode} +\newcommand*{\enablethumbtabs}{% + \ifnum\c@maxthumbtabs>0\relax + \@ff@tmpN=0\relax + \@dynamicframeid{thumbtab1}% + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax +% \end{macrocode} +% thumbtab +% \begin{macrocode} + \edef\@ff@pages{\csname thumbtab@pages@\romannumeral\@ff@tmpN\endcsname}% + \@@setdynamicframe{\ff@id}{pages=\@ff@pages}% + \advance\ff@id by 2\relax + }% + \else + \PackageWarning{flowfram}{No thumb tabs defined}% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\disablethumbtabs} +% Disable all thumbtabs. +% \begin{macrocode} +\newcommand*{\disablethumbtabs}{% + \ifnum\c@maxthumbtabs>0\relax + \@ff@tmpN=0\relax + \@dynamicframeid{thumbtab1}% + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax +% \end{macrocode} +% Thumbtab: +% \begin{macrocode} + \expandafter\xdef\csname @df@pages@\romannumeral\ff@id\endcsname + {none}% + \advance\ff@id by 1\relax +% \end{macrocode} +% Thumbtab index: +% \begin{macrocode} + \expandafter\xdef\csname @df@pages@\romannumeral\ff@id\endcsname + {none}% + \advance\ff@id by 1\relax + }% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\thumbtabindex} +% Show thumbtab index on current page. +% The "\@ff@doafter" bit circumvents the problem of duplicate page +% numbers, as the table of contents +% is quite frequently on page~i while the first chapter starts on page~1. +% \begin{macrocode} +\newcommand*{\thumbtabindex}{% + \ifnum\c@maxthumbtabs>0\relax + \@ff@tmpN=0\relax + \@dynamicframeid{thumbtabindex1}% + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \expandafter + \xdef\csname @df@pages@\romannumeral\ff@id\endcsname{\c@page}% + \edef\@ff@doafter{% + \noexpand\afterpage + {% + \noexpand\setdynamicframe{\number\ff@id}{pages=none}% + }% + }% + \@ff@doafter + \advance\ff@id by 2\relax + }% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\setthumbtab} +% Modify the settings for all the thumbtabs (including thumbtab +% index). Since the thumbtabs are \glspl{dynamic} +% you could just use "\setdynamicframe", however, the thumbtabs +% will not be generated on the first run, as there will be no +% information in the ttb file, so "\setdynamicframe" would +% generate an error. "\setthumbtab" will only give +% a warning message if it can not find the thumbtab. +% The argument "#1" is the index of the thumbtab (starting +% from 1), the second argument "#2" is the +% frame settings. +% \begin{macrocode} +\newcommand{\setthumbtab}[2]{% + \ifthenelse{\equal{#1}{all}}% + {% + \@ff@tmpN=0\relax + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \@setthumbtab{\@ff@tmpN}{#2}% + }% + }% + {% + \@for\@ttb@id:=#1\do{\@setthumbtab{\@ttb@id}{#2}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@setthumbtab} +% Set individual thumbtab and its index tab. +% \begin{macrocode} +\newcommand{\@setthumbtab}[2]{% +% \end{macrocode} +% Check if this thumbtab exists +% \begin{macrocode} + \ifthenelse{\(\c@maxthumbtabs<#1\) \or \(#1<1\)}% + {% + \PackageWarning{flowfram}% + {% + Can't find thumbtab number '#1', ttb file may not be + up-to-date% + }% + }% + {% + \@dynamicframeid{thumbtab\number#1}% + \@@setdynamicframe{\ff@id}{#2}% + \@dynamicframeid{thumbtabindex\number#1}% + \@@setdynamicframe{\ff@id}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\setthumbtabindex} +% Only change settings for the thumbtab index. This can +% take a comma-separated number list. +% \begin{macrocode} +\newcommand{\setthumbtabindex}[2]{% + \ifthenelse{\equal{#1}{all}}% + {% + \@ff@tmpN=0\relax + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \@setthumbtabindex{\@ff@tmpN}{#2}% + }% + }% + {% + \@for\@ttb@id:=#1\do{\@setthumbtabindex{\@ttb@id}{#2}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@setthumbtabindex} +% Change setting for individual thumbtab index entry. +% \begin{macrocode} +\newcommand{\@setthumbtabindex}[2]{% +% \end{macrocode} +% Check if this thumbtab exists +% \begin{macrocode} + \ifthenelse{\(\c@maxthumbtabs<#1\) \or \(#1<1\)}% + {% + \PackageWarning{flowfram}% + {% + Can't find thumbtab number `\number#1', + ttb file may not be up-to-date% + }% + }% + {% + \@dynamicframeid{thumbtabindex\number#1}% + \@@setdynamicframe{\ff@id}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\tocandhumbtabindex} +% Do both the table of contents and the thumbtab index +% \begin{macrocode} +\newcommand*{\tocandthumbtabindex}{% + \aligntoctrue + \tableofcontents + \thumbtabindex + \aligntocfalse +} +% \end{macrocode} +%\end{macro} +% +% \subsection{Minitocs} +%\begin{macro}{\@ttb@minitoctype} +% Sectioning type for the minitoc, by default it is the +% same as the thumbtabs +% \begin{macrocode} +\newcommand*{\@ttb@minitoctype}{\@ttb@type} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@starttoc} +% In order to align the table of contents with the thumbtabs, +% or to use minitocs, the toc information must be stored, +% rather than simply input. +% Therefore, modify "\@starttoc" so that it can store the contents +% of the file. "\if@storetoc" is used to determine whether +% to store the contents, or act as normal. +% \begin{macrocode} +\let\@ttb@old@starttoc\@starttoc +\newif\if@storetoc +\@storetocfalse +\renewcommand*{\@starttoc}[1]{% + \if@storetoc + \@ttb@storetoc{#1}% + \else + \@ttb@old@starttoc{#1}% + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@ttb@storetoc} +% store the contents of the file with the given extension +% \begin{macrocode} +\newcommand*{\@ttb@storetoc}[1]{% + \begingroup + \makeatletter + \@storefileconts{\jobname.#1}% + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout\csname tf@#1\endcsname\jobname.#1\relax + \fi + \@nobreakfalse + \endgroup +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@storefileconts} +% Store the contents of named file, if it exists. +%\changes{1.10}{2007/08/21}{uses \cs{PackageInfo} instead of +% \cs{typeout}} +% \begin{macrocode} +\newcommand*{\@storefileconts}[1]{% + \IfFileExists{#1}% + {% + \@@storefileconts\@filef@und + }% + {% + \PackageInfo{flowfram}{No file #1.}% + }% +} +% \end{macrocode} +%\end{macro} +% store the number of units corresponding to the +% thumbtab type, and minitoc units. These will usually +% have the same value, but this is not always +% guaranteed. +%\begin{macro}{\c@maxtocunits} +% Total number of toc units +% \begin{macrocode} +\newcount\c@maxtocunits +% \end{macrocode} +%\end{macro} +%\begin{macro}{\c@maxminitoc} +% Total number of minitoc units +% \begin{macrocode} +\newcount\c@maxminitoc +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@storefileconts} +% Read each line in from the file, and add to the contents +% list. +% \begin{macrocode} +\newcommand{\@@storefileconts}[1]{% + \@ifundefined{\@ttb@minitoctype}% + {% + \@ttb@minitoclevel=6\relax + }% + {% + \expandafter\@ttb@minitoclevel\expandafter + =\csname @ttb@\@ttb@minitoctype @level\endcsname + }% + \newread\@ttb@toc + \openin\@ttb@toc=#1\relax + \c@maxtocunits=0\relax + \c@maxminitoc=0\relax + \whiledo{\not\boolean{eof}\@ttb@toc}% + {% + \read\@ttb@toc to\tocline + \@addtotoclist{\tocline}{\c@maxtocunits}% + }% + \closein\@ttb@toc +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@addtotoclist} +% Before each line is added to the contents list, it is +% first checked to see whether the line starts with +% "\contentsline". If it does, then check to see if the +% sectioning type corresponds to the thumbtab level. If +% it does, then start a new list. There will be "\c@maxtocunits" +% lists, each one corresponding to each thumbtab group. +% In addition, each contents line needs to be added to +% the minitoclists, but only if the sectioning type level +% is greater than "\@ttb@minitoctype". The number of minitoc +% lists is given by "\c@maxminitoc". +% \begin{macrocode} +\newif\if@contsline +\newcount\@ttb@level +\newcount\@ttb@minitoclevel + +\newcommand{\@addtotoclist}[2]{% + \expandafter\@checkcontentsline#1\end + \if@contsline + \expandafter\@gettype#1\end + \ifthenelse{\equal{\@ttb@contstype}{\@ttb@type}}% + {% + \global\advance#2 by 1\relax + }% + {}% + \fi + \@ifundefined{@toc@\romannumeral#2}% + {% + \flf@ta=\expandafter{#1}% + \expandafter\xdef\csname @toc@\romannumeral#2\endcsname{\the\flf@ta}% + }% + {% + \flf@ta=\expandafter{#1}% + \flf@tb=\expandafter\expandafter\expandafter + {\csname @toc@\romannumeral#2\endcsname}% + \expandafter\xdef\csname @toc@\romannumeral#2\endcsname{% + \the\flf@tb\the\flf@ta}% + }% +% \end{macrocode} +% now do minitoc stuff. If the sectioning type is unknown, +% assume it comes last +% \begin{macrocode} + \if@minitoc + \if@contsline + \@ifundefined{\@ttb@contstype}% + {\@ttb@level=6}% + {% + \@ttb@level=\csname @ttb@\@ttb@contstype @level\endcsname + }% + \relax + \ifnum\@ttb@level=\@ttb@minitoclevel + \global\advance\c@maxminitoc by 1\relax + \expandafter + \gdef\csname @minitoc@\romannumeral\c@maxminitoc\endcsname{}% + \else + \ifnum\@ttb@level>\@ttb@minitoclevel + \flf@ta=\expandafter{#1}\relax + \flf@tb=\expandafter\expandafter\expandafter + {\csname @minitoc@\romannumeral\c@maxminitoc\endcsname}\relax + \expandafter + \xdef\csname @minitoc@\romannumeral\c@maxminitoc\endcsname{% + \the\flf@tb\the\flf@ta} + \fi + \fi + \fi + \fi +} +% \end{macrocode} +%\end{macro} +% Is there already a way of determining the sectioning +% level from its name? +% \begin{macrocode} +\def\@ttb@part@level{-1} +\def\@ttb@chapter@level{0} +\def\@ttb@section@level{1} +\def\@ttb@subsection@level{2} +\def\@ttb@subsubsection@level{3} +\def\@ttb@paragraph@level{4} +\def\@ttb@subparagraph@level{5} +% \end{macrocode} +%\begin{macro}{\@checkcontentsline} +% Check to see if line starts with "\contentsline" +% \begin{macrocode} +\long\def\@checkcontentsline#1#2\end{% + \ifx#1\contentsline + \@contslinetrue + \else + \@contslinefalse + \fi +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@gettype} +% Given that the line starts with "\contentsline", extract +% the first argument of "\contentsline" to get the sectioning +% type. +% \begin{macrocode} +\def\@gettype\contentsline#1#2\end{% + \def\@ttb@contstype{#1}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\tableofcontents} +% Modify "\tableofcontents". It first stores the contents +% of the toc file, and then, either simply prints it on the +% page (so it appears no different to the standard +% "\tableofcontents"), or it prints it out so that each +% thumbtab unit has the same height as the thumbtabs. +% Note: this assumes that the actual table of contents +% starts at the same height as the thumbtabs. The thumbtab +% vertical position may need to be adjusted to compensate +% for space taken up by the contents title. +% \begin{macrocode} +\newif\ifaligntoc +\aligntocfalse +% \end{macrocode} +% Save original definition of "\tableofcontents" +% \begin{macrocode} +\let\@ttb@old@tableofcontents\tableofcontents +% \end{macrocode} +% Redefine "\tableofcontents" +% \begin{macrocode} +\renewcommand{\tableofcontents}{% + \@storetoctrue + \@ttb@old@tableofcontents + \ifaligntoc + \@printalignedtoc + \else + \@printtoc + \fi + \@storetocfalse + \global\c@minitoc=0\relax +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\beforeminitocskip} +% Vertical space to add before minitoc. +% \begin{macrocode} +\newlength\beforeminitocskip +\setlength{\beforeminitocskip}{0pt} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\afterminitocskip} +% Vertical space to add after minitoc. +% \begin{macrocode} +\newlength\afterminitocskip +\setlength{\afterminitocskip}{\baselineskip} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\dominitoc} +% Do the minitoc for unit "#1". Check first that +% minitocs have been enabled. +% \begin{macrocode} +\newcommand*{\dominitoc}[1]{% + \if@minitoc + \@dominitoc{#1}% + \fi +} +\newcommand*{\@dominitoc}[1]{\@@dominitoc{#1}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\minitocstyle} +% Style in which to display the minitoc. +% \begin{macrocode} +\newcommand{\minitocstyle}[1]{% + \normalfont\normalsize\normalcolor + #1% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@@dominitoc} +% Now do the actual minitoc for unit "#1". +% \begin{macrocode} +\newcommand*{\@@dominitoc}[1]{% + {% + \minitocstyle + {% + \vskip\beforeminitocskip + \csname @minitoc@\romannumeral#1\endcsname + }% + }% + \vskip\afterminitocskip +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\appenddfminitoc} +% Modify "\dominitoc" so that the minitoc is appended +% to specified \gls{dynamic}. Starred version uses +% \gls{dynamic} \gls{idl}, unstarred version uses \gls{dynamic} +% \gls{idn}. I originally called this macro "\appendminitoctodynamicframe" +% but decided it was too long, for I've opted instead +% for a slightly more cryptic name. +% \begin{macrocode} +\newcommand*{\appenddfminitoc}{% + \renewcommand{\beforeminitocskip}{\baselineskip}% + \@ifstar\@sappendminitocdf\@appendminitocdf +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@sappendminitocdf} +% Starred version +% \begin{macrocode} +\newcommand*{\@sappendminitocdf}[1]{% + \renewcommand{\@dominitoc}[1]{% + \@sappenddynamic{#1}{\@@dominitoc{##1}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@appendminitocdf} +% Unstarred version +% \begin{macrocode} +\newcommand*{\@appendminitocdf}[1]{% + \renewcommand{\@dominitoc}[1]{% + \@appenddynamic{#1}{\@@dominitoc{##1}}% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@printtoc} +% Do the table of contents, which has been stored +% in "\c@maxtocunits" macros. (or possibly +% "\c@maxtocunits + 1", if information was added +% before the first group---which corresponds to +% "\@colN=0".) +% \begin{macrocode} +\newcommand*{\@printtoc}{% + \@colN=0\relax + \csname @toc@\romannumeral\@colN\endcsname + \whiledo{\@colN<\c@maxtocunits}% + {% + \advance\@colN by 1\relax + \csname @toc@\romannumeral\@colN\endcsname + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@printalignedtoc} +% Print the table of contents so that each unit is +% has vertical height the same as the height of the +% thumbtabs. Note that you may have to adjust the +% vertical offset of the thumbtabs (in "\makethumbtabs") +% in order to make them correctly aligned. +% \begin{macrocode} +\newcommand{\@printalignedtoc}{% + \@ff@tmpN=0\relax + \@ifundefined{@toc@\romannumeral\@ff@tmpN}% + {}% + {% + \csname @toc@\romannumeral\@ff@tmpN\endcsname + \par\noindent\hrulefill + }% + \whiledo{\@ff@tmpN<\c@maxtocunits}% + {% + \advance\@ff@tmpN by 1\relax + \ifnum\@ff@tmpN>\c@maxthumbtabs + \csname @toc@\romannumeral\@ff@tmpN\endcsname + \else + \@dynamicframeid{thumbtabindex\number\@ff@tmpN}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @df@dim@\romannumeral\ff@id\endcsname + \vbox to \@ff@tmp@y + {% + \noindent\parbox{\linewidth}% + {% + \csname @toc@\romannumeral\@ff@tmpN\endcsname + }% + \vfill + \par\noindent\hrulefill + }% + \fi + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\enableminitoc} +% Make mini tocs appear at the start of given sectional unit. +% \begin{macrocode} +\newcounter{minitoc} +\newif\if@minitoc +\@minitocfalse + +\newcommand*{\enableminitoc}[1][\@ttb@type]{% + \@minitoctrue + \setcounter{minitoc}{0}% + \@ifundefined{#1}% + {% + \PackageError{flowfram}{Sectioning type `#1' not defined}{}% + }% + {% + \renewcommand{\@ttb@minitoctype}{#1}% + \ifthenelse{\equal{#1}{chapter}}% + {% + \@makeminitocchapter + }% + {% + \ifthenelse{\equal{#1}{part}}% + {\@makeminitocpart}% + {% + \@makeminitocsection{#1}% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +% This command should only appear in the preamble. (This +% ensures that it is used before "\tableofcontents". +% \begin{macrocode} +\@onlypreamble{\enableminitoc} +% \end{macrocode} +%\begin{macro}{\@makeminitocchapter} +% If minitocs are associated with chapters, redefine +% "\@chapter" so that the minitoc appears after the +% chapter heading. +% \begin{macrocode} +\newcommand{\@makeminitocchapter}{% + \let\@mtoc@old@chapter\@chapter + \def\@chapter[##1]##2{% + \@mtoc@old@chapter[##1]{##2}% + \stepcounter{minitoc}% + \dominitoc{\c@minitoc}% + \@afterheading + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@makeminitocpart} +% Again, for parts. As before, need to redefine +% "\@endpart" if it exists, otherwise redefine +% "\@part". +% \begin{macrocode} +\newcommand{\@makeminitocpart}{% + \@ifundefined{@endpart}% + {% + \let\@mtoc@old@part\@part + \def\@part[##1]##2{% + \@mtoc@old@part[##1]{##2}% + \stepcounter{minitoc}% + \dominitoc{\c@minitoc}% + \@afterheading + }% + }% + {% + \let\@mtoc@old@endpart\@endpart + \def\@endpart{% + \stepcounter{minitoc}% + \dominitoc{\c@minitoc}% + \@mtoc@old@endpart + }% + }% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@makeminitocsection} +% Now for the remaining sectional units. +% \begin{macrocode} +\newcommand{\@makeminitocsection}[1]{% + \let\@mtoc@old@sect=\@sect + \def\@sect##1##2##3##4##5##6[##7]##8{% + \@mtoc@old@sect{##1}{##2}{##3}{##4}{##5}{##6}[##7]{##8}% + \ifthenelse{\equal{##1}{#1}}% + {% + \stepcounter{minitoc}% + \dominitoc{\c@minitoc}% + \@afterheading + }% + {}% + }% +} +% \end{macrocode} +%\end{macro} +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample-article.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass[a4paper]{article} + +\usepackage[margin=1in,top=1in,bottom=1in]{geometry} +\usepackage{url} +\usepackage{color} +\usepackage{flowfram} + +\newcommand{\sty}[1]{\textsf{#1}} +\newcommand{\env}[1]{\textsf{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + +% set up the document frames + +% frames for page 1 +\twocolumnStop[1]{2in} +\setstaticframe{1}{label=title} + +% frames for subsequent pages +\twocolumn[>1] + +\begin{document} +\begin{staticcontents*}{title} +\title{Creating Flow Frames for Posters or Magazines} +\author{Nicola L. C. Talbot\\[1cm]\url{http://www.dickimaw-books.com/}} +\date{} +\maketitle +\end{staticcontents*} + +This document is a sample document, see \linebreak +\texttt{ffuserguide.pdf} for +an up-to-date guide on how to use the \sty{flowfram} package. + +\section{Introduction} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters\marginpar{A marginal note} +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +\subsection{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\subsubsection{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border\footnote{A +footnote!}. + +\subsubsection{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\subsubsection{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\section{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\section{Miscellaneous} + +\subsection{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\subsection{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\subsection{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\subsection{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\subsection{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: +\marginpar{Another marginal note} + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. +\end{itemize} + + +\section*{Contact Details} + +Dr Nicola Talbot\\ +Dickimaw Books\\ +\url{http://www.dickimaw-books.com/} + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample-blanks.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass{article} + +\usepackage{lipsum} +\usepackage[draft]{flowfram} + +\onecolumn[odd] + +\newdynamicframe{1in}{1in}{-1in}{-1in} +\setdynamiccontents{1}{\arabic{absolutepage}-\arabic{page}} + +\begin{document} + +\lipsum[1-4] + +\lipsum[1-4] + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample-brochure.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass[a4paper]{report} + +\usepackage[landscape,margin=1in]{geometry} +\usepackage{color} +\usepackage{flowfram} +\usepackage[colorlinks]{hyperref} + +% Use sans-serif font as default font +\renewcommand{\familydefault}{cmss} + +% adjust \textheight so that it is an integer multiple of +% \baselineskip +\adjustheight{\textheight} + +% set up pagelayout. One column for title page +% two columns for the rest. +\onecolumninarea[1,2]{0.6\textwidth}{\textheight}{0.4\textwidth}{0pt} +\twocolumninarea[>2]{0.6\textwidth}{\textheight}{0.4\textwidth}{0pt} + +% Set up dynamic frame on the left. This is where +% the headings will go. + +\newdynamicframe{0.4\textwidth}{\textheight}{0pt}{0pt}[left] + +% put the chapter headings in this frame +\dfchaphead*{left} +% Modify the default style +\renewcommand{\DFchapterstyle}[1]{% +\raggedright\Huge\slshape\MakeUppercase{#1}\par} + +% Make static frames for background (only for page 1) +\vtwotone[1]{0.6\paperwidth}{[cmyk]{0.65,0.13,0,0}}{backleft}% +{0.4\paperwidth}{[cmyk]{0.94,0.54,0,0}}{backright} + +% Make a border along the top of each page +\vtwotonetop{1cm}{0.6\paperwidth}{[cmyk]{0.65,0.13,0,0}}{topleft}% +{0.4\paperwidth}{[cmyk]{0.94,0.54,0,0}}{topright} + +% make a static frame for the logo +\newstaticframe{0.2\textwidth}{0.25\textheight}{0pt}{0pt}[logo] + +% empty page style, because I am going to make my own +\pagestyle{empty} + +% Each new chapter sets \thispagestyle{\chapterfirstpagestyle}, change this empty as well +\renewcommand{\chapterfirstpagestyle}{empty} + +% Now make a frame in which to put my own customized footer +\newdynamicframe[>1]{\textwidth}{\headheight}{0pt}{-\footskip}[footer] + +% set the contents of the frame: +\setdynamiccontents*{footer}{% +School of Computing Sciences, University of East Anglia\hfill +http://www.cmp.uea.ac.uk/\hfill +page \thepage\ of \pageref*{lastpage}} + + +\newcommand{\env}[1]{\texttt{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + +\begin{document} + +% not a very interesting logo +\setstaticcontents*{logo}{\sffamily{\Huge\slshape FLF} Flowfram} + +{\noindent +\slshape\Huge\MakeUppercase{A Sample Brochure}\par +\vskip0.5in +\noindent\large\MakeUppercase{Nicola Talbot}\\ +} + + +\chapter{Introduction} + +The \textsl{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +This is a modified version of the manual for the \textsl{flowfram} package. +It is intended to illustrated what can be done. See the full +manual (ffuserguide.pdf) for +a comprehensive description, as some parts of this document +may now be out of date. +If the columns are very narrow, it may be better to +use \cmdname{raggedright}, otherwise \TeX\ may have a +problem working out the line breaks. + +This is column~\thedisplayedframe. + +The main type of frame is the flow frame. This is described on +column~\ref{flow:flowframe} on page~\pageref{flow:flowframe}. +The order used to draw the contents of each frame on the page +is described in column~\ref{flow:stacking} on +page~\pageref{flow:stacking}. Floats are describe in +column~\ref{flow:floats} on page~\pageref{flow:floats}. + +\chapter{Setting up Frames} + +This is column~\thedisplayedframe. + +The \textsl{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\section*{Flow Frames} + +\labelflow{flow:flowframe} +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border. + +It is recommended that all the flow frames in a document +have the same width, otherwise problems may occur +when a paragraph spans to flow frames of unequal +widths. This is because \TeX's output routine does not +register the change in \cmdname{hsize} until it reaches +a paragraph break. If it is absolutely necessary for +flow frames to have unequal widths, judicious use of +\cmdname{framebreak} is required. + +\section*{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\section*{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +This is column~\thedisplayedframe. + +\chapter{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}]\mbox{}\par The width of the frame. + +\item[height=\meta{length}]\mbox{}\par The height of the frame. + +\item[x=\meta{length}]\mbox{}\par The x-coordinate of the frame. + +\item[y=\meta{length}]\mbox{}\par The y-coordinate of the frame. + +\item[border=\meta{style}]\mbox{}\par The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}]\mbox{}\par The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \textsl{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}]\mbox{}\par The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, for example +\verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}]\mbox{}\par The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +for example \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}]\mbox{}\par The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}]\mbox{}\par The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}]\mbox{}\par This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\chapter{Miscellaneous} + +\section*{Page Layout} + +The \textsl{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\section*{Frame Stacking Order} + +\labelflow{flow:stacking} +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\section*{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\section*{Floats} + +\labelflow{flow:floats} +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\section*{Global Values} + +The following macros can be changed using\linebreak \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. + +\item \cmdname{columnsep} + +This is the horizontal distance between flow frames when using one of the +\cmdname{Ncolumn} type of commands + +\item \cmdname{vcolumnsep} + +This is the vertical distance between the flow frames and the static or +dynamic frame when using one of the \cmdname{Ncolumntop} type of commands. +\end{itemize} + +\label{lastpage} +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample-news.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass{article} + +\usepackage{color} +\usepackage{flowfram} +\usepackage[a5paper,top=10mm,bottom=10mm,margin=10mm]{geometry} +\usepackage{graphicx} + +% define lengths to help compute positions +\newlength\leftX +\newlength\leftY +\newlength\leftH +\newlength\leftW + +\newlength\rightX +\newlength\rightY +\newlength\rightH +\newlength\rightW + +% Create a static frame to put title in +\setlength{\leftH}{2cm} +\setlength{\leftY}{\textheight} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[title] + +% First flow frame. + +\setlength{\leftH}{7cm} +\adjustheight{\leftH} +\addtolength{\leftY}{-\leftH} +\setlength{\leftW}{0.5\textwidth} + +\newflowframe[1]{\leftW}{\leftH}{0pt}{\leftY} + +\setlength{\rightH}{\leftH} +\setlength{\rightY}{\leftY} + +% Second flow frame + +\setlength{\leftH}{3.5cm} +\adjustheight{\leftH} +\addtolength{\leftY}{-\leftH} + +\newflowframe[1]{\textwidth}{\leftH}{0pt}{\leftY} + +% Right hand flow frame + +\setlength{\rightX}{\leftW} +\addtolength{\rightX}{\columnsep} +\setlength{\rightW}{\textwidth} +\addtolength{\rightW}{-\rightX} + +\newflowframe[1]{\rightW}{\rightH}{\rightX}{\rightY} + +% insert vertical line between left and right flow frames + +\insertvrule{flow}{1}{flow}{3} + +% insert horizontal line between flow frames 2 and 3 +% don't want it to go under frame 1 so shift the starting +% position + +\addtolength{\rightX}{-0.5\columnsep} +\addtolength{\rightX}{-0.5\columnseprule} +\inserthrule[-\rightX]{flow}{3}{flow}{2} + +% egg picture + +\addtolength{\rightY}{\rightH} +\addtolength{\rightY}{-10mm} +\setlength{\rightW}{0.75in} +\setlength{\rightH}{0.8in} +\addtolength{\rightY}{-\rightH} +\setlength{\rightX}{\textwidth} +\addtolength{\rightX}{-\rightW} +\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[egg] + +% set contents +\setstaticcontents*{egg}{\includegraphics[scale=0.75]{egg}} + +% middle heading + +\setlength{\leftH}{2cm} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[midhead] + +% insert horizontal line +\inserthrule*{flow}{2}{static}{midhead} + +% bottom left flow frame + +\setlength{\leftH}{\leftY} +\adjustheight{\leftH} +\setlength{\leftW}{0.6\textwidth} + +\newflowframe[1]{\leftW}{\leftH}{0pt}{0pt} + +% bottom right flow frame + +\setlength{\rightX}{\leftW} +\addtolength{\rightX}{\columnsep} +\setlength{\rightW}{\textwidth} +\addtolength{\rightW}{-\rightX} + +\newflowframe[1]{\rightW}{\leftH}{\rightX}{0pt} + +% static frame for sheep picture + +\newstaticframe[1]{0.8in}{0.8in}{0pt}{0pt}[sheep] + +% set contents +\setstaticcontents*{sheep}{\includegraphics[scale=0.75]{sheep}} + +\onecolumn[>1] % for any text that falls off the last page + +\setcounter{secnumdepth}{0} +\pagestyle{empty} + +\begin{document} + +\begin{staticcontents*}{title} +\begin{center} +\bfseries\Huge +Fairy Tale Times +\end{center} +\hfill Issue 1. 20 November 2005. +\end{staticcontents*} + +\section{Killer Wolf on the Loose} + +The authorites are warning of a killer wolf on the +loose. He has so far devoured an old grandmother and +two pig brothers. He is described as being furry with +big eyes and big teeth. + +On Monday this week he broke into a house, and devoured +an old lady. He then disguised himself as the old lady +in order to deceive her granddaughter. Luckily for the little +girl a woodsman arrived in time to rescue her. Parents are +being cautioned not to let their children wander about on +their own, and to remind them not to talk to strangers.\par +\framebreak + +The next day the wolf struck again, this time targeting two +pig brothers who had most incautiously made their dwellings +on the cheap using inadequate materials. The wolf also made +an attempt on the third pig brother, but was unable to break +into his house. + +Police are appealing to the public for witnesses and remind +people to keep their doors securely fastened at all times. + +``Always ask to see identification,'' said one police advisor, +``and invest in improving the general security of your property.'' + +\framebreak +\section{Tragic Wall Accident} + +{\parshape=6 0pt 13em 0pt 13em 0pt 11em 0pt 11em 0pt 13em +0pt 17em +An egg person tragically fell from a six foot wall yesterday +afternoon and was smash\-ed to pieces. The king's cavalry rushed +to the scene, but regretted that they were unable to help him. +\par} + +Humpty Dumpty was believed to be sitting +on the wall when he fell. Police have ruled out foul play, but +are advising people not to play on high walls, particularly +those vulnerable members of the population suffering from +eggshell syndrome. + +\begin{staticcontents*}{midhead} +\section{Relief as Missing Sheep Finally Return Home} +\end{staticcontents*} + +\framebreak +There was much celebration yesterday morning when Little Bo +Peep's sheep finally returned home. They had been missing +for more than a week. + +{\parshape=8 0pt \linewidth 0pt \linewidth 0pt \linewidth +0pt \linewidth 40pt 180pt 36pt 184pt 29pt 191pt +0pt \linewidth +``I just didn't know where to find them,'' the shepherdess +stated, ``but I was told to leave them alone and they'd come +home.'' Unusual advice perhaps, but it seems to have worked +as they did indeed come home. Eye witnesses reported that their +tails were wagging behind them. +``I'm just so happy they've come home,'' Little Bo Peep said +in a press conference yesterday\framebreak}afternoon. +The sheep themselves made no comment, and police are still +trying to determine what happened to them. + +\noindent\hrulefill + +This is a sample document illustrating the +flowfram package. It uses \TeX's \verb|\parshape| command +to create irregularly shaped paragraphs. + +\hfill Nicola Talbot +\framebreak + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample-news2.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass[12pt]{article} + +\usepackage{graphicx} +\usepackage{color} +\usepackage{flowfram} +\usepackage[a4paper,margin=20mm]{geometry} + +% define lengths to help compute positions +\newlength\leftX +\newlength\leftY +\newlength\leftH +\newlength\leftW + +\newlength\rightX +\newlength\rightY +\newlength\rightH +\newlength\rightW + +% Create a static frame to put title in +\setlength{\leftH}{3cm} +\setlength{\leftY}{\textheight} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[title] + +% Create left hand frame. This will have an L shape + +\setlength{\leftH}{13cm} +\adjustheight{\leftH} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[L] +\setstaticframe*{L}{shape={\parshape=24 +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt 0.5\linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +}} + +% egg picture + +\addtolength{\rightY}{\leftY} +\addtolength{\rightY}{73mm} +\setlength{\rightW}{0.9in} +\setlength{\rightH}{1.5in} +\setlength{\rightX}{\textwidth} +\addtolength{\rightX}{-\rightW} +\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[egg] + +% set contents +\setstaticcontents*{egg}{\includegraphics[scale=0.9]{egg}} + +% Right hand static frame + +\setlength{\rightX}{0.5\textwidth} +\addtolength{\rightX}{\columnsep} +\setlength{\rightW}{\textwidth} +\addtolength{\rightW}{-\rightX} +\setlength{\rightY}{\leftY} +\addtolength{\rightY}{2.8cm} +\setlength{\rightH}{\leftH} +\addtolength{\rightH}{-2.8cm} + +\newstaticframe[1]{\rightW}{\rightH}{\rightX}{\rightY}[right] + +\setstaticframe*{right}{shape={\parshape=15 +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt 0.75\linewidth +0pt 0.65\linewidth +0pt 0.75\linewidth +0pt 0.8\linewidth +0pt 0.8\linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +0pt \linewidth +}} + +% insert vertical and horizontal rules, can't use +% \insertrule as left hand +% frame is actually the width of the typeblock +\addtolength{\rightX}{-0.5\columnsep} +\newstaticframe[1]{0pt}{\rightH}{\rightX}{\rightY}[Lrule] +\setstaticcontents*{Lrule}{\makebox[0pt][l]{% +\rule{\columnseprule}{\rightH}\rule{\rightW}{\columnseprule}}} + +% middle heading + +\setlength{\leftH}{2cm} +\addtolength{\leftY}{-\leftH} + +\newstaticframe[1]{\textwidth}{\leftH}{0pt}{\leftY}[midhead] + +% insert horizontal rule +\inserthrule*{static}{L}{static}{midhead} + +% flow frames +\twocolumninarea{\textwidth}{\leftY}{0pt}{0pt} + +% static frame for sheep picture + +\newstaticframe[1]{1.6in}{1.6in}{0pt}{0pt}[sheep] + +% set contents +\setstaticcontents*{sheep}{\includegraphics[scale=1.2]{sheep}} + +\setcounter{secnumdepth}{0} +\setlength{\sdfparindent}{\parindent} + +\begin{document} +\begin{staticcontents*}{title} +\begin{center} +\bfseries\Huge +Fairy Tale Times +\end{center} +\hfill Issue 2. 7 December 2005. +\end{staticcontents*} + +\begin{staticcontents*}{L} +\section{Killer Wolf on the Loose} + +The authorites are warning of a killer wolf on the +loose. He has so far devoured an old grandmother and +two pig brothers. He is described as being furry with +big eyes and big teeth. + +On Monday this week he broke into a house, and devoured +an old lady. He then disguised himself as the old lady +in order to deceive her granddaughter. Luckily for the little +girl a woodsman arrived in time to rescue her. Parents are +being cautioned not to let their children wander about on +their own, and to remind them not to talk to strangers. + +The next day the wolf struck again, this time targeting two +pig brothers who had most incautiously made their dwellings +on the cheap using inadequate materials. The wolf also made +an attempt on the third pig brother, but was unable to break +into his house. + +Police are appealing to the public for witnesses and remind +people to keep their doors securely fastened at all times. +``Always ask to see identification,'' said one police advisor, +``and invest in improving the general security of your property.'' +\end{staticcontents*} + +\begin{staticcontents*}{right} +\section{Tragic Wall Accident} + +An egg person tragically fell from a six foot wall yesterday +afternoon and was smash\-ed to pieces. The king's cavalry rushed +to the scene, but regretted that they were unable to help him. + +Humpty Dumpty was believed to be sitting on the wall when he fell. Police have ruled out foul play, but +are advising people not to play on high walls, particularly +those vulnerable members of the population suffering from +eggshell syndrome. + +\small\em +%Wall related incidents this year: page 3 +% +Exclusive interview with one of the King's men on page 6 +\end{staticcontents*} + +\begin{staticcontents*}{midhead} +\section{Relief as Missing Sheep Finally Return Home} +\end{staticcontents*} + +There was much celebration yesterday morning when Little Bo +Peep's sheep finally returned home. They had been missing +for more than a week. + +``I just didn't know where to find them,'' the shepherdess +stated, ``but I was told to leave them alone and they'd come +home.'' + +\parshape=8 +0pt \linewidth +0pt \linewidth +0.3\linewidth 0.7\linewidth +0.3\linewidth 0.7\linewidth +0.25\linewidth 0.75\linewidth +0.25\linewidth 0.75\linewidth +0pt \linewidth +0pt \linewidth +Unusual advice perhaps, but it seems to have worked +as they did indeed come home. Eye witnesses reported that their +tails were wagging behind them. +``I'm just so happy they've come home,'' Little Bo Peep said +in a press conference yesterday afternoon. +The sheep themselves made no comment, and police are% +\framebreak\parshape=0 +still trying to determine what happened to them. +The big bad wolf is reportedly helping them with their inquiries. + +\noindent\hrulefill + +This is a sample document illustrating the +flowfram package. It uses \TeX's \verb|\parshape| command +to create irregularly shaped paragraphs. This can be a complicated +and somewhat tiresome task, and is generally not recommended. +Using the shapepar package provides you with more intricate +shapes, but as its documentation says, it is not intended +for use in large documents. + +\hfill Nicola Talbot +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample-pages.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass{book} + +\usepackage[demo]{graphicx} +\usepackage{lipsum} +\usepackage{color} +\usepackage[ + draft, + verbose, + pages=absolute + ]{flowfram} + +\onecolumn + +\setflowframe{1}{label=single} + +\twocolumnDtop[none]{2in} + +\setdynamicframe{1}{label=title} +\setflowframe{2}{label=shortleft} +\setflowframe{3}{label=shortright} + +\twocolumn[none] + +\setflowframe{4}{label=left} +\setflowframe{5}{label=right} + +\newdynamicframe[none]{\textwidth}{\textheight}{0pt}{0pt}[image] + +\setdynamicframe*{image}{valign=c} + +\title{Sample Document} +\author{A.N. Other} + +\begin{document}\raggedright +\maketitle + +\frontmatter +\tableofcontents +\chapter{Acknowledgements} + +\lipsum[1] + +\flowswitchoffnextodd*{single}% +\flowswitchonnextoddonly*{shortleft,shortright}% +\dynamicswitchonnextoddonly*{title}% +\dfchaphead*{title} + + +\mainmatter +\chapter{Sample} + +\flowswitchonnext*{left,right}% +% From this point onwards, automate the switch at the start of +% each chapter +\renewcommand{\ffprechapterhook}{% + \flowswitchoffnextoddonly*{left,right}% + \flowswitchonnextoddonly*{shortleft,shortright}% + \dynamicswitchonnextoddonly*{title}% +} + +\lipsum + +\lipsum + +\chapter{Another Sample Chapter} + +\lipsum[1-20] + +% Switch to single column just for the next page + +\flowswitchoffnextonly*{left,right} +\flowswitchonnextonly*{single} + +\clearpage + +\begin{figure}[p] +\centering + \includegraphics{image1} +\caption{A Sample Figure} +\label{fig:sample} +\end{figure} + +\clearpage + +\lipsum[21-30] + +\chapter{Here's Another Chapter} + +\lipsum[1-20] + +% Switch of columns for next page only and switch on dynamic frame +% called "image": + +\flowswitchoffnextonly*{left,right} +\dynamicswitchonnextonly*{image} + +\setdynamiccontents*{image}{% + \begin{staticfigure} + \centering + \includegraphics{image2} + \caption{Another Sample Figure} + \label{fig:sample2} + \end{staticfigure} +} + +\lipsum[21-40] + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample-poster.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass[a0]{a0poster} + +\usepackage{color} +\usepackage{mathptmx} +\usepackage{courier} +\usepackage[scaled=0.92]{helvet} +\usepackage{url} +\usepackage{flowfram} + +% set up frames + +\setlength{\columnsep}{2cm} + +% Base the page layout on 4 column with static header. +% The static frame has height = 0.2\textheight +\NcolumnStop{4}{0.2\textheight} +% give the static frame a label to make it easier to keep track of +\setstaticframe{\value{maxstatic}}{label={title},backcolor=[cmyk]{0.64,0,0.95,0.40},textcolor=white} + +% Insert a vertical line between flow frames 2 and 3: +\insertvrule{flow}{2}{flow}{3} + +% On the first page, replace last two columns with +% 2 columns and a static underneath +\setflowframe{3,4}{pages={>1}} + +\computeflowframearea{3,4} +\twocolumnSbottominarea[1]{0.5\ffareaheight}{\ffareawidth}{\ffareaheight}{\ffareax}{\ffareay} +\setstaticframe{\value{maxstatic}}{label={info},backcolor=[cmyk]{0.26,0,0.76,0},clear} + +% insert a horizontal rule between flow frame 5 and static +% frame 5 +\inserthrule*[0.5\columnsep]{flow}{5}{static}{info} + +\setallflowframes{backcolor=[cmyk]{0.15,0,0.69,0}} + +\newcommand{\sty}[1]{\textsf{#1}} +\newcommand{\env}[1]{\textsf{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + +%\raggedright +%\setlength{\parindent}{15pt} + +\begin{document} +\begin{staticcontents*}{title} +\begin{center} +\bfseries\veryHuge flowframe.sty : Creating Posters, Magazines or Brochures in \LaTeX +\vskip1cm +\huge Nicola L. C. Talbot +\vskip2ex +\normalsize \url{http://www.dickimaw-books.com/} +\end{center} +\end{staticcontents*} + +\pagestyle{empty} + +\begin{staticcontents*}{info} +\begin{staticfigure} + +\begin{verbatim} + % Make the distance between columns = 1.5cm + \setlength{\columnsep}{2cm} + + % Make a 4 column layout with a static frame on top. + % The static frame has height = 0.2\textheight + \NcolumnStop{4}{0.2\textheight} + + % give the static frame a label to make it easier to keep track of + \setstaticframe{\value{maxstatic}}{label={title},backcolor=[cmyk]{0.64,0,0.95,0.40},textcolor=white} + + % On the first page, replace the 3rd and 4th columns + % with two shorter columns with a static frame underneath + \setflowframe{3,4}{pages={>1}} + + % The area taken up by the 3rd and 4th columns is given by + \computeflowframearea{3,4} + + % Set up new frames in this area + \twocolumnSbottominarea[1]{0.5}{\ffareawidth}{\ffareaheight}{\ffareax}{\ffareay} + + % Assign a label to the last static frame to be created, and set background colour + \setstaticframe{\value{maxstatic}}{label={info},backcolor=[cmyk]{0.26,0,0.76,0}} + + % Set the background colour for all flow frames + \setallflowframes{backcolor=[cmyk]{0.15,0,0.69,0}} +\end{verbatim} + +\caption{The commands used to define the frames for this document} +\protect\label{fig:thisdoc} +\end{staticfigure} +\end{staticcontents*} + +This is a modified version of the manual for the \sty{flowfram} +package. It is intended to illustrated what can be done. See the +full manual (ffuserguide.pdf) for +a comprehensive description, as this may now be out of date. The commands used to define the frames for +this document are shown in Figure~\ref{fig:thisdoc}. +If the columns are very narrow, it may be better to +use \cmdname{raggedright}, otherwise \TeX\ may have a +problem working out the line breaks. + +\section{Introduction} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +\section{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\subsection{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border. + +It is recommended that all the flow frames in a document +have the same width, otherwise problems may occur +when a paragraph spans to flow frames of unequal +widths. This is because \TeX's output routine does not +register the change in \cmdname{hsize} until it reaches +a paragraph break. If it is absolutely necessary for +flow frames to have unequal widths, judicious use of +\cmdname{framebreak} is required. + +\subsection{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\subsection{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\section{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\section{Miscellaneous} + +\subsection{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\subsection{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\subsection{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\subsection{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\subsection{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. + +\item \cmdname{columnsep} + +This is the horizontal distance between flow frames when using one of the +\cmdname{Ncolumn} type of commands + +\item \cmdname{vcolumnsep} + +This is the vertical distance between the flow frames and the static or +dynamic frame when using one of the \cmdname{Ncolumntop} type of commands. +\end{itemize} + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample-rot.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass[a4paper]{article} + +\usepackage[draft]{flowfram} +\usepackage{supertabular} + +\newflowframe{0.3\textwidth}{0.25\textheight}{0.5\textwidth}{0.5\textheight} + +\newflowframe{0.3\textwidth}{0.2\textheight}{0pt}{0.1\textheight} + +\newflowframe{0.3\textwidth}{0.2\textheight}{0.5\textwidth}{0.1\textheight} + +\setflowframe{1}{angle=45} +\setflowframe{3}{angle=90} + +\begin{document} + +This is a sample document illustrating the use of the +flowfram package. The first flow frame has been rotated +by an angle of 45 degrees. There is an asterisk in the +margin\marginpar{*}. There is also a +footnote\footnote{down here.}. + +\framebreak +\begin{supertabular}{rl} +1 & A\\ +2 & B\\ +3 & C\\ +4 & D\\ +5 & E\\ +6 & F\\ +7 & G\\ +8 & H\\ +9 & I\\ +10 & J\\ +11 & K\\ +12 & L\\ +13 & M\\ +14 & N\\ +15 & O\\ +16 & P\\ +17 & Q\\ +18 & R\\ +19 & S\\ +20 & T\\ +\end{supertabular} + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass[a4paper,twoside]{book} + +\usepackage{times} +\usepackage{courier} +\usepackage{helvet} +\usepackage[margin=1in,top=1in,bottom=1in]{geometry} +\usepackage[colorlinks, + linkcolor=black, + urlcolor=black, + plainpages=false, + pdfpagelabels=true]{hyperref} +\usepackage{fancybox} +\usepackage{color} +\usepackage{flowfram} + +\newcommand{\sty}[1]{\textsf{#1}} +\newcommand{\env}[1]{\textsf{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + +% set up some background frames to liven up the title page +\newlength{\leftwidth} +\newlength{\rightwidth} + +\computeleftedgeodd{\leftwidth} +\setlength{\leftwidth}{-\leftwidth} +\addtolength{\leftwidth}{0.4\textwidth} +\setlength{\rightwidth}{\paperwidth} +\addtolength{\rightwidth}{-\leftwidth} +% only defined on page 1 unfortunately the document +% has more than one page 1, so will need to change the settings after the title page +\vtwotone[1]{\leftwidth}{magenta}{backleft}{\rightwidth}{[cmyk]{0,0.48,0,0}}{backright} + +% This is for the back cover. +\vtwotone[none]{\rightwidth}{[cmyk]{0,0.48,0,0}}{lastbackright}{\leftwidth}{magenta}{lastbackleft} + +\vtwotonetop[odd]{1cm}{\leftwidth}{magenta}{oddtopleft}{\rightwidth}{[cmyk]{0,0.48,0,0}}{oddtopright} +\vtwotonetop[even]{1cm}{\rightwidth}{[cmyk]{0,0.48,0,0}}{eventopleft}{\leftwidth}{magenta}{eventopright} + +% Set the margin width +\setlength{\marginparwidth}{2cm} + +% now set up main document frames. Each page has a dynamic +% frame for the chapter heading, and a flow frame for the +% text. +\newflowframe{0.6\textwidth}{\textheight}{0pt}{0pt}[main] +\newdynamicframe{0.38\textwidth}{\textheight}{0.62\textwidth}{0pt}[chaphead] + +% swap them round on even pages +\setflowframe*{main}{evenx=0.4\textwidth} +\setdynamicframe*{chaphead}{evenx=0pt} + +% set the margins to appear on the spine side of the page +\setflowframe*{main}{margin=inner} + +% put chapter headings in dynamic frame with IDL chaphead +\dfchaphead*{chaphead} + +% append chapter minitocs to same dynamic frame. +\appenddfminitoc*{chaphead} + +% change the style of the chapter headings + +% numbered chapters: +\renewcommand{\DFchapterstyle}[1]{% +\raggedright\sffamily\bfseries\Huge\color{blue}#1\par +} + +% unnumbered chapters: +\renewcommand{\DFschapterstyle}[1]{\raggedright\sffamily\bfseries\Huge\color{blue} #1\par +} + +% Make thumb tabs (specify each tab to be 2in high) + +\makethumbtabs{2in} +\enableminitoc + +% Thumbtabs are grey by default which looks a bit boring, +% so change the colours +\setthumbtab{1}{backcolor=[rgb]{0.15,0.15,1}} +\setthumbtab{2}{backcolor=[rgb]{0.2,0.2,1}} +\setthumbtab{3}{backcolor=[rgb]{0.25,0.25,1}} +\setthumbtab{4}{backcolor=[rgb]{0.3,0.3,1}} + +% change the text style on the thumbtabs +%\newcommand{\thumbtabstyle}[1]{\textbf{\sffamily\large #1}} +\newcommand{\thumbtabstyle}[1]{\textsc{\sffamily #1}} +\setthumbtab{all}{style=thumbtabstyle,textcolor=white} + +% set default page style + +\pagestyle{plain} + +% Put headers and footers in dynamic frames +\makedfheaderfooter + +\newlength{\xoffset} +\computerightedgeodd{\xoffset} +\addtolength{\xoffset}{-2cm} +\newlength{\yoffset} +\computebottomedge{\yoffset} + +\newcommand{\footstyle}[1]{\bfseries\LARGE #1} + +% pages is initially set to none, as I don't want the footer to +% appear on the title page. + +\setdynamicframe*{footer}{oddx=\xoffset,y=\yoffset,width=2cm,height=2cm, +backcolor=blue,textcolor=white,style=footstyle,pages=none} + +% now work out the x offset for the even pages + +\computeleftedgeeven{\xoffset} +\setdynamicframe*{footer}{evenx=\xoffset} + +\begin{document} +\ffswapoddeven*{main}% swap odd and even position of frame for the title page +\dfswapoddeven*{chaphead} +\title{Creating Flow Frames for Posters or Magazines} +\author{Nicola L. C. Talbot\\[1cm]\url{http://www.dickimaw-books.com/}} +\date{} +\pagenumbering{alph} +\maketitle + +% make table of contents appear on a right hand page +\cleardoublepage +%suppress the background +\setstaticframe*{backleft}{pages=none} +\setstaticframe*{backright}{pages=none} + +\frontmatter +%\tableofcontents +\tocandthumbtabindex +% make the footers appear from this point on +\setdynamicframe*{footer}{pages=all} + +\clearpage +\dfswapoddeven*{chaphead} +\ffswapoddeven*{main}% swap back again + +\mainmatter +\chapter{Introduction} +\enablethumbtabs +\pagenumbering{arabic} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters\marginpar{A marginal note} +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +This document has \themaxflow\ flow +\ifthenelse{\value{maxflow}=1}{frame}{frames}, \themaxstatic\ static +\ifthenelse{\value{maxstatic}=1}{frame}{frames} and +\themaxdynamic\ dynamic \ifthenelse{\value{maxdynamic}=1}{frame}{frames}. + +\chapter{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\section{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border\footnote{A +footnote!}. + +\section{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\section{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\chapter{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\chapter{Miscellaneous} + +\section{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\section{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\section{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\section{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\section{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: +\marginpar{Another marginal note} + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. +\end{itemize} + + +\chapter*{Contact Details} +\disablethumbtabs + +Dr Nicola Talbot\\ +School of Computing Sciences\\ +University of East Anglia\\ +Norwich. Norfolk. NR4 7TJ. UK\\ +\url{http://theoval.cmp.uea.ac.uk/~nlct/} + +\finishthispage\mbox{} +\setdynamiccontents*{chaphead}{} +\setdynamicframe*{footer}{pages=none} +\setstaticframe*{lastbackleft,lastbackright}{pages=even} +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample1.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass[a4paper]{article} + +\usepackage[a4paper,landscape,margin=1in]{geometry} +\usepackage{fancybox} +\usepackage{color} +\usepackage{flowfram} + +\showframebboxtrue +\showtypeblocktrue + +% set up frames + +% Base the page layout on 4 column with static header +\NcolumnStop{4}{1in} + +% On the first page, replace last two columns with +% 2 columns and a static underneath +\setflowframe{3,4}{pages={>1}} +\twocolumnSbottominarea[1]{1in}{0.5\textwidth}{\flowframeheight{3}}{0.5\textwidth}{0pt} + +\begin{staticcontents}{2} +The page layout for this document was obtained with +the following commands: +\begin{verbatim} +\NcolumnStop{4}{1in} +\setflowframe{3,4}{pages={>1}} +\twocolumnSbottominarea[1]{1in}{0.5\textwidth}{flowframeheight{3}} +{0.5\textwidth}{0pt} +\end{verbatim} +\end{staticcontents} + +\newcommand{\sty}[1]{\textsf{#1}} +\newcommand{\env}[1]{\textsf{#1}} +\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} +\newcommand{\meta}[1]{\textnormal{\textless\textit{#1}\textgreater}} + +\raggedright +%\setlength{\parindent}{15pt} + +\begin{document} + +\begin{staticcontents}{1} +\title{Creating Flow Frames for Posters or Magazines} +\author{Nicola L. C. Talbot} +\date{} +\maketitle +\end{staticcontents} + +This is a modified version of the manual for the \sty{flowfram} package. +It is intended to illustrated what can be done. See the full manual for +a comprehensive description. + +If the columns are very narrow, it may be better to +use \cmdname{raggedright}, otherwise \TeX\ may have a +problem working out the line breaks. + +\section{Introduction} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +\section{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\subsection{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border. + +It is recommended that all the flow frames in a document +have the same width, otherwise problems may occur +when a paragraph spans to flow frames of unequal +widths. This is because \TeX's output routine does not +register the change in \cmdname{hsize} until it reaches +a paragraph break. If it is absolutely necessary for +flow frames to have unequal widths, judicious use of +\cmdname{framebreak} is required. + +\subsection{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\subsection{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + + +\section{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\section{Miscellaneous} + +\subsection{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\subsection{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\subsection{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\subsection{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\subsection{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. +\end{itemize} + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample2.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass[a4paper,twoside]{report} + +\usepackage{url} + +\newcommand{\cmdname}[1]{\texttt{\char`\\#1}} +\newcommand{\sty}[1]{\texttt{#1}} +\newcommand{\env}[1]{\texttt{#1}} +\newcommand{\meta}[1]{$\langle$\emph{#1}$\rangle$} + +\begin{document} + +\title{Creating Flow Frames for Posters or Magazines} +\author{Nicola L. C. Talbot\\[1cm]\url{http://www.dickimaw-books.com/}} +\date{} +\pagenumbering{alph} +\maketitle + +\pagenumbering{roman} +\tableofcontents + +\chapter{Introduction} +\pagenumbering{arabic} + +The \sty{flowfram} package is designed to enable you to create +frames in a document such that the +contents of the \env{document} environment flow from one +frame to the next in the order that they were defined. +This is useful for creating posters +or magazines or any other form of document that does not +conform to the standard one or two column layout. + +\chapter{Setting up Frames} + +The \sty{flowfram} package provides three types of frame: +{flow frames}, {static +frames} and {dynamic frames}. + +\section{Flow Frames} + +The flow frame is the principle type of frame. +The text of the \env{document} environment will flow from +one frame to the next in order of definition. Each +flow frame has an associated width, height, +position on the page, and optionally a border. + +\section{Static Frames} + +A static frame is a rectangular area in which text neither +flows into, nor flows out of. The contents must be set +explicitly, and once set, the contents of the static frame will +remain the same on each page until it is explicitly +changed. Thus, a static frame can be used, for example, to make +a company logo appear in the same place on every page. + +\section{Dynamic Frames} + +A dynamic frame is similar to a static frame, but its contents +are re-typeset on each page. (A static frame stores its +contents in a savebox, whereas a dynamic frame stores its +contents in a macro). + +\chapter{Frame Attributes} +\label{sec:modattr} + +Once you have defined the {flow frames}, {static frames} and +{dynamic frames}, their attributes can be changed. +The three types of frame mostly have the +same set of attributes, but some are specific to a certain type. +The available attributes are as follows +(\textsuperscript{\textbf{F}} indicates the key is +only available for {flow frames}, +\textsuperscript{\textbf{S}} indicates the key is only available +for {static frames} +and \textsuperscript{\textbf{D}} indicates the key +is only available for {dynamic frames}): + +\begin{description} +\item[width=\meta{length}] The width of the frame. + +\item[height=\meta{length}] The height of the frame. + +\item[x=\meta{length}] The x-coordinate of the frame. + +\item[y=\meta{length}] The y-coordinate of the frame. + +\item[border=\meta{style}] The style of the border around the +frame, this can take the values: \texttt{none} (no border), +\texttt{plain} (plain border) or the name of a \LaTeX\ +frame making command without the preceding backslash. +The value \texttt{fbox} is equivalent to \texttt{plain}. + +\item[offset=\meta{offset}] The border offset, if it is a +user-defined border. This is the distance from the outer +edge of the left hand border to the left edge of the +bounding box of the text inside the border. The \sty{flowfram} +package is able to compute the border for +known frame making commands. +If you define your own frame making command, you may need to +specify the offset explicitly, or the frames +may end up shifted to the right or left. + +\item[bordercolor=\meta{colour}] The colour of the border +if you are using a standard frame making command. +The colour can either be specified as, e.g.\ \texttt{green}, +or including the colour model, e.g. \verb/[rgb]{0,1,0}/. + +\item[textcolor=\meta{colour}] The text colour for that +frame. Again, the colour can either be specified as, +e.g.\ \texttt{green}, or including the colour model, +e.g. \verb/[rgb]{0,1,0}/. + +\item[pages=\meta{page list}] The {list of +pages} for which the frame +should appear. This can either have the values: \texttt{all}, +\texttt{even}, \texttt{odd} or \texttt{none} (the latter +removes the frame from that point on---useful if you +have multiple pages with the same number), or it can be a +comma-separated list of single pages, or +{page ranges}. + +\item[margin=\meta{side}\textsuperscript{F}] The side of +the flow frame that its corresponding margin should go on. This +can take the values \texttt{left} or \texttt{right}. + +\item[clear=\meta{boolean}\textsuperscript{S}] If this value +is set, the static frame will be cleared at the start of the +next page. + +\item[style=\meta{cmd}\textsuperscript{D}] This should be +the name of a command \emph{without} the preceding backslash, +to be applied to the contents of the specified dynamic frame. +The command may either be a declaration, for example \verb/style=large/ +which will set the contents of all the dynamic frames in a +large font, or it can be a command that takes a single argument, +for example \verb/style=textbf/ +which will make the text for all the dynamic frames come out in +bold. To unset a style, do \verb/style=none/. + +\end{description} + +\chapter{Miscellaneous} + +\section{Page Layout} + +The \sty{flowfram} package has the package option \texttt{draft} +which will draw the {bounding boxes} for +each frame defined. At the bottom right of each +bounding box (except for the bounding box denoting the +typeblock), a marker will be shown to indictate the type +of frame, its IDN and its IDL. + +You can see the layout for the current page (irrespective of +whether or not the \texttt{draft} option has been set) using +the command:\newline +\cmdname{flowframeshowlayout} + +The headers and footers will appear as usual (but will not +be shown in draft mode), according to the format given by +\cmdname{pagestyle}. + +\section{Frame Stacking Order} + +The material on each page is placed in the following order: +\begin{enumerate} +\item Each static frame defined for that page in ascending +order of IDN. + +\item Each flow frame defined for that page in ascending +order of IDN. + +\item Each dynamic frame defined for that page in ascending +order of IDN. + +\item {Bounding boxes} if the \texttt{draft} +package option has been used. +\end{enumerate} + +This ordering can be used to determine if you want something +to overlay or underlay everything else on the page. + +\section{Prematurely Ending a Flow Frame} + +You can force text to move immediately to the next defined +flow frame using one of the standard \LaTeX\ page breaking commands +which work in an analogous way to the way they +work in standard two column mode. + +The command \cmdname{framebreak} is provided for situations +where a paragraph spans two flow frames +of different widths, as \TeX's output routine does not +adjust to the new value of \cmdname{hsize} until the last +paragraph of the previous frame has ended. As a +result, the end of the paragraph at the beginning of the new +flow frame retains the width of the previous flow frame. + +If you want to start a new page, rather than simply move to the +next frame, use the command\newline +\cmdname{finishthispage}. + +\section{Floats} + +Since floats (such as figures and tables) can only go in +{flow frames}, this package provides +the additional environments: +\env{staticfigure} and +\env{statictable} which can be used in static frames +and dynamic frames. Unlike their \env{figure} and +\env{table} counterparts, they are fixed in place, and +so do not take an optional placement specifier. The +\cmdname{caption} and \cmdname{label} commands can +be used within \env{staticfigure} and \env{statictable} as +usual. + +The standard \env{figure} and \env{table} commands will +behave as usual in the flow frames, but their starred versions, +\env{figure*} and \env{table*} behave no differently +from \env{figure} and \env{table}. + +\section{Global Values} + +The following macros can be changed using \cmdname{renewcommand}: + +\begin{itemize} +\item \cmdname{setffdraftcolor} + +This sets the colour of the bounding box +when it is displayed in draft mode. + +\item +\cmdname{setffdrafttypeblockcolor} + +This sets the colour of +the bounding box of the typeblock when it is displayed +in draft mode. + +\item \cmdname{fflabelfont} + +This sets the font size for the bounding box markers in +draft mode. + +\end{itemize} + +The following are lengths, which can be changed using +\cmdname{setlength}: + +\begin{itemize} +\item \cmdname{fflabelsep} + +This is the distance from the right hand side of the +bounding box at which to place the bounding box marker. + +\item \cmdname{flowframesep} + +This is the gap between the text of the frame and +its border, for the standard border types. + +\item \cmdname{flowframerule} + +This is the width of the frame's border, if using +a border given by a frame making command that uses \cmdname{fboxsep} +to set its border width. +\end{itemize} + + +\chapter*{Contact Details} + +Dr Nicola Talbot\\ +Dickimaw Books\\ +\url{http://www.dickimaw-books.com/} + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sample3.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass{article} + +\usepackage{color} +\usepackage[draft]{flowfram} +\usepackage{tikz} +\usetikzlibrary{snakes} + +\newstaticframe[1,2]{3in}{3in}{0pt}{0pt}[sf1] +\newdynamicframe[1,3]{2in}{3in}{0.5\textwidth}{0.5\textheight}[df1] + +\newstaticframe[2]{3in}{3in}{0.5\textwidth}{0.5\textheight}[sf2] + +\newdynamicframe[3]{2in}{2in}{0.5\textwidth}{0pt}[df2] + +\setlength{\sdfparindent}{\parindent} + +\onecolumn + +\newlength\fancywidth +\newlength\fancyheight +\newlength\fancydepth + +\newcommand{\fancyframe}[1]{% +\settowidth{\fancywidth}{#1}% +\settoheight{\fancyheight}{#1}% +\settodepth{\fancydepth}{#1}% +\addtolength{\fancyheight}{\fancydepth}% +\hspace{-\flowframesep}% +\tikz[baseline=0pt]{% +\draw[snake=bumps,raise snake=\flowframesep,line width=\flowframerule] + (0pt,0pt) + rectangle (\fancywidth,\fancyheight); +}} + +\begin{document} +\setstaticframe{1,2}{valign=t} +\setstaticframe{1}{border=fancyframe} +\setstaticcontents{1}{Top\par +\vfill +Bottom} + +%\setdynamiccontents{1}{Bar} +%\begin{dynamiccontents*}{df1} +%Paragraph 1 +% +%Paragraph 2 +%\end{dynamiccontents*} + +\mbox{} + +\newpage\mbox{} + +\begin{staticcontents*}{sf1} +Some text on the left static frame. +\continueonframe[continued \relativeframelocation{static}{2}{static}{1}]{sf2} +Some more text on the right static frame, and +some more text to pad it out a bit. +\end{staticcontents*} + +\newpage\mbox{} + +\begin{dynamiccontents}{1} +Some text in the first dynamic frame. +\continueonframe[continued \reldynamicloc*{df2}{df1}]{2} +Some more text in the second dynamic frame, and +some more text to pad it out a bit. +\end{dynamiccontents} + +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*sampleRL.tex> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} + % This file is public domain. + +\documentclass{article} + +\usepackage{lipsum} +\usepackage[RL,draft]{flowfram} + +\twocolumn + +\begin{document} +This is the start of the text. + +\lipsum + +This is the end of the text. +\end{document} +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*flowfram.perl> +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +#!/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); + + "$text$_" +} + +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($_) = @_; + + "

$_" +} + +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; +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +% % \end{macrocode} %\fi %\Finale diff --git a/Master/texmf-dist/source/latex/flowfram/flowfram.ins b/Master/texmf-dist/source/latex/flowfram/flowfram.ins index e5caad2fb22..999f48fe496 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 2010/1/23 11:35 +% flowfram.ins generated using makedtx version 0.94b 2012/11/10 22:19 \input docstrip \preamble flowfram.dtx - Copyright 2010 Nicola Talbot + Copyright 2012 Nicola Talbot This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 @@ -18,7 +18,7 @@ The Current Maintainer of this work is Nicola Talbot. - This work consists of the files flowfram.dtx and flowfram.ins and the derived file flowfram.sty. + This work consists of the files flowfram.dtx and flowfram.ins and the derived files flowfram.sty, sample-article.tex, sample-blanks.tex, sample-brochure.tex, sample-news.tex, sample-news2.tex, sample-pages.tex, sample-poster.tex, sample-rot.tex, sample.tex, sample1.tex, sample2.tex, sample3.tex, sampleRL.tex, flowfram.perl. \endpreamble @@ -26,6 +26,20 @@ \generate{\file{flowfram.sty}{\usepreamble\defaultpreamble \usepostamble\defaultpostamble\from{flowfram.dtx}{flowfram.sty,package}} +\file{sample-article.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample-article.tex}} +\file{sample-blanks.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample-blanks.tex}} +\file{sample-brochure.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample-brochure.tex}} +\file{sample-news.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample-news.tex}} +\file{sample-news2.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample-news2.tex}} +\file{sample-pages.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample-pages.tex}} +\file{sample-poster.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample-poster.tex}} +\file{sample-rot.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample-rot.tex}} +\file{sample.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample.tex}} +\file{sample1.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample1.tex}} +\file{sample2.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample2.tex}} +\file{sample3.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sample3.tex}} +\file{sampleRL.tex}{\nopreamble\nopostamble\from{flowfram.dtx}{sampleRL.tex}} +\file{flowfram.perl}{\nopreamble\nopostamble\from{flowfram.dtx}{flowfram.perl}} } \endbatchfile diff --git a/Master/texmf-dist/source/latex/flowfram/flowfram.perl b/Master/texmf-dist/source/latex/flowfram/flowfram.perl deleted file mode 100644 index 7d7f8c23c56..00000000000 --- a/Master/texmf-dist/source/latex/flowfram/flowfram.perl +++ /dev/null @@ -1,1632 +0,0 @@ -#!/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); - - "$text$_" -} - -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($_) = @_; - - "

$_" -} - -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; diff --git a/Master/texmf-dist/tex/latex/flowfram/flowfram.sty b/Master/texmf-dist/tex/latex/flowfram/flowfram.sty index 0dbc0e2a2dd..1671f879eda 100644 --- a/Master/texmf-dist/tex/latex/flowfram/flowfram.sty +++ b/Master/texmf-dist/tex/latex/flowfram/flowfram.sty @@ -7,7 +7,7 @@ %% flowfram.dtx (with options: `flowfram.sty,package') %% %% flowfram.dtx -%% Copyright 2010 Nicola Talbot +%% Copyright 2012 Nicola Talbot %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 @@ -21,7 +21,7 @@ %% %% The Current Maintainer of this work is Nicola Talbot. %% -%% This work consists of the files flowfram.dtx and flowfram.ins and the derived file flowfram.sty. +%% This work consists of the files flowfram.dtx and flowfram.ins and the derived files flowfram.sty, sample-article.tex, sample-blanks.tex, sample-brochure.tex, sample-news.tex, sample-news2.tex, sample-pages.tex, sample-poster.tex, sample-rot.tex, sample.tex, sample1.tex, sample2.tex, sample3.tex, sampleRL.tex, flowfram.perl. %% %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -39,11 +39,13 @@ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{flowfram}[2010/01/23 v1.13] +\ProvidesPackage{flowfram}[2012/11/10 v1.14 (NLCT)] \RequirePackage{ifthen} -\RequirePackage{keyval} +\RequirePackage{xkeyval} \RequirePackage{graphics} \RequirePackage{afterpage} +\RequirePackage{xfor} +\RequirePackage{etoolbox} \@ifundefined{@ldc@l@r}{\RequirePackage{color}}{} \newcommand{\setffdraftcolor}{\color[gray]{0.8}} \newcommand{\setffdrafttypeblockcolor}{\color[gray]{0.9}} @@ -54,100 +56,202 @@ \newif\ifshowmargins \newif\ifshowframebbox \newcommand*{\@ffdraft}{% -\showtypeblocktrue -\showmarginstrue -\showframebboxtrue + \showtypeblocktrue + \showmarginstrue + \showframebboxtrue } \newcommand*{\@ffnodraft}{% -\showtypeblockfalse -\showmarginsfalse -\showframebboxfalse + \showtypeblockfalse + \showmarginsfalse + \showframebboxfalse } \newcommand*{\@fr@meifdraft}[3][\setffdraftcolor]{% -\def\ff@backcol{{none}}% -\@ifundefined{color}{\frame{#2}}{#1\frame{#2}}% -\ifthenelse{\equal{#3}{}}{}{% -\makebox[0pt][l]{\hskip\fflabelsep\fflabelfont{[#3]}}}}% + \def\ff@backcol{{none}}% + \@ifundefined{color}{\frame{#2}}{#1\frame{#2}}% + \ifthenelse{\equal{#3}{}}{}% + {% + \makebox[0pt][l]{\hskip\fflabelsep\fflabelfont{[#3]}}% + }% +}% \newcommand*{\@s@tffcol}{} \newcommand*{\@s@tfftextcol}{} \newcommand*{\@ffbackground}[1]{#1} -\DeclareOption{draft}{\@ffdraft} -\DeclareOption{final}{\@ffnodraft} -\newif\if@ttb@rotate +\DeclareOptionX{draft}{\@ffdraft} +\DeclareOptionX{final}{\@ffnodraft} +\@ffnodraft +\define@choicekey{flowfram.sty}% + {verbose}[\val\nr]% + {true,false}[true]% + {% + \ifcase\nr\relax + \renewcommand*{\flf@doifverbose}[1]{##1}% + \renewcommand*{\flf@message}[1]{\PackageInfo{flowfram}{##1}}% + \or + \renewcommand*{\flf@doifverbose}[1]{}% + \renewcommand*{\flf@message}[1]{}% + \fi + } +\newcommand*{\flf@message}[1]{% + \flf@doifverbose + {% + \PackageInfo{flowfram}{##1}% + }% +} +\newcommand*{\flf@doifverbose}[1]{} +\define@boolkey{flowfram.sty}[@ttb@]{rotate}[true]{} \@ttb@rotatetrue -\DeclareOption{rotate}{\@ttb@rotatetrue} -\DeclareOption{norotate}{\@ttb@rotatefalse} -\newcommand{\rotateframe}[2]{\if@ttb@rotate -\rotatebox{#1}{#2}% -\else -#2\relax -\fi} +\DeclareOptionX{norotate}{\@ttb@rotatefalse} +\newcommand{\rotateframe}[2]{% + \if@ttb@rotate + \rotatebox{#1}{#2}% + \else + #2% + \fi +} \newif\if@ttb@num -\newif\if@ttb@title \@ttb@numfalse +\newif\if@ttb@title \@ttb@titletrue -\DeclareOption{ttbtitle}{\@ttb@titletrue} -\DeclareOption{ttbnotitle}{\@ttb@titlefalse} -\DeclareOption{ttbnum}{\@ttb@numtrue} -\DeclareOption{ttbnonum}{\@ttb@numfalse} -\DeclareOption{color}{% -\def\flowframecol{{black}}\def\flowframetextcol{{black}} -\renewcommand*\@s@tffcol{\ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\color\ff@col}} -\renewcommand*\@s@tfftextcol{\ifthenelse{\equal{\ff@txtcol}{}}{}{% -\expandafter\color\ff@txtcol}} -\renewcommand*{\@ffbackground}[1]{% -\ifthenelse{\equal{\ff@backcol}{{none}}}{% -#1}{{\fboxsep=0pt\expandafter\colorbox\ff@backcol{#1}}}} -} -\DeclareOption{nocolor}{% -\def\flowframetextcol{}% -\def\flowframecol{}% -\renewcommand{\@s@tffcol}{}\renewcommand{\@s@tfftextcol}{} -\renewcommand{\@ffbackground}[1]{#1} +\define@choicekey{flowfram.sty}% + {thumbtabs}[\val\nr]% + {title,number,both,none}[title]% + {% + \ifcase\nr\relax + \@ttb@numfalse + \@ttb@titletrue + \or + \@ttb@numtrue + \@ttb@titlefalse + \or + \@ttb@numtrue + \@ttb@titletrue + \or + \@ttb@numfalse + \@ttb@titlefalse + \fi + } +\DeclareOptionX{ttbtitle}{\@ttb@titletrue} +\DeclareOptionX{ttbnotitle}{\@ttb@titlefalse} +\DeclareOptionX{ttbnum}{\@ttb@numtrue} +\DeclareOptionX{ttbnonum}{\@ttb@numfalse} +\define@choicekey{flowfram.sty}{pages}[\val\nr]% + {relative,absolute}% + {% + \ifcase\nr\relax + \renewcommand*{\@ff@pages@countreg}{\c@page}% + \or + \renewcommand*{\@ff@pages@countreg}{\c@absolutepage}% + \fi + } +\newcommand*{\@ff@pages@countreg}{\c@page} +\newcounter{absolutepage} +\define@choicekey{flowfram.sty}{color}[\val\nr]{true,false}[true]{% + \ifcase\nr\relax + \@ff@enablecolor + \or + \@ff@disablecolor + \fi +} +\DeclareOptionX{nocolor}{% + \@ff@disablecolor +} +\newcommand*{\@ff@enablecolor}{% + \def\flowframecol{{black}}% + \def\flowframetextcol{{black}}% + \renewcommand*\@s@tffcol{% + \ifthenelse{\equal{\ff@col}{}}% + {}% + {% + \expandafter\color\ff@col}% + }% + \renewcommand*\@s@tfftextcol{% + \ifthenelse{\equal{\ff@txtcol}{}}% + {}% + {% + \expandafter\color\ff@txtcol + }% + }% + \renewcommand*{\@ffbackground}[1]{% + \ifthenelse{\equal{\ff@backcol}{{none}}}% + {% + ##1% + }% + {% + {\fboxsep=0pt\expandafter\colorbox\ff@backcol{##1}}% + }% + }% +} +\newcommand*{\@ff@disablecolor}{% + \def\flowframetextcol{}% + \def\flowframecol{}% + \renewcommand{\@s@tffcol}{}\renewcommand{\@s@tfftextcol}{}% + \renewcommand{\@ffbackground}[1]{##1}% } \newif\iflefttorightcolumns \lefttorightcolumnstrue -\DeclareOption{LR}{\lefttorightcolumnstrue} -\DeclareOption{RL}{\lefttorightcolumnsfalse} -\ifdim\overfullrule=0pt -\ExecuteOptions{final} -\else -\ExecuteOptions{draft} -\fi +\DeclareOptionX{LR}{\lefttorightcolumnstrue} +\DeclareOptionX{RL}{\lefttorightcolumnsfalse} \ifx\normalcolor\relax -\ExecuteOptions{nocolor} + \@ff@disablecolor \else -\ExecuteOptions{color} + \@ff@enablecolor \fi -\ProcessOptions +\ProcessOptionsX \ifx\normalcolor\relax -\ifthenelse{\equal{\flowframetextcol}{}}{}{% -\RequirePackage{color}} + \ifthenelse{\equal{\flowframetextcol}{}}% + {}% + {% + \RequirePackage{color}% + } \fi -\@ifundefined{chapter}{}{% -\newcommand*{\chapterfirstpagestyle}{plain} -\let\@ff@OLD@chapter\@chapter -\let\@ff@OLD@schapter\@schapter -\renewcommand{\@chapter}{% -\thispagestyle{\chapterfirstpagestyle}\@ff@OLD@chapter} -\renewcommand{\@schapter}{% -\thispagestyle{\chapterfirstpagestyle}\@ff@OLD@schapter} +\@ifundefined{chapter}{}% +{% + \newcommand*{\chapterfirstpagestyle}{plain}% + \let\@ff@OLD@chapter\@chapter + \let\@ff@OLD@schapter\@schapter + \renewcommand{\@chapter}{% + \thispagestyle{\chapterfirstpagestyle}% + \@ff@OLD@chapter + }% + \renewcommand{\@schapter}{% + \thispagestyle{\chapterfirstpagestyle}% + \@ff@OLD@schapter + }% + \newcommand*{\ffprechapterhook}{} + \let\@ff@OLD@ch@pter\chapter + \renewcommand{\chapter}{% + \ffprechapterhook + \@ff@OLD@ch@pter + } } \newcounter{maxflow} \c@maxflow=0\relax \newcounter{thisframe} \c@thisframe=0\relax -\@ifpackageloaded{hyperref}{% -\def\theHthisframe{\thepage.\arabic{thisframe}}}{} +\@ifpackageloaded{hyperref} +{% + \def\theHthisframe{\thepage.\arabic{thisframe}}% +}% +{} \newcommand*{\labelflowidn}[1]{% -{\def\@currentlabel{\thethisframe}\label{#1}}} + {% + \def\@currentlabel{\thethisframe}% + \label{#1}% + }% +} \newcounter{displayedframe} \c@displayedframe=0 -\@ifpackageloaded{hyperref}{% -\def\theHdisplayedframe{\thepage.\arabic{displayedframe}}}{} +\@ifpackageloaded{hyperref}% +{% + \def\theHdisplayedframe{\thepage.\arabic{displayedframe}}% +}% +{} \newcommand*{\labelflow}[1]{% -{\def\@currentlabel{\thedisplayedframe}\label{#1}}} + {% + \def\@currentlabel{\thedisplayedframe}% + \label{#1}% + }% +} \newcounter{maxstatic} \c@maxstatic=0\relax \newcounter{maxdynamic} @@ -165,1224 +269,2000 @@ \newlength\flowframerule \flowframerule=\fboxrule \newcommand*{\flowframeshowlayout}{% -\finishthispage -{\@ffdraft\mbox{}\finishthispage\clearpage}} + \finishthispage + {% + \@ffdraft\mbox{}\finishthispage\clearpage + }% +} \newif\ifusedframebreak \newcommand{\framebreak}[1][4]{% -\usedframebreaktrue -{\parfillskip=0pt\pagebreak[#1]\parskip=0pt\par\noindent}} + \global\usedframebreaktrue + {% + \parfillskip=0pt\pagebreak[#1]\parskip=0pt\par\noindent + }% +} \newcommand{\finishthispage}{% -\@colN=\c@thisframe -\newpage -\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\@ff@chckifthispg{\c@page}{\@colN}% -\if@notthiscol\else -\mbox{}\newpage% -\fi -}} -\def\cleardoublepage{\finishthispage -\if@twoside -\ifodd\c@page -\else -\hbox{}\finishthispage -\fi -\fi} + \ifvmode + \@colN=\c@thisframe\relax + \count@=\c@absolutepage\relax + \ifdim \pagetotal<\topskip + \hbox{}% + \fi + \newpage \write \m@ne {}\vbox {}\penalty -\@Mi + \ifnum\count@=\c@absolutepage\relax + \whiledo{\@colN<\c@maxflow \OR \@colN=\c@maxflow}% + {% + \@ff@chckifthispg{\@ff@pages@countreg}{\@colN}% + \if@notthiscol + \else + \c@thisframe=\@colN\relax + \hbox{}\newpage + \fi + \advance\@colN by 1\relax + }% + \fi + \fi +} +\def\cleardoublepage{% + \clearpage + \if@twoside + \ifodd\c@page + \else + \hbox{}% + \clearpage + \fi + \fi +} +\preto\newpage{\global\usedframebreaktrue} \@twocolumnfalse \@mparswitchfalse \newcommand{\globalreversemargin}{% -\global\@mparbottom\z@\global\@reversemargintrue} + \global\@mparbottom\z@ + \global\@reversemargintrue +} \newcommand{\globalnormalmargin}{% -\global\@mparbottom\z@\global\@reversemarginfalse} + \global\@mparbottom\z@\global + \@reversemarginfalse +} \newcommand{\@getmarginpos}[1]{% -\ifthenelse{\equal{#1}{inner}}{% -\if@twoside -\ifodd\c@page\def\ff@margin{left}\else\def\ff@margin{right}\fi -\else -\def\ff@margin{left}% -\fi -}{% -\ifthenelse{\equal{#1}{outer}}{% -\if@twoside -\ifodd\c@page\def\ff@margin{right}\else\def\ff@margin{left}\fi -\else -\def\ff@margin{right}% -\fi -}{% -\def\ff@margin{#1}}}% + \ifthenelse{\equal{#1}{inner}}% + {% + \if@twoside + \ifodd\c@page\def\ff@margin{left}\else\def\ff@margin{right}\fi + \else + \def\ff@margin{left}% + \fi + }% + {% + \ifthenelse{\equal{#1}{outer}}% + {% + \if@twoside + \ifodd\c@page\def\ff@margin{right}\else\def\ff@margin{left}\fi + \else + \def\ff@margin{right}% + \fi + }% + {% + \def\ff@margin{#1}% + }% + }% } \newcommand{\setmargin}{% -\@getmarginpos{% -\csname @ff@margin@\romannumeral\c@thisframe\endcsname}% -\ifthenelse{\equal{\ff@margin}{left}}% -{\globalreversemargin}{\globalnormalmargin}% + \@getmarginpos + {% + \csname @ff@margin@\romannumeral\c@thisframe\endcsname + }% + \ifthenelse{\equal{\ff@margin}{left}}% + {\globalreversemargin}% + {\globalnormalmargin}% } \newcommand{\newflowframe}{\@n@wflowframe} \@onlypreamble{\newflowframe} \newcommand{\@n@wflowframe}{% -\global\advance\c@maxflow by 1\relax -\expandafter\global\expandafter -\newif\csname ifcolumnframe\romannumeral\c@maxflow\endcsname -\@ifstar\@snewflowframe\@newflowframe + \global\advance\c@maxflow by 1\relax + \expandafter\global\expandafter + \newif\csname ifcolumnframe\romannumeral\c@maxflow\endcsname + \@ifstar\@snewflowframe\@newflowframe } \newcommand{\@snewflowframe}{% -\expandafter\global\expandafter -\let\csname ifcolumnframe\romannumeral\c@maxflow\endcsname\iftrue -\@@newflowframe} + \expandafter\global\expandafter + \let\csname ifcolumnframe\romannumeral\c@maxflow\endcsname\iftrue + \@@newflowframe +} \newcommand{\@newflowframe}{% -\expandafter\global\expandafter -\let\csname ifcolumnframe\romannumeral\c@maxflow\endcsname\iffalse -\@@newflowframe} + \expandafter\global\expandafter + \let\csname ifcolumnframe\romannumeral\c@maxflow\endcsname\iffalse + \@@newflowframe +} \newcommand{\@@newflowframe}[5][all]{% -\expandafter\global\expandafter -\newbox\csname column\romannumeral\c@maxflow\endcsname -\expandafter\global\expandafter -\newlength\csname colwidth\romannumeral\c@maxflow\endcsname -\expandafter\global\expandafter -\newlength\csname colheight\romannumeral\c@maxflow\endcsname -\expandafter\global\expandafter -\newlength\csname col@\romannumeral\c@maxflow @posx\endcsname -\expandafter\global\expandafter -\newlength\csname col@\romannumeral\c@maxflow @posy\endcsname -\expandafter\global\expandafter -\setlength\csname colwidth\romannumeral\c@maxflow\endcsname{#2} -\expandafter\global\expandafter -\setlength\csname colheight\romannumeral\c@maxflow\endcsname{#3} -\expandafter\global\expandafter -\setlength\csname col@\romannumeral\c@maxflow @posx\endcsname{#4} -\expandafter\global\expandafter -\setlength\csname col@\romannumeral\c@maxflow @posy\endcsname{#5} -\expandafter\global\expandafter -\newlength\csname col@\romannumeral\c@maxflow @evenx\endcsname -\expandafter\global\expandafter -\newlength\csname col@\romannumeral\c@maxflow @eveny\endcsname -\expandafter\global\expandafter -\setlength\csname col@\romannumeral\c@maxflow @evenx\endcsname{#4} -\expandafter\global\expandafter -\setlength\csname col@\romannumeral\c@maxflow @eveny\endcsname{#5} -\expandafter -\gdef\csname @ff@frametype@\romannumeral\c@maxflow\endcsname{fbox}% -\expandafter -\gdef\csname @ff@col@\romannumeral\c@maxflow\endcsname{\flowframecol} -\expandafter -\gdef\csname @ff@txtcol@\romannumeral\c@maxflow\endcsname{% -\flowframetextcol} -\expandafter -\gdef\csname @ff@backcol@\romannumeral\c@maxflow\endcsname{{none}} -\expandafter -\gdef\csname @ff@pages@\romannumeral\c@maxflow\endcsname{#1} -\expandafter -\gdef\csname @ff@offset@\romannumeral\c@maxflow\endcsname{compute} -\expandafter -\gdef\csname @ff@angle@\romannumeral\c@maxflow\endcsname{0}% -\expandafter -\gdef\csname @ff@margin@\romannumeral\c@maxflow\endcsname{right} -\ifnum\c@thisframe=0\relax -\ifthenelse{\equal{#1}{all}\TE@or\equal{#1}{odd}}{% -\c@thisframe=\c@maxflow -\global\setlength{\hsize}{#2}% -\global\usedframebreaktrue -}{\ifthenelse{\equal{#1}{even}\TE@or\equal{#1}{none}}{}{% -\def\ff@pages{#1}% -\@for\@ff@pp:=\ff@pages\do{% -\def\@ff@numstart{0}\def\@ff@numend{0}% -\@ff@getrange{\@ff@pp}% -\ifnum\@ff@numstart=0\def\@ff@numstart{1}\fi -\ifnum\@ff@numstart=1\relax -\c@thisframe=\c@maxflow -\global\setlength{\hsize}{#2}% -\global\usedframebreaktrue -\fi -}}}% -\fi -\@ifnextchar[{\@s@tflowframeid{\c@maxflow}}{% -\@s@tflowframeid{\c@maxflow}[\number\c@maxflow]}} + \expandafter\global\expandafter + \newbox\csname column\romannumeral\c@maxflow\endcsname + \expandafter\global\expandafter + \newlength\csname colwidth\romannumeral\c@maxflow\endcsname + \expandafter\global\expandafter + \newlength\csname colheight\romannumeral\c@maxflow\endcsname + \expandafter\global\expandafter + \newlength\csname col@\romannumeral\c@maxflow @posx\endcsname + \expandafter\global\expandafter + \newlength\csname col@\romannumeral\c@maxflow @posy\endcsname + \expandafter\global\expandafter + \setlength\csname colwidth\romannumeral\c@maxflow\endcsname{#2} + \expandafter\global\expandafter + \setlength\csname colheight\romannumeral\c@maxflow\endcsname{#3} + \expandafter\global\expandafter + \setlength\csname col@\romannumeral\c@maxflow @posx\endcsname{#4} + \expandafter\global\expandafter + \setlength\csname col@\romannumeral\c@maxflow @posy\endcsname{#5} + \expandafter\global\expandafter + \newlength\csname col@\romannumeral\c@maxflow @evenx\endcsname + \expandafter\global\expandafter + \newlength\csname col@\romannumeral\c@maxflow @eveny\endcsname + \expandafter\global\expandafter + \setlength\csname col@\romannumeral\c@maxflow @evenx\endcsname{#4} + \expandafter\global\expandafter + \setlength\csname col@\romannumeral\c@maxflow @eveny\endcsname{#5} + \expandafter + \gdef\csname @ff@frametype@\romannumeral\c@maxflow\endcsname{fbox}% + \expandafter + \gdef\csname @ff@col@\romannumeral\c@maxflow\endcsname{\flowframecol} + \expandafter + \gdef\csname @ff@txtcol@\romannumeral\c@maxflow\endcsname{% + \flowframetextcol + } + \expandafter + \gdef\csname @ff@backcol@\romannumeral\c@maxflow\endcsname{{none}} + \expandafter + \gdef\csname @ff@pages@\romannumeral\c@maxflow\endcsname{#1}% + \expandafter + \gdef\csname @ff@xpages@\romannumeral\c@maxflow\endcsname{}% + \expandafter + \gdef\csname @ff@offset@\romannumeral\c@maxflow\endcsname{compute} + \expandafter + \gdef\csname @ff@angle@\romannumeral\c@maxflow\endcsname{0}% + \expandafter + \gdef\csname @ff@margin@\romannumeral\c@maxflow\endcsname{right} + \ifnum\c@thisframe=0\relax + \ifthenelse{\equal{#1}{all}\TE@or\equal{#1}{odd}}% + {% + \c@thisframe=\c@maxflow + \global\setlength{\hsize}{#2}% + \global\usedframebreaktrue + }% + {% + \ifthenelse{\equal{#1}{even}\TE@or\equal{#1}{none}}% + {}% + {% + \def\ff@pages{#1}% + \@for\@ff@pp:=\ff@pages\do + {% + \def\@ff@numstart{0}\def\@ff@numend{0}% + \@ff@getrange{\@ff@pp}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numstart=1\relax + \c@thisframe=\c@maxflow + \global\setlength{\hsize}{#2}% + \global\usedframebreaktrue + \fi + }% + }% + }% + \fi + \@ifnextchar[% + {\@s@tflowframeid{\c@maxflow}}% + {% + \@s@tflowframeid{\c@maxflow}[\number\c@maxflow]% + }% +} \def\@s@tflowframeid#1[#2]{% -\edef\ff@label{#2}% -\@ff@checkuniqueidl{#1}{\ff@label}% -\expandafter -\xdef\csname @col@id@\romannumeral#1\endcsname{\ff@label}% + \edef\ff@label{#2}% + \@ff@checkuniqueidl{#1}{\ff@label}% + \expandafter + \xdef\csname @col@id@\romannumeral#1\endcsname{\ff@label}% } \newcommand*{\@ff@checkuniqueidl}[2]{% -{\@colN=0\relax -\whiledo{\@colN<\c@maxflow}{% -\advance\@colN by 1\relax -\ifnum\@colN=#1\relax -\else -\ifthenelse{\equal{#2}{% -\csname @col@id@\romannumeral\@colN\endcsname}}{% -\PackageError{flowfram}{Flow frame IDL '#2' already defined}{% -You can't assign this label, as it is already defined -for flow frame \number\@colN}}{}% -\fi -}}} + {% + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \ifnum\@colN=#1\relax + \else + \ifthenelse + {% + \equal{#2}% + {% + \csname @col@id@\romannumeral\@colN\endcsname + }% + }% + {% + \PackageError{flowfram}% + {Flow frame IDL '#2' already defined}% + {% + You can't assign this label, as it is already defined + for flow frame \number\@colN + }% + }% + {}% + \fi + }% + }% +} \newcommand*{\getflowlabel}[1]{% -\csname @col@id@\romannumeral#1\endcsname} + \csname @col@id@\romannumeral#1\endcsname +} \newcommand*{\getflowid}[2]{% -\@flowframeid{#2}\edef#1{\number\ff@id}} -\newcommand*{\@flowframeid}[1]{\@colN=0\relax -\ff@id=0\relax -\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\ifthenelse{% -\equal{#1}{\csname @col@id@\romannumeral\@colN\endcsname}}{% -\ff@id=\@colN\relax -\@colN=\c@maxflow}{}}% -\ifnum\ff@id=0\relax -\PackageError{flowfram}{Can't find flow frame id '#1'}{}\fi} -\define@key{flowframe}{width}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'width' key}{}}{}% -\def\ff@width{#1}} -\define@key{flowframe}{height}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'height' key}{}}{}% -\def\ff@height{#1}} -\define@key{flowframe}{x}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'x' key}{}}{}% -\def\ff@x{#1}} -\define@key{flowframe}{y}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'y' key}{}}{}% -\def\ff@y{#1}} -\define@key{flowframe}{evenx}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'evenx' key}{}}{}% -\def\ff@evenx{#1}} -\define@key{flowframe}{eveny}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'eveny' key}{}}{}% -\def\ff@eveny{#1}} -\define@key{flowframe}{oddx}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'oddx' key}{}}{}% -\def\ff@oddx{#1}} -\define@key{flowframe}{oddy}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'oddy' key}{}}{}% -\def\ff@oddy{#1}} -\define@key{flowframe}{label}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'label' key}{}}{}% -\def\ff@label{#1}} -\define@key{flowframe}{border}[plain]{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'border' key - use -'none' for no border}{}}{}% -\ifthenelse{\equal{#1}{none}}{% -\def\ff@frame{false}}{\def\ff@frame{true}% -\ifthenelse{\equal{#1}{plain}}{\def\ff@frametype{fbox}}{% -\def\ff@frametype{#1}}}} -\define@key{flowframe}{bordercolor}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'bordercolor' key}{}}{}% -\def\ff@col{#1}} -\define@key{flowframe}{textcolor}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'textcolor' key}{}}{}% -\def\ff@txtcol{#1}} -\define@key{flowframe}{backcolor}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'backcolor' key}{}}{}% -\def\ff@backcol{#1}} -\define@key{flowframe}{pages}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'pages' key}{}}{}% -\def\ff@pages{#1}} -\define@key{flowframe}{offset}{\def\ff@offset{#1}% -\ifthenelse{\equal{#1}{}}{\PackageError{flowframe}{% -Invalid value for key 'offset'}{% -'offset' can either be 'compute' (to compute it according -to certain pre-defined rules) or a length}}{}} + \@flowframeid{#2}% + \edef#1{\number\ff@id}% +} +\newcommand*{\@flowframeid}[1]{% + \@colN=0\relax + \ff@id=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \ifthenelse + {% + \equal{#1}{\csname @col@id@\romannumeral\@colN\endcsname}% + }% + {% + \ff@id=\@colN\relax + \@colN=\c@maxflow + }% + {}% + }% + \ifnum\ff@id=0\relax + \PackageError{flowfram}{Can't find flow frame id '#1'}{}% + \fi +} +\define@key{flowframe}{width}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'width' key}{}% + }% + {}% + \def\ff@width{#1}% +} +\define@key{flowframe}{height}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'height' key}{}% + }% + {}% + \def\ff@height{#1}% +} +\define@key{flowframe}{x}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'x' key}{}% + }% + {}% + \def\ff@x{#1}% +} +\define@key{flowframe}{y}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'y' key}{}% + }% + {}% + \def\ff@y{#1}% +} +\define@key{flowframe}{evenx}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'evenx' key}{}% + }% + {}% + \def\ff@evenx{#1}% +} +\define@key{flowframe}{eveny}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'eveny' key}{}% + }% + {}% + \def\ff@eveny{#1}% +} +\define@key{flowframe}{oddx}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'oddx' key}{}% + }% + {}% + \def\ff@oddx{#1}% +} +\define@key{flowframe}{oddy}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'oddy' key}{}% + }% + {}% + \def\ff@oddy{#1}% +} +\define@key{flowframe}{label}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'label' key}{}% + }% + {}% + \def\ff@label{#1}% +} +\define@key{flowframe}{border}[plain]% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}% + {% + Missing value for 'border' key - use + 'none' for no border% + }% + {}% + }% + {}% + \ifthenelse{\equal{#1}{none}}% + {% + \def\ff@frame{false}% + }% + {% + \def\ff@frame{true}% + \ifthenelse{\equal{#1}{plain}}% + {% + \def\ff@frametype{fbox}% + }% + {% + \def\ff@frametype{#1}% + }% + }% +} +\define@key{flowframe}{bordercolor}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'bordercolor' key}{}% + }% + {}% + \def\ff@col{#1}% +} +\define@key{flowframe}{textcolor}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'textcolor' key}{}% + }% + {}% + \def\ff@txtcol{#1}% +} +\define@key{flowframe}{backcolor}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'backcolor' key}{}% + }% + {}% + \def\ff@backcol{#1}% +} +\define@key{flowframe}{pages}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'pages' key}{}% + }% + {}% + \def\ff@pages{#1}% +} +\define@key{flowframe}{excludepages}% +{% + \def\ff@xpages{#1}% +} +\define@key{flowframe}{offset}% +{% + \def\ff@offset{#1}% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowframe}% + {% + Invalid value for key 'offset'% + }% + {% + 'offset' can either be 'compute' (to compute it according + to certain pre-defined rules) or a length% + }% + }% + {}% +} \define@key{flowframe}{angle}{\def\ff@angle{#1}% } -\define@key{flowframe}{margin}{% -\ifthenelse{\equal{#1}{left} \or \equal{#1}{right} -\or \equal{#1}{inner} \or \equal{#1}{outer}}{% -\def\ff@margin{#1}}{\PackageError{flowfram}{invalid value of -'margin' key}{Key 'margin' can only take the values -'left' or 'right'}}} -\define@key{flowframe}{clear}[true]{% -\ifthenelse{\equal{#1}{true}\or\equal{#1}{false}}{% -\def\ff@clear{#1}}{\PackageError{flowfram}{Key 'clear' is -boolean}{You can only specify the values 'true' or 'false'}}} -\define@key{flowframe}{style}{\ifthenelse{\equal{#1}{}}{% -\PackageError{flowfram}{Missing value for 'style' key}{}}{}% -\ifthenelse{\equal{#1}{none}}{\def\ff@style{relax}}{\def\ff@style{#1}}} -\define@key{flowframe}{shape}{\def\ff@shape{#1}% -} -\define@key{flowframe}{valign}{\ifthenelse{\equal{#1}{c} \or -\equal{#1}{t} \or \equal{#1}{b}}{\def\ff@valign{#1}}{% -\PackageError{flowfram}{Invalid value for 'valign' key}{You -may only specify 'c', 't' or 'b'}}} +\define@choicekey{flowframe}{margin}{left,right,inner,outer}% +{% + \def\ff@margin{#1}% +} +\define@choicekey{flowframe}{clear}{true,false}[true]{% + \def\ff@clear{#1}% +} +\define@key{flowframe}{style}% +{% + \ifthenelse{\equal{#1}{}}% + {% + \PackageError{flowfram}{Missing value for 'style' key}{}% + }% + {}% + \ifthenelse{\equal{#1}{none}}% + {% + \def\ff@style{relax}% + }% + {% + \def\ff@style{#1}% + }% +} +\define@key{flowframe}{shape}% +{% + \def\ff@shape{#1}% +} +\define@choicekey{flowframe}{valign}{c,t,b}% +{% + \def\ff@valign{#1}% +} \newcommand*{\setallflowframes}[1]{% -\@colN=0\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\@@setflowframe{\@colN}{#1}}} + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \@@setflowframe{\@colN}{#1}% + }% +} \newcommand*{\setflowframe}{\@ifstar\@ssetflowframe\@setflowframe} \newcommand{\@ssetflowframe}[2]{% -\@for\@ff@id:=#1\do{% -\@flowframeid{\@ff@id}% -\@@setflowframe{\ff@id}{#2}}} + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \@@setflowframe{\ff@id}{#2}% + }% +} \newcommand*{\@setflowframe}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\setallflowframes{#2}}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}{% -\@@setflowframe{\@colN}{#2}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxflow\relax - \def\@ff@numend{\c@maxflow}% -\fi -\@colN=\@ff@numstart\relax -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@setflowframe{\@colN}{#2}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \setallflowframes{#2}% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}% + {% + \@colN=1\relax + }% + {% + \@colN=2\relax + }% + \whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}% + {% + \@@setflowframe{\@colN}{#2}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do + {% + \def\@ff@numstart{0}% + \def\@ff@numend{10000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxflow\relax + \def\@ff@numend{\c@maxflow}% + \fi + \@colN=\@ff@numstart\relax + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@setflowframe{\@colN}{#2}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} \newcommand*{\@@setflowframe}[2]{% -\def\ff@frame{}\def\ff@width{}\def\ff@height{}\def\ff@margin{}% -\def\ff@x{}\def\ff@y{}\def\ff@frametype{}\def\ff@col{}% -\def\ff@valign{}\def\ff@style{}% -\def\ff@txtcol{}\def\ff@clear{}\def\ff@offset{}\def\ff@pages{}% -\def\ff@label{}\def\ff@backcol{}\def\ff@evenx{}\def\ff@eveny{}% -\def\ff@oddx{}\def\ff@oddy{}\def\ff@angle{}\def\ff@shape{\empty}% -\setkeys{flowframe}{#2}% -\ifthenelse{\equal{\ff@frame}{}}{}{% -\setboolean{columnframe\romannumeral#1}{\ff@frame}}% -\ifthenelse{\equal{\ff@width}{}}{}{% -\expandafter\setlength\csname colwidth\romannumeral#1\endcsname -{\ff@width}}% -\ifthenelse{\equal{\ff@height}{}}{}{% -\expandafter\setlength\csname colheight\romannumeral#1\endcsname -{\ff@height}}% -\ifthenelse{\equal{\ff@x}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@posx\endcsname -{\ff@x}% -\expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname -{\ff@x}} -\ifthenelse{\equal{\ff@y}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@posy\endcsname -{\ff@y}% -\expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname -{\ff@y}}% -\ifthenelse{\equal{\ff@evenx}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname -{\ff@evenx}}% -\ifthenelse{\equal{\ff@eveny}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname -{\ff@eveny}}% -\ifthenelse{\equal{\ff@oddx}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@posx\endcsname -{\ff@oddx}}% -\ifthenelse{\equal{\ff@oddy}{}}{}{% -\expandafter\setlength\csname col@\romannumeral#1@posy\endcsname -{\ff@oddy}}% -\ifthenelse{\equal{\ff@label}{}}{}{% -\@s@tflowframeid{#1}[\ff@label]}% -\ifthenelse{\equal{\ff@frametype}{}}{}{% -\expandafter\edef\csname @ff@frametype@\romannumeral#1\endcsname -{\ff@frametype}}% -\ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\@setframecol\ff@col\end{#1}{col}{ff}}% -\ifthenelse{\equal{\ff@txtcol}{}}{}{% -\expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{ff}}% -\ifthenelse{\equal{\ff@backcol}{}}{}{% -\expandafter\@setframecol\ff@backcol\end{#1}{backcol}{ff}}% -\ifthenelse{\equal{\ff@margin}{}}{}{% -\expandafter\xdef\csname @ff@margin@\romannumeral#1\endcsname -{\ff@margin}}% -\ifthenelse{\equal{\ff@pages}{}}{}{% -\expandafter\xdef\csname @ff@pages@\romannumeral#1\endcsname -{\ff@pages}}% -\ifthenelse{\equal{\ff@offset}{}}{}{% -\expandafter\xdef\csname @ff@offset@\romannumeral#1\endcsname -{\ff@offset}}% -\ifthenelse{\equal{\ff@angle}{}}{}{% -\expandafter\xdef\csname @ff@angle@\romannumeral#1\endcsname -{\ff@angle}}% -\ifthenelse{\equal{\ff@clear}{}}{}{% -\PackageError{flowfram}% -{Key 'clear' not available for flow frames}{}}% -\ifthenelse{\equal{\ff@style}{}}{}{% -\PackageError{flowfram}% -{Key 'style' not available for flow frames}{}}% -\if\ff@shape\empty -\else -\PackageError{flowfram}% -{Key 'shape' not available for flow frames}{}% -\fi -\ifthenelse{\equal{\ff@valign}{}}{}{% -\PackageError{flowfram}% -{Key 'valign' not available for flow frames}{}}% + \def\ff@frame{}\def\ff@width{}\def\ff@height{}\def\ff@margin{}% + \def\ff@x{}\def\ff@y{}\def\ff@frametype{}\def\ff@col{}% + \def\ff@valign{}\def\ff@style{}% + \def\ff@txtcol{}\def\ff@clear{}\def\ff@offset{}\def\ff@pages{}% + \def\ff@label{}\def\ff@backcol{}\def\ff@evenx{}\def\ff@eveny{}% + \def\ff@oddx{}\def\ff@oddy{}\def\ff@angle{}% + \let\ff@xpages\undefined + \let\ff@shape\undefined + \setkeys{flowframe}{#2}% + \ifdefempty{\ff@frame}{}% + {% + \setboolean{columnframe\romannumeral#1}{\ff@frame}% + }% + \ifdefempty{\ff@width}{}% + {% + \expandafter + \setlength\csname colwidth\romannumeral#1\endcsname + {\ff@width}% + }% + \ifdefempty{\ff@height}{}% + {% + \expandafter + \setlength\csname colheight\romannumeral#1\endcsname + {\ff@height}% + }% + \ifdefempty{\ff@x}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@posx\endcsname + {\ff@x}% + \expandafter + \setlength\csname col@\romannumeral#1@evenx\endcsname + {\ff@x}% + } + \ifdefempty{\ff@y}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@posy\endcsname + {\ff@y}% + \expandafter + \setlength\csname col@\romannumeral#1@eveny\endcsname + {\ff@y}% + }% + \ifdefempty{\ff@evenx}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@evenx\endcsname + {\ff@evenx}% + }% + \ifdefempty{\ff@eveny}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@eveny\endcsname + {\ff@eveny}% + }% + \ifdefempty{\ff@oddx}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@posx\endcsname + {\ff@oddx}% + }% + \ifdefempty{\ff@oddy}{}% + {% + \expandafter + \setlength\csname col@\romannumeral#1@posy\endcsname + {\ff@oddy}% + }% + \ifdefempty{\ff@label}{}% + {% + \@s@tflowframeid{#1}[\ff@label]% + }% + \ifdefempty{\ff@frametype}{}% + {% + \expandafter + \edef\csname @ff@frametype@\romannumeral#1\endcsname{% + \ff@frametype}% + }% + \ifdefempty{\ff@col}{}% + {% + \expandafter\@setframecol\ff@col\end{#1}{col}{ff}% + }% + \ifdefempty{\ff@txtcol}{}% + {% + \expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{ff}% + }% + \ifdefempty{\ff@backcol}{}% + {% + \expandafter\@setframecol\ff@backcol\end{#1}{backcol}{ff}% + }% + \ifdefempty{\ff@margin}{}% + {% + \expandafter + \xdef\csname @ff@margin@\romannumeral#1\endcsname{% + \ff@margin}% + }% + \ifdefempty{\ff@pages}{}% + {% + \flowsetpagelist{#1}{\ff@pages}% + }% + \ifundef{\ff@xpages}{}% + {% + \flowsetexclusion{#1}{\ff@xpages}% + }% + \ifdefempty{\ff@offset}{}% + {% + \expandafter + \xdef\csname @ff@offset@\romannumeral#1\endcsname{% + \ff@offset}% + }% + \ifdefempty{\ff@angle}{}% + {% + \expandafter + \xdef\csname @ff@angle@\romannumeral#1\endcsname{% + \ff@angle}% + }% + \ifdefempty{\ff@clear}{}% + {% + \PackageError{flowfram}% + {Key 'clear' not available for flow frames}{}% + }% + \ifdefempty{\ff@style}{}% + {% + \PackageError{flowfram}% + {Key 'style' not available for flow frames}{}% + }% + \ifundef{\ff@shape}{}% + {% + \PackageError{flowfram}% + {Key 'shape' not available for flow frames}{}% + }% + \ifdefempty{\ff@valign}{}% + {% + \PackageError{flowfram}% + {Key 'valign' not available for flow frames}{}% + }% +} +\newcommand*{\flowsetpagelist}[2]{% + \expandafter + \xdef\csname @ff@pages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting page range for flow frame + \number#1\space\space to "#2"}% +} +\newcommand*{\flowsetexclusion}[2]{% + \expandafter + \xdef\csname @ff@xpages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting exclusion for flow frame + \number#1\space\space to "#2"}% +} +\newcommand*{\flowaddexclusion}[2]{% + \ifcsempty{@ff@xpages@\romannumeral#1} + {% + \expandafter + \xdef\csname @ff@xpages@\romannumeral#1\endcsname{#2}% + }% + {% + \expandafter + \xdef\csname @ff@xpages@\romannumeral#1\endcsname{% + \csname @ff@xpages@\romannumeral#1\endcsname,#2}% + }% + \flf@message{Setting exclusion for flow frame + \number#1\space\space to + "\csname @ff@xpages@\romannumeral#1\endcsname"}% } \newcommand*{\@@flowframeswapcoords}[1]{% -\setlength{\@ff@tmp@x}% -{\csname col@\romannumeral#1@evenx\endcsname} -\expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname -{\csname col@\romannumeral#1@posx\endcsname}% -\expandafter\setlength\csname col@\romannumeral#1@posx\endcsname -{\@ff@tmp@x}% -\setlength{\@ff@tmp@y}% -{\csname col@\romannumeral#1@eveny\endcsname} -\expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname -{\csname col@\romannumeral#1@posy\endcsname}% -\expandafter\setlength\csname col@\romannumeral#1@posy\endcsname -{\@ff@tmp@y}% + \setlength{\@ff@tmp@x}% + {\csname col@\romannumeral#1@evenx\endcsname} + \expandafter\setlength\csname col@\romannumeral#1@evenx\endcsname + {\csname col@\romannumeral#1@posx\endcsname}% + \expandafter\setlength\csname col@\romannumeral#1@posx\endcsname + {\@ff@tmp@x}% + \setlength{\@ff@tmp@y}% + {\csname col@\romannumeral#1@eveny\endcsname} + \expandafter\setlength\csname col@\romannumeral#1@eveny\endcsname + {\csname col@\romannumeral#1@posy\endcsname}% + \expandafter\setlength\csname col@\romannumeral#1@posy\endcsname + {\@ff@tmp@y}% } \newcommand*{\ffswapoddeven}{% -\@ifstar\@sflowframeswapcoords\@flowframeswapcoords} + \@ifstar\@sflowframeswapcoords\@flowframeswapcoords +} \newcommand*{\@sflowframeswapcoords}[1]{% -\@for\@ff@id:=#1\do{% -\@flowframeid{\@ff@id}% -\@@flowframeswapcoords{\ff@id}}} + \@for\@ff@id:=#1\do + {% + \@flowframeid{\@ff@id}% + \@@flowframeswapcoords{\ff@id}% + }% +} \newcommand*{\@flowframeswapcoords}[1]{% -\ifthenelse{\equal{#1}{all}}{% -\ff@id=0\relax -\whiledo{\ff@id<\c@maxflow}{\advance\ff@id by 1\relax -\@@flowframeswapcoords{\ff@id}}% -}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}{% -\@@flowframeswapcoords{\@colN}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxflow - \def\@ff@numend{\c@maxflow}% -\fi -\@colN=\@ff@numstart -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@flowframeswapcoords{\@colN}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \ff@id=0\relax + \whiledo{\ff@id<\c@maxflow}% + {% + \advance\ff@id by 1\relax + \@@flowframeswapcoords{\ff@id}% + }% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% + \whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}% + {% + \@@flowframeswapcoords{\@colN}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do + {% + \def\@ff@numstart{0}% + \def\@ff@numend{100000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxflow + \def\@ff@numend{\c@maxflow}% + \fi + \@colN=\@ff@numstart + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@flowframeswapcoords{\@colN}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} \newcommand*{\flowframex}[1]{% -\csname col@\romannumeral#1@posx\endcsname} + \csname col@\romannumeral#1@posx\endcsname +} \newcommand*{\flowframey}[1]{% -\csname col@\romannumeral#1@posy\endcsname} + \csname col@\romannumeral#1@posy\endcsname +} \newcommand*{\flowframeevenx}[1]{% -\csname col@\romannumeral#1@evenx\endcsname} + \csname col@\romannumeral#1@evenx\endcsname +} \newcommand*{\flowframeeveny}[1]{% -\csname col@\romannumeral#1@eveny\endcsname} + \csname col@\romannumeral#1@eveny\endcsname +} \newcommand{\flowframewidth}[1]{% -\csname colwidth\romannumeral#1\endcsname} + \csname colwidth\romannumeral#1\endcsname +} \newcommand*{\flowframeheight}[1]{% -\csname colheight\romannumeral#1\endcsname} + \csname colheight\romannumeral#1\endcsname +} \def\@setframecol{\@ifnextchar[\@@setframecol\@@setfr@mecol} \def\@@setframecol[#1]#2\end#3#4#5{% -\expandafter\edef\csname @#5@#4@\romannumeral#3\endcsname{% -[#1]{#2}}} + \expandafter\edef\csname @#5@#4@\romannumeral#3\endcsname{% + [#1]{#2}}% +} \def\@@setfr@mecol#1\end#2#3#4{% -\expandafter\edef\csname @#4@#3@\romannumeral#2\endcsname{{#1}}} + \expandafter\edef\csname @#4@#3@\romannumeral#2\endcsname{{#1}}% +} \newcommand*{\newstaticframe}{\@n@wstaticframe} \newcommand*{\@n@wstaticframe}{% -\global\advance\c@maxstatic by 1\relax -\newboolean{staticframe\romannumeral\c@maxstatic}% -\@ifstar\@snewstaticframe\@newstaticframe + \global\advance\c@maxstatic by 1\relax + \newboolean{staticframe\romannumeral\c@maxstatic}% + \@ifstar\@snewstaticframe\@newstaticframe } \newcommand{\@snewstaticframe}{% -\setboolean{staticframe\romannumeral\c@maxstatic}{true}% -\@@newstaticframe} + \setboolean{staticframe\romannumeral\c@maxstatic}{true}% + \@@newstaticframe +} \newcommand{\@newstaticframe}{% -\setboolean{staticframe\romannumeral\c@maxstatic}{false}% -\@@newstaticframe} + \setboolean{staticframe\romannumeral\c@maxstatic}{false}% + \@@newstaticframe +} \newcommand*{\@@newstaticframe}[5][all]{% -\expandafter -\newbox\csname @staticframe@\romannumeral\c@maxstatic\endcsname -\expandafter -\newlength\csname @sf@\romannumeral\c@maxstatic @posx\endcsname -\expandafter -\newlength\csname @sf@\romannumeral\c@maxstatic @posy\endcsname -\expandafter\setlength -\csname @sf@\romannumeral\c@maxstatic @posx\endcsname{#4}% -\expandafter\setlength -\csname @sf@\romannumeral\c@maxstatic @posy\endcsname{#5}% -\expandafter\newlength -\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname -\expandafter\newlength -\csname @sf@\romannumeral\c@maxstatic @eveny\endcsname -\expandafter\setlength -\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{#4}% -\expandafter\setlength -\csname @sf@\romannumeral\c@maxstatic @eveny\endcsname{#5}% -{\@ff@tmp@x=#2\relax -\@ff@tmp@y=#3\relax -\expandafter -\xdef\csname @sf@dim@\romannumeral\c@maxstatic\endcsname{% -[c][\the\@ff@tmp@y][c]{\the\@ff@tmp@x}}}% -\expandafter -\def\csname @sf@col@\romannumeral\c@maxstatic\endcsname{% -\flowframecol}% -\expandafter -\def\csname @sf@txtcol@\romannumeral\c@maxstatic\endcsname{% -\flowframetextcol}% -\expandafter -\def\csname @sf@backcol@\romannumeral\c@maxstatic\endcsname{% -{none}}% -\expandafter -\xdef\csname @sf@pages@\romannumeral\c@maxstatic\endcsname{#1}% -\expandafter -\gdef\csname @sf@offset@\romannumeral\c@maxstatic\endcsname{% -compute}% -\expandafter -\gdef\csname @sf@angle@\romannumeral\c@maxstatic\endcsname{0}% -\expandafter -\gdef\csname @sf@shape@\romannumeral\c@maxstatic\endcsname{\relax}% -\expandafter -\def\csname @sf@frametype@\romannumeral\c@maxstatic\endcsname{% -fbox}% -\newboolean{@sf@clear@\romannumeral\c@maxstatic}% -\setboolean{@sf@clear@\romannumeral\c@maxstatic}{false} -\@ifnextchar[{\@s@tstaticframeid{\c@maxstatic}}% -{\@s@tstaticframeid{\c@maxstatic}[\number\c@maxstatic]}} -\def\@s@tstaticframeid#1[#2]{% -\edef\ff@label{#2}% -\@sf@checkuniqueidl{#1}{\ff@label}% -\expandafter -\xdef\csname @sf@id@\romannumeral#1\endcsname{\ff@label}} -\newcommand*{\@sf@checkuniqueidl}[2]{% -\@colN=0\relax -\whiledo{\@colN<\c@maxstatic}{% -\advance\@colN by 1\relax -\ifnum\@colN=#1\relax -\else -\ifthenelse{% -\equal{#2}{\csname @sf@id@\romannumeral\@colN\endcsname}}{% -\PackageError{flowfram}{Static frame IDL '#2' already defined}{% -You can't assign this label, as it is already defined -for static frame \number\@colN}}{}% -\fi -}} -\newcommand*{\getstaticlabel}[1]{% -\csname @sf@id@\romannumeral#1\endcsname} -\newcommand*{\getstaticid}[2]{% -\@staticframeid{#2}\edef#1{\number\ff@id}} -\newcommand*{\@staticframeid}[1]{\@colN=0\relax -\ff@id=0\relax -\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\ifthenelse{% -\equal{#1}{\csname @sf@id@\romannumeral\@colN\endcsname}}{% -\ff@id=\@colN\relax -\@colN=\c@maxstatic}{}}% -\ifnum\ff@id=0\PackageError{flowfram}{Can't find static frame -id '#1'}{}\fi} -\newcommand*{\staticframex}[1]{% -\csname @sf@\romannumeral#1@posx\endcsname} -\newcommand*{\staticframey}[1]{% -\csname @sf@\romannumeral#1@posy\endcsname} -\newcommand*{\staticframeevenx}[1]{% -\csname @sf@\romannumeral#1@evenx\endcsname} -\newcommand*{\staticframeeveny}[1]{% -\csname @sf@\romannumeral#1@eveny\endcsname} -\newcommand*{\setallstaticframes}[1]{% -\@colN=0\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\@@setstaticframe{\@colN}{#1}}} -\newcommand*{\setstaticframe}{% -\@ifstar\@ssetstaticframe\@setstaticframe} -\newcommand*{\@ssetstaticframe}[2]{% -\@for\@ff@id:=#1\do{% -\@staticframeid{\@ff@id}% -\@@setstaticframe{\ff@id}{#2}}} + \expandafter + \newbox\csname @staticframe@\romannumeral\c@maxstatic\endcsname + \expandafter + \newlength\csname @sf@\romannumeral\c@maxstatic @posx\endcsname + \expandafter + \newlength\csname @sf@\romannumeral\c@maxstatic @posy\endcsname + \expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @posx\endcsname{#4}% + \expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @posy\endcsname{#5}% + \expandafter\newlength + \csname @sf@\romannumeral\c@maxstatic @evenx\endcsname + \expandafter\newlength + \csname @sf@\romannumeral\c@maxstatic @eveny\endcsname + \expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{#4}% + \expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @eveny\endcsname{#5}% + {\@ff@tmp@x=#2\relax + \@ff@tmp@y=#3\relax + \expandafter + \xdef\csname @sf@dim@\romannumeral\c@maxstatic\endcsname{% + [c][\the\@ff@tmp@y][c]{\the\@ff@tmp@x}}}% + \expandafter + \def\csname @sf@col@\romannumeral\c@maxstatic\endcsname{% + \flowframecol}% + \expandafter + \def\csname @sf@txtcol@\romannumeral\c@maxstatic\endcsname{% + \flowframetextcol}% + \expandafter + \def\csname @sf@backcol@\romannumeral\c@maxstatic\endcsname{% + {none}}% + \expandafter + \xdef\csname @sf@pages@\romannumeral\c@maxstatic\endcsname{#1}% + \expandafter + \gdef\csname @sf@xpages@\romannumeral\c@maxflow\endcsname{}% + \expandafter + \gdef\csname @sf@offset@\romannumeral\c@maxstatic\endcsname{% + compute}% + \expandafter + \gdef\csname @sf@angle@\romannumeral\c@maxstatic\endcsname{0}% + \expandafter + \gdef\csname @sf@shape@\romannumeral\c@maxstatic\endcsname{\relax}% + \expandafter + \def\csname @sf@frametype@\romannumeral\c@maxstatic\endcsname{% + fbox}% + \newboolean{@sf@clear@\romannumeral\c@maxstatic}% + \setboolean{@sf@clear@\romannumeral\c@maxstatic}{false} + \@ifnextchar[{\@s@tstaticframeid{\c@maxstatic}}% + {\@s@tstaticframeid{\c@maxstatic}[\number\c@maxstatic]}% +} +\def\@s@tstaticframeid#1[#2]{% + \edef\ff@label{#2}% + \@sf@checkuniqueidl{#1}{\ff@label}% + \expandafter + \xdef\csname @sf@id@\romannumeral#1\endcsname{\ff@label}% +} +\newcommand*{\@sf@checkuniqueidl}[2]{% + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \ifnum\@colN=#1\relax + \else + \ifthenelse + {% + \equal{#2}{\csname @sf@id@\romannumeral\@colN\endcsname}% + }% + {% + \PackageError{flowfram}% + {Static frame IDL '#2' already defined}% + {% + You can't assign this label, as it is already defined + for static frame \number\@colN + }% + }% + {}% + \fi + }% +} +\newcommand*{\getstaticlabel}[1]{% + \csname @sf@id@\romannumeral#1\endcsname +} +\newcommand*{\getstaticid}[2]{% + \@staticframeid{#2}\edef#1{\number\ff@id}% +} +\newcommand*{\@staticframeid}[1]{% + \@colN=0\relax + \ff@id=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \ifthenelse + {% + \equal{#1}{\csname @sf@id@\romannumeral\@colN\endcsname}% + }% + {% + \ff@id=\@colN\relax + \@colN=\c@maxstatic + }% + {}% + }% + \ifnum\ff@id=0\relax + \PackageError{flowfram}% + {Can't find static frame id '#1'}{}% + \fi +} +\newcommand*{\staticframex}[1]{% + \csname @sf@\romannumeral#1@posx\endcsname +} +\newcommand*{\staticframey}[1]{% + \csname @sf@\romannumeral#1@posy\endcsname +} +\newcommand*{\staticframeevenx}[1]{% + \csname @sf@\romannumeral#1@evenx\endcsname +} +\newcommand*{\staticframeeveny}[1]{% + \csname @sf@\romannumeral#1@eveny\endcsname +} +\newcommand*{\setallstaticframes}[1]{% + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \@@setstaticframe{\@colN}{#1}% + }% +} +\newcommand*{\setstaticframe}{% + \@ifstar\@ssetstaticframe\@setstaticframe +} +\newcommand*{\@ssetstaticframe}[2]{% + \@for\@ff@id:=#1\do + {% + \@staticframeid{\@ff@id}% + \@@setstaticframe{\ff@id}{#2}% + }% +} \newcommand*{\@setstaticframe}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\setallstaticframes{#2}}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxstatic\TE@or\@colN=\c@maxstatic}{% -\@@setstaticframe{\@colN}{#2}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxstatic\relax - \def\@ff@numend{\c@maxstatic}% -\fi -\@colN=\@ff@numstart\relax -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@setstaticframe{\@colN}{#2}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \setallstaticframes{#2}% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% + \whiledo{\@colN<\c@maxstatic\TE@or\@colN=\c@maxstatic}% + {% + \@@setstaticframe{\@colN}{#2}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do + {% + \def\@ff@numstart{0}% + \def\@ff@numend{10000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxstatic\relax + \def\@ff@numend{\c@maxstatic}% + \fi + \@colN=\@ff@numstart\relax + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@setstaticframe{\@colN}{#2}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} \newcommand*{\@@setstaticframe}[2]{% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname -\def\ff@frame{}\edef\ff@width{\the\@ff@tmp@x}\def\ff@angle{}% -\edef\ff@height{\the\@ff@tmp@y}\def\ff@style{}\def\ff@frametype{}% -\def\ff@x{}\def\ff@y{}\def\ff@col{}\def\ff@txtcol{}% -\def\ff@backcol{}\def\ff@shape{0}% -\def\ff@clear{}\def\ff@margin{}\def\ff@offset{}\def\ff@pages{}% -\def\ff@label{}\def\ff@evenx{}\def\ff@eveny{}% -\def\ff@oddx{}\def\ff@oddy{}% -\setkeys{flowframe}{#2}% -\ifthenelse{\equal{\ff@frame}{}}{}{% -\setboolean{staticframe\romannumeral#1}{\ff@frame}}% -\ifthenelse{\equal{\ff@x}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@posx\endcsname -{\ff@x}% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@evenx\endcsname -{\ff@x}}% -\ifthenelse{\equal{\ff@y}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@posy\endcsname -{\ff@y}% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@eveny\endcsname -{\ff@y}}% -\ifthenelse{\equal{\ff@evenx}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@evenx\endcsname -{\ff@evenx}}% -\ifthenelse{\equal{\ff@eveny}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@eveny\endcsname -{\ff@eveny}}% -\ifthenelse{\equal{\ff@oddx}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@posx\endcsname -{\ff@oddx}}% -\ifthenelse{\equal{\ff@oddy}{}}{}{% -\expandafter\global -\expandafter\setlength\csname @sf@\romannumeral#1@posy\endcsname -{\ff@oddy}}% -\expandafter -\xdef\csname @sf@dim@\romannumeral#1\endcsname{% -[c][\ff@height][\ff@valign]{\ff@width}}% -\ifthenelse{\equal{\ff@frametype}{}}{}{% -\expandafter -\xdef\csname @sf@frametype@\romannumeral#1\endcsname{% -\ff@frametype}}% -\ifthenelse{\equal{\ff@label}{}}{}{% -\@s@tstaticframeid{#1}[\ff@label]} -\ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\@setframecol\ff@col\end{#1}{col}{sf}}% -\ifthenelse{\equal{\ff@txtcol}{}}{}{% -\expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{sf}}% -\ifthenelse{\equal{\ff@backcol}{}}{}{% -\expandafter\@setframecol\ff@backcol\end{#1}{backcol}{sf}}% -\ifthenelse{\equal{\ff@offset}{}}{}{% -\expandafter -\xdef\csname @sf@offset@\romannumeral#1\endcsname{\ff@offset}}% -\ifthenelse{\equal{\ff@angle}{}}{}{% -\expandafter -\xdef\csname @sf@angle@\romannumeral#1\endcsname{\ff@angle}}% -\if0\ff@shape -\else -\expandafter\global\expandafter -\let\csname @sf@shape@\romannumeral#1\endcsname\ff@shape -\fi -\ifthenelse{\equal{\ff@pages}{}}{}{% -\expandafter -\xdef\csname @sf@pages@\romannumeral#1\endcsname{\ff@pages}}% -\ifthenelse{\equal{\ff@clear}{}}{}{% -\setboolean{@sf@clear@\romannumeral#1}{\ff@clear}}% -\ifthenelse{\equal{\ff@margin}{}}{}{% -\PackageError{flowfram}{Key 'margin' not available for -static frames}{Static frames don't have marginal notes}}% -\ifthenelse{\equal{\ff@style}{}}{}{% -\PackageError{flowfram}{Key 'style' not available for -static frames}{}}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname + \def\ff@frame{}\edef\ff@width{\the\@ff@tmp@x}\def\ff@angle{}% + \edef\ff@height{\the\@ff@tmp@y}\def\ff@style{}\def\ff@frametype{}% + \def\ff@x{}\def\ff@y{}\def\ff@col{}\def\ff@txtcol{}% + \def\ff@backcol{}% + \def\ff@clear{}\def\ff@margin{}\def\ff@offset{}\def\ff@pages{}% + \def\ff@label{}\def\ff@evenx{}\def\ff@eveny{}% + \def\ff@oddx{}\def\ff@oddy{}% + \let\ff@shape\undefined + \let\ff@xpages\undefined + \setkeys{flowframe}{#2}% + \ifdefempty{\ff@frame}{}% + {% + \setboolean{staticframe\romannumeral#1}{\ff@frame}% + }% + \ifdefempty{\ff@x}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@posx\endcsname + {\ff@x}% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@evenx\endcsname + {\ff@x}% + }% + \ifdefempty{\ff@y}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@posy\endcsname + {\ff@y}% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@eveny\endcsname + {\ff@y}% + }% + \ifdefempty{\ff@evenx}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@evenx\endcsname + {\ff@evenx}% + }% + \ifdefempty{\ff@eveny}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@eveny\endcsname + {\ff@eveny}% + }% + \ifdefempty{\ff@oddx}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@posx\endcsname + {\ff@oddx}% + }% + \ifdefempty{\ff@oddy}{}% + {% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral#1@posy\endcsname + {\ff@oddy}% + }% + \expandafter + \xdef\csname @sf@dim@\romannumeral#1\endcsname{% + [c][\ff@height][\ff@valign]{\ff@width}}% + \ifdefempty{\ff@frametype}{}% + {% + \expandafter + \xdef\csname @sf@frametype@\romannumeral#1\endcsname{% + \ff@frametype}% + }% + \ifdefempty{\ff@label}{}% + {% + \@s@tstaticframeid{#1}[\ff@label]% + } + \ifdefempty{\ff@col}{}% + {% + \expandafter\@setframecol\ff@col\end{#1}{col}{sf}% + }% + \ifdefempty{\ff@txtcol}{}% + {% + \expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{sf}% + }% + \ifdefempty{\ff@backcol}{}% + {% + \expandafter\@setframecol\ff@backcol\end{#1}{backcol}{sf}% + }% + \ifdefempty{\ff@offset}{}% + {% + \expandafter + \xdef\csname @sf@offset@\romannumeral#1\endcsname{\ff@offset}% + }% + \ifdefempty{\ff@angle}{}% + {% + \expandafter + \xdef\csname @sf@angle@\romannumeral#1\endcsname{\ff@angle}% + }% + \ifundef{\ff@shape}{}% + {% + \expandafter\global\expandafter + \let\csname @sf@shape@\romannumeral#1\endcsname\ff@shape + }% + \ifdefempty{\ff@pages}{}% + {% + \staticsetpagelist{#1}{\ff@pages}% + }% + \ifundef{\ff@xpages}{}% + {% + \staticsetexclusion{#1}{\ff@xpages}% + }% + \ifdefempty{\ff@clear}{}% + {% + \setboolean{@sf@clear@\romannumeral#1}{\ff@clear}% + }% + \ifdefempty{\ff@margin}{}% + {% + \PackageError{flowfram}% + {Key 'margin' not available for static frames}% + {Static frames don't have marginal notes}% + }% + \ifdefempty{\ff@style}{}% + {% + \PackageError{flowfram}% + {Key 'style' not available for static frames}{}% + }% } %\newcommand*{\simpar}{\hfil\vadjust{\vskip\parskip}\break\indent} \newcommand*{\simpar}{\hfill\\\indent\mbox{}} \let\FLForgpar\par -\newcommand{\ffpshpar}{\edef\flf@next{\hangafter=\the\hangafter -\hangindent=\the\hangindent}\FLForgpar\flf@next -\edef\flf@next{\prevgraf=\the\prevgraf}\@ff@parshape\indent\mbox{}\flf@next} +\newcommand{\ffpshpar}{% + \edef\flf@next{\hangafter=\the\hangafter + \hangindent=\the\hangindent}% + \FLForgpar\flf@next + \edef\flf@next{\prevgraf=\the\prevgraf}% + \@ff@parshape\indent\mbox{}\flf@next +} \def\@ff@parshape{\parshape=0} \newcommand*{\@ff@sectionhead}[1]{% -\def\ff@sechead{#1}% -\ffpshpar -\@ifstar{\@s@ff@heading}{\@dblarg\@ff@heading}} + \def\ff@sechead{#1}% + \ffpshpar + \@ifstar{\@s@ff@heading}{\@dblarg\@ff@heading}% +} \def\@s@ff@heading#1{% -\@ifundefined{@ff@old\ff@sechead}{\PackageError{flowfram}{Unknown -heading command '\ff@sechead'}{}}{% -\begingroup -\edef\flf@next{\hangafter=\the\hangafter -\hangindent=\the\hangindent}\FLForgpar\flf@next -\let\par=\FLForgpar -\edef\flf@next{\prevgraf=\the\prevgraf}% -\csname @ff@old\ff@sechead\endcsname*{\@ff@parshape\flf@next -#1}% -\xdef\flf@next{\@ff@parshape -\prevgraf=\the\prevgraf}% -\endgroup -}% -\mbox{}\flf@next\let\flf@next\undefined} + \@ifundefined{@ff@old\ff@sechead}% + {% + \PackageError{flowfram}% + {Unknown heading command '\ff@sechead'}{}% + }% + {% + \begingroup + \edef\flf@next{\hangafter=\the\hangafter + \hangindent=\the\hangindent}% + \FLForgpar\flf@next + \let\par=\FLForgpar + \edef\flf@next{\prevgraf=\the\prevgraf}% + \csname @ff@old\ff@sechead\endcsname*{% + \@ff@parshape\flf@next #1}% + \xdef\flf@next{% + \@ff@parshape + \prevgraf=\the\prevgraf}% + \endgroup + }% + \mbox{}\flf@next + \let\flf@next\undefined +} \def\@ff@heading[#1]#2{% -\@ifundefined{@ff@old\ff@sechead}{\PackageError{flowfram}{Unknown -heading command '\ff@sechead'}{}}{% -\begingroup -\edef\flf@next{\hangafter=\the\hangafter -\hangindent=\the\hangindent}\FLForgpar\flf@next -\let\par=\FLForgpar -\edef\flf@next{\prevgraf=\the\prevgraf}% -\csname @ff@old\ff@sechead\endcsname[#1]{\@ff@parshape\flf@next -#2}% -\xdef\flf@next{\@ff@parshape -\prevgraf=\the\prevgraf}% -\endgroup}% -\mbox{}\flf@next\let\flf@next\undefined} + \@ifundefined{@ff@old\ff@sechead}% + {% + \PackageError{flowfram}% + {Unknown heading command '\ff@sechead'}{}% + }% + {% + \begingroup + \edef\flf@next{% + \hangafter=\the\hangafter + \hangindent=\the\hangindent}% + \FLForgpar\flf@next + \let\par=\FLForgpar + \edef\flf@next{\prevgraf=\the\prevgraf}% + \csname @ff@old\ff@sechead\endcsname[#1]{% + \@ff@parshape\flf@next #2}% + \xdef\flf@next{\@ff@parshape + \prevgraf=\the\prevgraf}% + \endgroup + }% + \mbox{}\flf@next + \let\flf@next\undefined +} \newcommand*{\@ff@setsecthead}{% -\let\@ff@oldsection=\section -\let\@ff@oldsubsection=\subsection -\let\@ff@oldsubsubsection=\subsubsection -\let\@ff@oldparagraph=\paragraph -\let\@ff@oldsubparagraph=\subparagraph -\def\section{\@ff@sectionhead{section}}% -\def\subsection{\@ff@sectionhead{subsection}}% -\def\subsubsection{\@ff@sectionhead{subsubsection}}% -\def\paragraph{\@ff@sectionhead{paragraph}}% -\def\subparagraph{\@ff@sectionhead{subparagraph}}% + \let\@ff@oldsection=\section + \let\@ff@oldsubsection=\subsection + \let\@ff@oldsubsubsection=\subsubsection + \let\@ff@oldparagraph=\paragraph + \let\@ff@oldsubparagraph=\subparagraph + \def\section{\@ff@sectionhead{section}}% + \def\subsection{\@ff@sectionhead{subsection}}% + \def\subsubsection{\@ff@sectionhead{subsubsection}}% + \def\paragraph{\@ff@sectionhead{paragraph}}% + \def\subparagraph{\@ff@sectionhead{subparagraph}}% } \def\@ff@getshape#1#2\relax{% -\ifx#1\parshape -\def\ff@shape{1}% -\else -\ifx#1\shapepar -\def\ff@shape{2}% -\else -\ifx#1\relax -\def\ff@shape{0}% -\else -\PackageError{flowfram}{Unknown shape \string#1}{}% -\def\ff@shape{2}% -\fi -\fi -\fi} + \ifdefequal{#1}{\parshape}% + {% + \def\ff@shape{1}% + }% + {% + \ifdefequal{#1}{\shapepar}% + {% + \def\ff@shape{2}% + }% + {% + \ifx#1\relax + \def\ff@shape{0}% + \else + \PackageError{flowfram}{Unknown shape \string#1}{}% + \def\ff@shape{2}% + \fi + }% + }% +} \newcommand*{\@ff@disablesec}{% -\def\section{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% -\def\subsection{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% -\def\subsubsection{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% -\def\paragraph{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% -\def\subparagraph{\PackageError{flowfram}{You can't have -sectioning commands within a \string\shapepar}{}}% + \def\section{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% + \def\subsection{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% + \def\subsubsection{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% + \def\paragraph{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% + \def\subparagraph{% + \PackageError{flowfram}% + {You can't have sectioning commands within a \string\shapepar}{}% + }% } \newbox\staticframe \newenvironment{staticcontents}[1]{% -\let\continueonframe=\@staticcontinueonframe -\@beginstaticcontents{#1}% -}{% -\@endstaticcontents -\ignorespaces} -\newenvironment{staticcontents*}[1]{\@staticframeid{#1}% -\let\continueonframe=\@staticscontinueonframe -\@beginstaticcontents{\ff@id}% -}{% -\@endstaticcontents -\ignorespaces} -\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 -\expandafter\@ff@getshape\@ff@parshape\relax -\ifcase\ff@shape -\edef\@sf@mpg{% -\noexpand -\begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname -\noexpand\begingroup -\noexpand\let\noexpand\FLForgpar=\noexpand\par + \let\continueonframe=\@staticcontinueonframe + \@beginstaticcontents{#1}% }% -\or -\edef\@sf@mpg{% -\noexpand -\begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname -\@ff@parshape -\noexpand\begingroup -\noexpand\let\noexpand\FLForgpar=\noexpand\par -\noexpand\let\noexpand\par=\noexpand\ffpshpar -\noexpand\@ff@setsecthead -}% -\or -\edef\@sf@mpg{% -\noexpand -\begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname -\noexpand\begingroup -\noexpand\@ff@disablesec -\noexpand\@ff@parshape +{% + \@endstaticcontents + \ignorespaces +} +\newenvironment{staticcontents*}[1]{% + \@staticframeid{#1}% + \let\continueonframe=\@staticscontinueonframe + \@beginstaticcontents{\ff@id}% }% -\fi -\edef\@sf@thisframe{\csname @staticframe@\romannumeral#1\endcsname}% -\begin{lrbox}{\staticframe}% -\edef\ff@txtcol{\csname @sf@txtcol@\romannumeral#1\endcsname}% -\@s@tfftextcol\noindent -\@sf@mpg -\setlength\parindent\sdfparindent +{% + \@endstaticcontents + \ignorespaces +} +\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 + \expandafter\@ff@getshape\@ff@parshape\relax + \ifcase\ff@shape + \edef\@sf@mpg{% + \noexpand + \begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname + \noexpand\begingroup + \noexpand\let\noexpand\FLForgpar=\noexpand\par + }% + \or + \edef\@sf@mpg{% + \noexpand + \begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname + \@ff@parshape + \noexpand\begingroup + \noexpand\let\noexpand\FLForgpar=\noexpand\par + \noexpand\let\noexpand\par=\noexpand\ffpshpar + \noexpand\@ff@setsecthead + }% + \or + \edef\@sf@mpg{% + \noexpand + \begin{minipage}\csname @sf@dim@\romannumeral#1\endcsname + \noexpand\begingroup + \noexpand\@ff@disablesec + \noexpand\@ff@parshape + }% + \fi + \edef\@sf@thisframe{\csname @staticframe@\romannumeral#1\endcsname}% + \begin{lrbox}{\staticframe}% + \edef\ff@txtcol{\csname @sf@txtcol@\romannumeral#1\endcsname}% + \@s@tfftextcol\noindent + \@sf@mpg + \setlength\parindent\sdfparindent } \newcommand*{\@endstaticcontents}{% -\ifnum\ff@shape=2\par -\else\FLForgpar\fi\endgroup\end{minipage}\end{lrbox}% -\expandafter\global\expandafter\sbox\@sf@thisframe{% -\usebox\staticframe}} + \ifnum\ff@shape=2\relax + \par + \else + \FLForgpar + \fi + \endgroup + \end{minipage}% + \end{lrbox}% + \expandafter\global\expandafter + \sbox\@sf@thisframe{\usebox\staticframe}% +} \newcommand{\setstaticcontents}{% -\@ifstar\@sstaticconts\@staticconts} -\newcommand{\@sstaticconts}[2]{\begin{staticcontents*}{#1}% -#2\end{staticcontents*}} -\newcommand{\@staticconts}[2]{\begin{staticcontents}{#1}% -#2\end{staticcontents}} + \@ifstar\@sstaticconts\@staticconts +} +\newcommand{\@sstaticconts}[2]{% + \begin{staticcontents*}{#1}% + #2% + \end{staticcontents*}% +} +\newcommand{\@staticconts}[2]{% + \begin{staticcontents}{#1}% + #2% + \end{staticcontents}% +} +\newcommand*{\staticsetpagelist}[2]{% + \expandafter + \xdef\csname @sf@pages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting page range for static frame + \number#1\space\space to "#2"}% +} +\newcommand*{\staticsetexclusion}[2]{% + \expandafter + \xdef\csname @sf@xpages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting exclusion for static frame + \number#1\space\space to "#2"}% +} +\newcommand*{\staticaddexclusion}[2]{% + \ifcsempty{@sf@xpages@\romannumeral#1} + {% + \expandafter + \xdef\csname @sf@xpages@\romannumeral#1\endcsname{#2}% + }% + {% + \expandafter + \xdef\csname @sf@xpages@\romannumeral#1\endcsname{% + \csname @sf@xpages@\romannumeral#1\endcsname,#2}% + }% + \flf@message{Setting exclusion for static frame + \number#1\space\space to + "\csname @sf@xpages@\romannumeral#1\endcsname"}% +} \newcommand*{\@@staticframeswapcoords}[1]{% -\setlength{\@ff@tmp@x}% -{\csname @sf@\romannumeral#1@evenx\endcsname} -\expandafter\setlength\csname @sf@\romannumeral#1@evenx\endcsname -{\csname @sf@\romannumeral#1@posx\endcsname}% -\expandafter\setlength\csname @sf@\romannumeral#1@posx\endcsname -{\@ff@tmp@x}% -\setlength{\@ff@tmp@y}% -{\csname @sf@\romannumeral#1@eveny\endcsname} -\expandafter\setlength\csname @sf@\romannumeral#1@eveny\endcsname -{\csname @sf@\romannumeral#1@posy\endcsname}% -\expandafter\setlength\csname @sf@\romannumeral#1@posy\endcsname -{\@ff@tmp@y}% + \setlength{\@ff@tmp@x}% + {\csname @sf@\romannumeral#1@evenx\endcsname} + \expandafter\setlength\csname @sf@\romannumeral#1@evenx\endcsname + {\csname @sf@\romannumeral#1@posx\endcsname}% + \expandafter\setlength\csname @sf@\romannumeral#1@posx\endcsname + {\@ff@tmp@x}% + \setlength{\@ff@tmp@y}% + {\csname @sf@\romannumeral#1@eveny\endcsname} + \expandafter\setlength\csname @sf@\romannumeral#1@eveny\endcsname + {\csname @sf@\romannumeral#1@posy\endcsname}% + \expandafter\setlength\csname @sf@\romannumeral#1@posy\endcsname + {\@ff@tmp@y}% } \newcommand*{\sfswapoddeven}{% -\@ifstar\@sstaticframeswapcoords\@staticframeswapcoords} + \@ifstar\@sstaticframeswapcoords\@staticframeswapcoords +} \newcommand*{\@sstaticframeswapcoords}[1]{% -\@for\@ff@id:=#1\do{% -\@staticframeid{\@ff@id}% -\@@staticframeswapcoords{\ff@id}}} + \@for\@ff@id:=#1\do + {% + \@staticframeid{\@ff@id}% + \@@staticframeswapcoords{\ff@id}% + }% +} \newcommand*{\@staticframeswapcoords}[1]{% -\ifthenelse{\equal{#1}{all}}{% -\ff@id=0\relax -\whiledo{\ff@id<\c@maxflow}{\advance\ff@id by 1\relax -\@@staticframeswapcoords{\ff@id}}% -}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}{% -\@@staticframeswapcoords{\@colN}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxflow - \def\@ff@numend{\c@maxflow}% -\fi -\@colN=\@ff@numstart -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@staticframeswapcoords{\@colN}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \ff@id=0\relax + \whiledo{\ff@id<\c@maxflow}% + {% + \advance\ff@id by 1\relax + \@@staticframeswapcoords{\ff@id}% + }% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% + \whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}% + {% + \@@staticframeswapcoords{\@colN}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do + {% + \def\@ff@numstart{0}\def\@ff@numend{100000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxflow + \def\@ff@numend{\c@maxflow}% + \fi + \@colN=\@ff@numstart + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@staticframeswapcoords{\@colN}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} \newcommand*{\newdynamicframe}{% -\@n@wdynamicframe} + \@n@wdynamicframe +} \newcommand*{\@n@wdynamicframe}{% -\global\advance\c@maxdynamic by 1\relax -\newboolean{dynamicframe\romannumeral\c@maxdynamic} -\@ifstar\@snewdynamicframe\@newdynamicframe + \global\advance\c@maxdynamic by 1\relax + \newboolean{dynamicframe\romannumeral\c@maxdynamic} + \@ifstar\@snewdynamicframe\@newdynamicframe } \newcommand*{\@snewdynamicframe}{% -\setboolean{dynamicframe\romannumeral\c@maxdynamic}{true}% -\@@newdynamicframe} + \setboolean{dynamicframe\romannumeral\c@maxdynamic}{true}% + \@@newdynamicframe +} \newcommand*{\@newdynamicframe}{% -\setboolean{dynamicframe\romannumeral\c@maxdynamic}{false}% -\@@newdynamicframe} + \setboolean{dynamicframe\romannumeral\c@maxdynamic}{false}% + \@@newdynamicframe +} \newcommand*{\@@newdynamicframe}[5][all]{% -\expandafter -\gdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{}% -\expandafter -\newlength\csname @df@\romannumeral\c@maxdynamic @posx\endcsname -\expandafter -\newlength\csname @df@\romannumeral\c@maxdynamic @posy\endcsname -\expandafter\setlength -\csname @df@\romannumeral\c@maxdynamic @posx\endcsname{#4}% -\expandafter\setlength -\csname @df@\romannumeral\c@maxdynamic @posy\endcsname{#5}% -\expandafter\newlength -\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname -\expandafter\newlength -\csname @df@\romannumeral\c@maxdynamic @eveny\endcsname -\expandafter\setlength -\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname{#4}% -\expandafter\setlength -\csname @df@\romannumeral\c@maxdynamic @eveny\endcsname{#5}% -{\@ff@tmp@x=#2\relax -\@ff@tmp@y=#3\relax -\expandafter -\xdef\csname @df@dim@\romannumeral\c@maxdynamic\endcsname{% -[c][\the\@ff@tmp@y][t]{\the\@ff@tmp@x}}}% -\expandafter -\gdef\csname @df@col@\romannumeral\c@maxdynamic\endcsname{% -\flowframecol}% -\expandafter -\gdef\csname @df@txtcol@\romannumeral\c@maxdynamic\endcsname{% -\flowframetextcol}% -\expandafter -\gdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname{% -{none}}% -\expandafter -\gdef\csname @df@pages@\romannumeral\c@maxdynamic\endcsname{#1}% -\expandafter -\gdef\csname @df@frametype@\romannumeral\c@maxdynamic\endcsname{% -fbox}% -\expandafter -\gdef\csname @df@style@\romannumeral\c@maxdynamic\endcsname{relax}% -\expandafter -\gdef\csname @df@offset@\romannumeral\c@maxdynamic\endcsname{compute}% -\expandafter -\gdef\csname @df@angle@\romannumeral\c@maxdynamic\endcsname{0}% -\expandafter -\gdef\csname @df@shape@\romannumeral\c@maxdynamic\endcsname{\relax}% -\newboolean{@df@clear@\romannumeral\c@maxdynamic}% -\setboolean{@df@clear@\romannumeral\c@maxdynamic}{false}% -\@ifnextchar[{\@s@tdynamicframeid{\c@maxdynamic}}% -{\@s@tdynamicframeid{\c@maxdynamic}[\number\c@maxdynamic]}} + \expandafter + \gdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{}% + \expandafter + \newlength\csname @df@\romannumeral\c@maxdynamic @posx\endcsname + \expandafter + \newlength\csname @df@\romannumeral\c@maxdynamic @posy\endcsname + \expandafter\setlength + \csname @df@\romannumeral\c@maxdynamic @posx\endcsname{#4}% + \expandafter\setlength + \csname @df@\romannumeral\c@maxdynamic @posy\endcsname{#5}% + \expandafter\newlength + \csname @df@\romannumeral\c@maxdynamic @evenx\endcsname + \expandafter\newlength + \csname @df@\romannumeral\c@maxdynamic @eveny\endcsname + \expandafter\setlength + \csname @df@\romannumeral\c@maxdynamic @evenx\endcsname{#4}% + \expandafter\setlength + \csname @df@\romannumeral\c@maxdynamic @eveny\endcsname{#5}% + {% + \@ff@tmp@x=#2\relax + \@ff@tmp@y=#3\relax + \expandafter + \xdef\csname @df@dim@\romannumeral\c@maxdynamic\endcsname{% + [c][\the\@ff@tmp@y][t]{\the\@ff@tmp@x}% + }% + }% + \expandafter + \gdef\csname @df@col@\romannumeral\c@maxdynamic\endcsname{% + \flowframecol + }% + \expandafter + \gdef\csname @df@txtcol@\romannumeral\c@maxdynamic\endcsname{% + \flowframetextcol + }% + \expandafter + \gdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname{% + {none}}% + \expandafter + \gdef\csname @df@pages@\romannumeral\c@maxdynamic\endcsname{#1}% + \expandafter + \gdef\csname @df@xpages@\romannumeral\c@maxflow\endcsname{}% + \expandafter + \gdef\csname @df@frametype@\romannumeral\c@maxdynamic\endcsname{% + fbox}% + \expandafter + \gdef\csname @df@style@\romannumeral\c@maxdynamic\endcsname{relax}% + \expandafter + \gdef\csname @df@offset@\romannumeral\c@maxdynamic\endcsname{compute}% + \expandafter + \gdef\csname @df@angle@\romannumeral\c@maxdynamic\endcsname{0}% + \expandafter + \gdef\csname @df@shape@\romannumeral\c@maxdynamic\endcsname{\relax}% + \newboolean{@df@clear@\romannumeral\c@maxdynamic}% + \setboolean{@df@clear@\romannumeral\c@maxdynamic}{false}% + \@ifnextchar[{\@s@tdynamicframeid{\c@maxdynamic}}% + {\@s@tdynamicframeid{\c@maxdynamic}[\number\c@maxdynamic]}% +} \def\@s@tdynamicframeid#1[#2]{% -\edef\ff@label{#2}% -\@df@checkuniqueidl{#1}{\ff@label}% -\expandafter -\xdef\csname @df@id@\romannumeral#1\endcsname{\ff@label}} + \edef\ff@label{#2}% + \@df@checkuniqueidl{#1}{\ff@label}% + \expandafter + \xdef\csname @df@id@\romannumeral#1\endcsname{\ff@label}% +} \newcommand*{\@df@checkuniqueidl}[2]{% -\@colN=0\relax -\whiledo{\@colN<\c@maxdynamic}{% -\advance\@colN by 1\relax -\ifnum\@colN=#1\relax -\else -\ifthenelse{\equal{#2}% -{\csname @df@id@\romannumeral\@colN\endcsname}}{% -\PackageError{flowfram}{Dynamic frame IDL '#2' already defined}{% -You can't assign this label, as it is already defined -for dynamic frame \number\@colN}}{}% -\fi -}} + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \ifnum\@colN=#1\relax + \else + \ifthenelse + {% + \equal{#2}% + {\csname @df@id@\romannumeral\@colN\endcsname}% + }% + {% + \PackageError{flowfram}% + {Dynamic frame IDL '#2' already defined}% + {% + You can't assign this label, as it is already defined + for dynamic frame \number\@colN + }% + }% + {}% + \fi + }% +} \newcommand*{\getdynamiclabel}[1]{% -\csname @df@id@\romannumeral#1\endcsname} + \csname @df@id@\romannumeral#1\endcsname +} \newcommand*{\getdynamicid}[2]{% -\@dynamicframeid{#2}\edef#1{\number\ff@id}} -\newcommand*{\@dynamicframeid}[1]{\@colN=0\relax -\ff@id=0\relax -\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\ifthenelse{% -\equal{#1}{\csname @df@id@\romannumeral\@colN\endcsname}}{% -\ff@id=\@colN\relax -\@colN=\c@maxdynamic}{}}% -\ifnum\ff@id=0\PackageError{flowfram}{Can't find dynamic frame -id '#1'}{}\fi} + \@dynamicframeid{#2}\edef#1{\number\ff@id}% +} +\newcommand*{\@dynamicframeid}[1]{% + \@colN=0\relax + \ff@id=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \ifthenelse + {% + \equal{#1}{\csname @df@id@\romannumeral\@colN\endcsname}% + }% + {% + \ff@id=\@colN\relax + \@colN=\c@maxdynamic + }% + {}% + }% + \ifnum\ff@id=0\relax + \PackageError{flowfram}% + {Can't find dynamic frame id '#1'}{}% + \fi +} \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}}} + \@ifdefined{@#1frameid}% + {\csname @#1frameid\endcsname{#2}}% + {% + \PackageError{flowfram}% + {Unknown frame type `#1'}% + {Frame types can be one of: flow, static or dynamic}% + }% +} \newcommand*{\dynamicframex}[1]{% -\csname @df@\romannumeral#1@posx\endcsname} + \csname @df@\romannumeral#1@posx\endcsname +} \newcommand*{\dynamicframey}[1]{% -\csname @df@\romannumeral#1@posy\endcsname} + \csname @df@\romannumeral#1@posy\endcsname +} \newcommand*{\dynamicframeevenx}[1]{% -\csname @df@\romannumeral#1@evenx\endcsname} + \csname @df@\romannumeral#1@evenx\endcsname +} \newcommand*{\dynamicframeeveny}[1]{% -\csname @df@\romannumeral#1@eveny\endcsname} + \csname @df@\romannumeral#1@eveny\endcsname +} \newcommand*{\setalldynamicframes}[1]{% -\@colN=0\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\@@setdynamicframe{\@colN}{#1}}} + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \@@setdynamicframe{\@colN}{#1}% + }% +} \newcommand*{\setdynamicframe}{% -\@ifstar\@ssetdynamicframe\@setdynamicframe} + \@ifstar\@ssetdynamicframe\@setdynamicframe +} \newcommand*{\@ssetdynamicframe}[2]{% -\@for\@ff@id:=#1\do{% -\@dynamicframeid{\@ff@id}% -\@@setdynamicframe{\ff@id}{#2}}} + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@@setdynamicframe{\ff@id}{#2}% + }% +} \newcommand*{\@setdynamicframe}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\setalldynamicframes{#2}}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxdynamic\TE@or\@colN=\c@maxdynamic}{% -\@@setdynamicframe{\@colN}{#2}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxdynamic\relax - \def\@ff@numend{\c@maxdynamic}% -\fi -\@colN=\@ff@numstart\relax -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@setdynamicframe{\@colN}{#2}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \setalldynamicframes{#2}% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}% + {\@colN=1}% + {\@colN=2}% + \whiledo{\@colN<\c@maxdynamic\TE@or\@colN=\c@maxdynamic}% + {% + \@@setdynamicframe{\@colN}{#2}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do{% + \def\@ff@numstart{0}% + \def\@ff@numend{10000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxdynamic\relax + \def\@ff@numend{\c@maxdynamic}% + \fi + \@colN=\@ff@numstart\relax + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@setdynamicframe{\@colN}{#2}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} \newcommand*{\@@setdynamicframe}[2]{% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname -\def\ff@frame{}\edef\ff@width{\the\@ff@tmp@x}% -\edef\ff@height{\the\@ff@tmp@y}\def\ff@style{}\def\ff@frametype{}% -\def\ff@x{}\def\ff@y{}\def\ff@col{}\def\ff@txtcol{}\def\ff@backcol{}% -\def\ff@clear{}\def\ff@margin{}\def\ff@offset{}\def\ff@pages{}% -\def\ff@label{}\def\ff@evenx{}\def\ff@eveny{}% -\def\ff@oddx{}\def\ff@oddy{}\def\ff@angle{}\def\ff@shape{0}% -\setkeys{flowframe}{#2}% -\ifthenelse{\equal{\ff@frame}{}}{}{% -\setboolean{dynamicframe\romannumeral#1}{\ff@frame}}% -\ifthenelse{\equal{\ff@x}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@posx\endcsname{\ff@x}% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@evenx\endcsname{\ff@x}}% -\ifthenelse{\equal{\ff@y}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@posy\endcsname{\ff@y}% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@eveny\endcsname{\ff@y}}% -\ifthenelse{\equal{\ff@evenx}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@evenx\endcsname{\ff@evenx}}% -\ifthenelse{\equal{\ff@eveny}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@eveny\endcsname{\ff@eveny}}% -\ifthenelse{\equal{\ff@oddx}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@posx\endcsname{\ff@oddx}}% -\ifthenelse{\equal{\ff@oddy}{}}{}{% -\expandafter\global\expandafter\setlength -\csname @df@\romannumeral#1@posy\endcsname{\ff@oddy}}% -\expandafter\xdef\csname @df@dim@\romannumeral#1\endcsname{% -[c][\ff@height][\ff@valign]{\ff@width}}% -\ifthenelse{\equal{\ff@label}{}}{}{% -\@s@tdynamicframeid{#1}[\ff@label]}% -\ifthenelse{\equal{\ff@frametype}{}}{}{% -\expandafter -\xdef\csname @df@frametype@\romannumeral#1\endcsname{% -\ff@frametype}}% -\ifthenelse{\equal{\ff@col}{}}{}{% -\expandafter\@setframecol\ff@col\end{#1}{col}{df}}% -\ifthenelse{\equal{\ff@txtcol}{}}{}{% -\expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{df}}% -\ifthenelse{\equal{\ff@backcol}{}}{}{% -\expandafter\@setframecol\ff@backcol\end{#1}{backcol}{df}}% -\ifthenelse{\equal{\ff@offset}{}}{}{% -\expandafter -\xdef\csname @df@offset@\romannumeral#1\endcsname{\ff@offset}}% -\ifthenelse{\equal{\ff@angle}{}}{}{% -\expandafter -\xdef\csname @df@angle@\romannumeral#1\endcsname{\ff@angle}}% -\if0\ff@shape -\else -\expandafter\global\expandafter -\let\csname @df@shape@\romannumeral#1\endcsname\ff@shape -\fi -\ifthenelse{\equal{\ff@pages}{}}{}{% -\expandafter\xdef\csname @df@pages@\romannumeral#1\endcsname{% -\ff@pages}}% -\ifthenelse{\equal{\ff@style}{}}{}{% -\@ifundefined{\ff@style}{\PackageError{flowfram}% -{Unknown style '\ff@style'}{The command \expandafter -\string\csname\ff@style\endcsname\space has not been defined}}{% -\expandafter -\xdef\csname @df@style@\romannumeral#1\endcsname{\ff@style}}}% -\ifthenelse{\equal{\ff@clear}{}}{}{% -\setboolean{@df@clear@\romannumeral#1}{\ff@clear}% -}% -\ifthenelse{\equal{\ff@margin}{}}{}{% -\PackageError{flowfram}{Key 'margin' not available for dynamic -frames}{dynamic frames don't have marginal notes}}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname + \def\ff@frame{}\edef\ff@width{\the\@ff@tmp@x}% + \edef\ff@height{\the\@ff@tmp@y}\def\ff@style{}\def\ff@frametype{}% + \def\ff@x{}\def\ff@y{}\def\ff@col{}\def\ff@txtcol{}\def\ff@backcol{}% + \def\ff@clear{}\def\ff@margin{}\def\ff@offset{}\def\ff@pages{}% + \def\ff@label{}\def\ff@evenx{}\def\ff@eveny{}% + \def\ff@oddx{}\def\ff@oddy{}\def\ff@angle{}% + \let\ff@shape\undefined + \let\ff@xpages\undefined + \setkeys{flowframe}{#2}% + \ifdefempty{\ff@frame}% + {}% + {% + \setboolean{dynamicframe\romannumeral#1}{\ff@frame}% + }% + \ifdefempty{\ff@x}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@posx\endcsname{\ff@x}% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@evenx\endcsname{\ff@x}% + }% + \ifdefempty{\ff@y}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@posy\endcsname{\ff@y}% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@eveny\endcsname{\ff@y}% + }% + \ifdefempty{\ff@evenx}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@evenx\endcsname{\ff@evenx}% + }% + \ifdefempty{\ff@eveny}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@eveny\endcsname{\ff@eveny}% + }% + \ifdefempty{\ff@oddx}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@posx\endcsname{\ff@oddx}% + }% + \ifdefempty{\ff@oddy}% + {}% + {% + \expandafter\global\expandafter\setlength + \csname @df@\romannumeral#1@posy\endcsname{\ff@oddy}% + }% + \expandafter\xdef\csname @df@dim@\romannumeral#1\endcsname{% + [c][\ff@height][\ff@valign]{\ff@width}% + }% + \ifdefempty{\ff@label}% + {}% + {% + \@s@tdynamicframeid{#1}[\ff@label]% + }% + \ifdefempty{\ff@frametype}% + {}% + {% + \expandafter + \xdef\csname @df@frametype@\romannumeral#1\endcsname{% + \ff@frametype + }% + }% + \ifdefempty{\ff@col}% + {}% + {% + \expandafter\@setframecol\ff@col\end{#1}{col}{df}% + }% + \ifdefempty{\ff@txtcol}% + {}% + {% + \expandafter\@setframecol\ff@txtcol\end{#1}{txtcol}{df}% + }% + \ifdefempty{\ff@backcol}% + {}% + {% + \expandafter\@setframecol\ff@backcol\end{#1}{backcol}{df}% + }% + \ifdefempty{\ff@offset}% + {}% + {% + \expandafter + \xdef\csname @df@offset@\romannumeral#1\endcsname{\ff@offset}% + }% + \ifdefempty{\ff@angle}% + {}% + {% + \expandafter + \xdef\csname @df@angle@\romannumeral#1\endcsname{\ff@angle}% + }% + \ifundef{\ff@shape}{}% + {% + \expandafter\global\expandafter + \let\csname @df@shape@\romannumeral#1\endcsname\ff@shape + }% + \ifdefempty{\ff@pages}% + {}% + {% + \dynamicsetpagelist{#1}{\ff@pages}% + }% + \ifundef{\ff@xpages}{}% + {% + \dynamicsetexclusion{#1}{\ff@xpages}% + }% + \ifdefempty{\ff@style}% + {}% + {% + \ifcsundef{\ff@style}% + {% + \PackageError{flowfram}% + {Unknown style '\ff@style'}% + {% + The command \expandafter\@gobble\string\\\ff@style + \space has not been defined% + }% + }% + {% + \expandafter + \xdef\csname @df@style@\romannumeral#1\endcsname{\ff@style}% + }% + }% + \ifdefempty{\ff@clear}% + {}% + {% + \setboolean{@df@clear@\romannumeral#1}{\ff@clear}% + }% + \ifdefempty{\ff@margin}% + {}% + {% + \PackageError{flowfram}% + {% + Key 'margin' not available for dynamic frames% + }% + {dynamic frames don't have marginal notes}% + }% +} +\newcommand*{\dynamicsetpagelist}[2]{% + \expandafter + \xdef\csname @df@pages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting page range for dynamic frame + \number#1\space\space to "#2"}% +} +\newcommand*{\dynamicsetexclusion}[2]{% + \expandafter + \xdef\csname @df@xpages@\romannumeral#1\endcsname{#2}% + \flf@message{Setting exclusion for dynamic frame + \number#1\space\space to "#2"}% +} +\newcommand*{\dynamicaddexclusion}[2]{% + \ifcsempty{@df@xpages@\romannumeral#1} + {% + \expandafter + \xdef\csname @df@xpages@\romannumeral#1\endcsname{#2}% + }% + {% + \expandafter + \xdef\csname @df@xpages@\romannumeral#1\endcsname{% + \csname @df@xpages@\romannumeral#1\endcsname,#2}% + }% + \flf@message{Setting exclusion for dynamic frame + \number#1\space\space to + "\csname @df@xpages@\romannumeral#1\endcsname"}% } \newcommand*{\@@dynamicframeswapcoords}[1]{% -\setlength{\@ff@tmp@x}% -{\csname @df@\romannumeral#1@evenx\endcsname}% -\expandafter\setlength -\csname @df@\romannumeral#1@evenx\endcsname -{\csname @df@\romannumeral#1@posx\endcsname}% -\expandafter\setlength -\csname @df@\romannumeral#1@posx\endcsname{\@ff@tmp@x}% -\setlength{\@ff@tmp@y}% -{\csname @df@\romannumeral#1@eveny\endcsname}% -\expandafter\setlength -\csname @df@\romannumeral#1@eveny\endcsname -{\csname @df@\romannumeral#1@posy\endcsname}% -\expandafter\setlength\csname @df@\romannumeral#1@posy\endcsname -{\@ff@tmp@y}% + \setlength{\@ff@tmp@x}% + {\csname @df@\romannumeral#1@evenx\endcsname}% + \expandafter\setlength + \csname @df@\romannumeral#1@evenx\endcsname + {\csname @df@\romannumeral#1@posx\endcsname}% + \expandafter\setlength + \csname @df@\romannumeral#1@posx\endcsname{\@ff@tmp@x}% + \setlength{\@ff@tmp@y}% + {\csname @df@\romannumeral#1@eveny\endcsname}% + \expandafter\setlength + \csname @df@\romannumeral#1@eveny\endcsname + {\csname @df@\romannumeral#1@posy\endcsname}% + \expandafter\setlength\csname @df@\romannumeral#1@posy\endcsname + {\@ff@tmp@y}% } \newcommand*{\dfswapoddeven}{% \@ifstar\@sdynamicframeswapcoords\@dynamicframeswapcoords} \newcommand*{\@sdynamicframeswapcoords}[1]{% -\@for\@ff@id:=#1\do{% -\@dynamicframeid{\@ff@id}% -\@@dynamicframeswapcoords{\ff@id}}} + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@@dynamicframeswapcoords{\ff@id}}% +} \newcommand*{\@dynamicframeswapcoords}[1]{% -\ifthenelse{\equal{#1}{all}}{% -\ff@id=0\relax -\whiledo{\ff@id<\c@maxflow}{\advance\ff@id by 1\relax -\@@dynamicframeswapcoords{\ff@id}}% -}{% -\ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}{% -\ifthenelse{\equal{#1}{odd}}{\@colN=1}{\@colN=2}% -\whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}{% -\@@dynamicframeswapcoords{\@colN}% -\advance\@colN by 2\relax}% -}{% -\@for\@ff@id:=#1\do{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{\@ff@id}% -\ifnum\@ff@numstart=0\relax - \def\@ff@numstart{1}% -\fi -\ifnum\@ff@numend>\c@maxflow - \def\@ff@numend{\c@maxflow}% -\fi -\@colN=\@ff@numstart -\whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}{% -\@@dynamicframeswapcoords{\@colN}% -\advance\@colN by 1\relax -}}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \ff@id=0\relax + \whiledo{\ff@id<\c@maxflow}% + {% + \advance\ff@id by 1\relax + \@@dynamicframeswapcoords{\ff@id}% + }% + }% + {% + \ifthenelse{\equal{#1}{odd} \TE@or \equal{#1}{even}}% + {% + \ifthenelse{\equal{#1}{odd}}% + {\@colN=1}% + {\@colN=2}% + \whiledo{\@colN<\c@maxflow\TE@or\@colN=\c@maxflow}% + {% + \@@dynamicframeswapcoords{\@colN}% + \advance\@colN by 2\relax + }% + }% + {% + \@for\@ff@id:=#1\do{% + \def\@ff@numstart{0}% + \def\@ff@numend{10000}% + \@ff@getrange{\@ff@id}% + \ifnum\@ff@numstart=0\relax + \def\@ff@numstart{1}% + \fi + \ifnum\@ff@numend>\c@maxflow + \def\@ff@numend{\c@maxflow}% + \fi + \@colN=\@ff@numstart + \whiledo{\@colN<\@ff@numend \TE@or \@colN=\@ff@numend}% + {% + \@@dynamicframeswapcoords{\@colN}% + \advance\@colN by 1\relax + }% + }% + }% + }% +} \newenvironment{dynamiccontents}[1]{% -\def\@flf@{dynamiccontents}% -\xdynamiccontents{#1}}{% -\endxdynamiccontents + \def\@flf@{dynamiccontents}% + \xdynamiccontents{#1}}{% + \endxdynamiccontents } \newtoks\@dynamictok \def\xdynamiccontents#1{% -\def\@flf@idn{#1}% -\@dynamictok{}\@flf@get@body + \def\@flf@idn{#1}% + \@dynamictok{}\@flf@get@body } \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} + \@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 +} \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 + \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 } \long\def\@lempty{} \def\flf@getcontargs{% -\@ifnextchar[{\@flf@getcontargs}{\@flf@getcontargs[]}} + \@ifnextchar[{\@flf@getcontargs}{\@flf@getcontargs[]}% +} \long\def\@flf@getcontargs[#1]#2#3\continueonframe#4#5#6{% -\def#4{#1}\def#5{#2}\def#6{#3}% + \def#4{#1}\def#5{#2}\def#6{#3}% } \def\@flf@find@end#1{% -\def\@tempa{#1}% -\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 - \ifx\@tempa\@flf@ - \let\flf@next=\@flf@endxdynamiccontents - \else + \def\@tempa{#1}% + \global\let\flf@next=\relax + \ifdfcontinued \@dynamictok\expandafter - {\the\@dynamictok\end{#1}}% - \let\flf@next=\@flf@get@body + {\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 + \ifx\@tempa\@flf@ + \let\flf@next=\@flf@endxdynamiccontents + \else + \@dynamictok\expandafter + {\the\@dynamictok\end{#1}}% + \let\flf@next=\@flf@get@body + \fi \fi -\fi -\flf@next + \flf@next } \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}% -\else - \expandafter - \xdef\csname @dynamicframe@\romannumeral\@flf@idn\endcsname{% - \the\@dynamictok}% - \expandafter -\fi -\expandafter\end\expandafter{\@flf@}% + \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% + }% + \else + \expandafter + \xdef\csname @dynamicframe@\romannumeral\@flf@idn\endcsname{% + \the\@dynamictok}% + \expandafter + \fi + \expandafter\end\expandafter{\@flf@}% } \newenvironment{dynamiccontents*}[1]{% -\def\@flf@{dynamiccontents*}% -\@dynamicframeid{#1}% -\xdynamiccontents{\ff@id}}{% -\enddynamiccontents + \def\@flf@{dynamiccontents*}% + \@dynamicframeid{#1}% + \xdynamiccontents{\ff@id}}{% + \enddynamiccontents } \newcommand{\setdynamiccontents}{% -\@ifstar\@ssetdynamiccontents\@setdynamiccontents} + \@ifstar\@ssetdynamiccontents\@setdynamiccontents +} \newcommand{\@ssetdynamiccontents}[2]{% -\@dynamicframeid{#1}\@setdynamiccontents{\ff@id}{#2}} + \@dynamicframeid{#1}\@setdynamiccontents{\ff@id}{#2}% +} \newcommand{\@setdynamiccontents}[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}% -\else -\expandafter -\gdef\csname @dynamicframe@\romannumeral#1\endcsname{#2}% -\fi} + \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% + }% + \else + \expandafter + \gdef\csname @dynamicframe@\romannumeral#1\endcsname{#2}% + \fi +} \newcommand{\appenddynamiccontents}{% -\@ifstar\@sappenddynamic\@appenddynamic} + \@ifstar\@sappenddynamic\@appenddynamic +} \newcommand{\@sappenddynamic}[2]{% -\@dynamicframeid{#1}\@appenddynamic{\ff@id}{#2}} + \@dynamicframeid{#1}\@appenddynamic{\ff@id}{#2}% +} \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}% -\else - \expandafter\@ff@addtolist - \csname @dynamicframe@\romannumeral#1\endcsname\entry{#2}% -\fi} + \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% + }% + \else + \expandafter\@ff@addtolist + \csname @dynamicframe@\romannumeral#1\endcsname\entry{#2}% + \fi +} \newtoks\flf@ta \newtoks\flf@tb -\long\def\@ff@addtolist#1\entry#2{\flf@ta={{#2}}% -\flf@tb=\expandafter{#1}% -\xdef#1{\the\flf@tb\the\flf@ta}} -\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)}} +\long\def\@ff@addtolist#1\entry#2{% + \flf@ta={{#2}}% + \flf@tb=\expandafter{#1}% + \xdef#1{\the\flf@tb\the\flf@ta}% +} +\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 (or their starred versions)% + }% +} \newcommand*{\@staticscontinueonframe}[2][]{% -\ffcontinuedtextlayout{#1}% -\end{staticcontents*}% -\begin{staticcontents*}{#2}\par\noindent\ignorespaces} + \ffcontinuedtextlayout{#1}% + \end{staticcontents*}% + \begin{staticcontents*}{#2}\par\noindent\ignorespaces +} \newcommand*{\@staticcontinueonframe}[2][]{% -\ffcontinuedtextlayout{#1}% -\end{staticcontents}% -\begin{staticcontents}{#2}\par\noindent\ignorespaces} + \ffcontinuedtextlayout{#1}% + \end{staticcontents}% + \begin{staticcontents}{#2}\par\noindent\ignorespaces +} \newcommand{\ffcontinuedtextlayout}[1]{% -\parfillskip=0pt\par\hfill\ffcontinuedtextfont{#1}} + \parfillskip=0pt\par\hfill + \ffcontinuedtextfont{#1}% +} \newcommand*{\ffcontinuedtextfont}[1]{\emph{\small #1}} \newcommand*{\computeleftedgeodd}[1]{% -\setlength{#1}{-1in}% -\addtolength{#1}{-\hoffset}% -\addtolength{#1}{-\oddsidemargin}} + \setlength{#1}{-1in}% + \addtolength{#1}{-\hoffset}% + \addtolength{#1}{-\oddsidemargin}% +} \newcommand*{\computeleftedgeeven}[1]{% -\setlength{#1}{-1in}% -\addtolength{#1}{-\hoffset}% -\addtolength{#1}{-\evensidemargin}} + \setlength{#1}{-1in}% + \addtolength{#1}{-\hoffset}% + \addtolength{#1}{-\evensidemargin}% +} \newcommand*{\computetopedge}[1]{% -\setlength{#1}{\textheight}% -\addtolength{#1}{\headheight}% -\addtolength{#1}{\headsep}% -\addtolength{#1}{1in}% -\addtolength{#1}{\voffset}% -\addtolength{#1}{\topmargin}} + \setlength{#1}{\textheight}% + \addtolength{#1}{\headheight}% + \addtolength{#1}{\headsep}% + \addtolength{#1}{1in}% + \addtolength{#1}{\voffset}% + \addtolength{#1}{\topmargin}% +} \newcommand*{\computebottomedge}[1]{% -\computetopedge{#1}% -\addtolength{#1}{-\paperheight}} + \computetopedge{#1}% + \addtolength{#1}{-\paperheight}% +} \newcommand*{\computerightedgeodd}[1]{% -\computeleftedgeodd{#1}% -\addtolength{#1}{\paperwidth}} + \computeleftedgeodd{#1}% + \addtolength{#1}{\paperwidth}% +} \newcommand*{\computerightedgeeven}[1]{% -\computeleftedgeeven{#1}% -\addtolength{#1}{\paperwidth}} + \computeleftedgeeven{#1}% + \addtolength{#1}{\paperwidth}% +} \newlength\ffareawidth \newlength\ffareaheight \newlength\ffareax @@ -1390,1632 +2270,3618 @@ be used inside `staticcontents' or `dynamiccontents' environments \newlength\ffareaevenx \newlength\ffareaeveny \newcommand*{\computeflowframearea}{% -\@ifstar\@scomputeffarea\@computeffarea} + \@ifstar\@scomputeffarea\@computeffarea +} \newcommand*{\@scomputeffarea}[1]{% -\setlength{\ffareax}{\paperwidth}% -\setlength{\ffareay}{\paperheight}% -\setlength{\@ff@tmp@x}{0pt}% -\setlength{\@ff@tmp@y}{0pt}% -\@for\@ff@id:=#1\do{\@flowframeid{\@ff@id}% -\ifnum\ffareax>\flowframex{\ff@id}% -\setlength{\ffareax}{\flowframex{\ff@id}}% -\fi -\ifnum\ffareay>\flowframey{\ff@id}% -\setlength{\ffareay}{\flowframey{\ff@id}}% -\fi -\setlength{\@ff@offset}{\flowframex{\ff@id}}% -\addtolength{@ff@offset}{\flowframewidth{\ff@id}}% -\ifnum\@ff@tmp@x<\@ff@offset -\setlength{\@ff@tmp@x}{\@ff@offset}% -\fi -\setlength{\@ff@offset}{\flowframey{\ff@id}}% -\addtolength{@ff@offset}{\flowframeheight{\ff@id}}% -\ifnum\@ff@tmp@y<\@ff@offset -\setlength{\@ff@tmp@y}{\@ff@offset}% -\fi -}% -\setlength{\ffareawidth}{\@ff@tmp@x}% -\addtolength{\ffareawidth}{-\ffareax}% -\setlength{\ffareaheight}{\@ff@tmp@y}% -\addtolength{\ffareaheight}{-\ffareay}} + \setlength{\ffareax}{\paperwidth}% + \setlength{\ffareay}{\paperheight}% + \setlength{\@ff@tmp@x}{0pt}% + \setlength{\@ff@tmp@y}{0pt}% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \ifnum\ffareax>\flowframex{\ff@id}% + \setlength{\ffareax}{\flowframex{\ff@id}}% + \fi + \ifnum\ffareay>\flowframey{\ff@id}% + \setlength{\ffareay}{\flowframey{\ff@id}}% + \fi + \setlength{\@ff@offset}{\flowframex{\ff@id}}% + \addtolength{@ff@offset}{\flowframewidth{\ff@id}}% + \ifnum\@ff@tmp@x<\@ff@offset + \setlength{\@ff@tmp@x}{\@ff@offset}% + \fi + \setlength{\@ff@offset}{\flowframey{\ff@id}}% + \addtolength{@ff@offset}{\flowframeheight{\ff@id}}% + \ifnum\@ff@tmp@y<\@ff@offset + \setlength{\@ff@tmp@y}{\@ff@offset}% + \fi + }% + \setlength{\ffareawidth}{\@ff@tmp@x}% + \addtolength{\ffareawidth}{-\ffareax}% + \setlength{\ffareaheight}{\@ff@tmp@y}% + \addtolength{\ffareaheight}{-\ffareay}% +} \newcommand*{\@computeffarea}[1]{% -\setlength{\ffareax}{\paperwidth}% -\setlength{\ffareay}{\paperheight}% -\setlength{\@ff@tmp@x}{0pt}% -\setlength{\@ff@tmp@y}{0pt}% -\@for\@ff@id:=#1\do{% -\ff@id=\@ff@id\relax -\setlength{\@ff@offset}{\flowframex{\ff@id}}% -\ifdim\ffareax>\@ff@offset -\setlength{\ffareax}{\@ff@offset}% -\fi -\setlength{\@ff@offset}{\flowframey{\ff@id}}% -\ifdim\ffareay>\@ff@offset -\setlength{\ffareay}{\@ff@offset}% -\fi -\setlength{\@ff@offset}{\flowframex{\ff@id}}% -\addtolength{\@ff@offset}{\flowframewidth{\ff@id}}% -\ifdim\@ff@tmp@x<\@ff@offset -\setlength{\@ff@tmp@x}{\@ff@offset}% -\fi -\setlength{\@ff@offset}{\flowframey{\ff@id}}% -\addtolength{\@ff@offset}{\flowframeheight{\ff@id}}% -\ifdim\@ff@tmp@y<\@ff@offset -\setlength{\@ff@tmp@y}{\@ff@offset}% -\fi -}% -\setlength{\ffareawidth}{\@ff@tmp@x}% -\addtolength{\ffareawidth}{-\ffareax}% -\setlength{\ffareaheight}{\@ff@tmp@y}% -\addtolength{\ffareaheight}{-\ffareay}} + \setlength{\ffareax}{\paperwidth}% + \setlength{\ffareay}{\paperheight}% + \setlength{\@ff@tmp@x}{0pt}% + \setlength{\@ff@tmp@y}{0pt}% + \@for\@ff@id:=#1\do{% + \ff@id=\@ff@id\relax + \setlength{\@ff@offset}{\flowframex{\ff@id}}% + \ifdim\ffareax>\@ff@offset + \setlength{\ffareax}{\@ff@offset}% + \fi + \setlength{\@ff@offset}{\flowframey{\ff@id}}% + \ifdim\ffareay>\@ff@offset + \setlength{\ffareay}{\@ff@offset}% + \fi + \setlength{\@ff@offset}{\flowframex{\ff@id}}% + \addtolength{\@ff@offset}{\flowframewidth{\ff@id}}% + \ifdim\@ff@tmp@x<\@ff@offset + \setlength{\@ff@tmp@x}{\@ff@offset}% + \fi + \setlength{\@ff@offset}{\flowframey{\ff@id}}% + \addtolength{\@ff@offset}{\flowframeheight{\ff@id}}% + \ifdim\@ff@tmp@y<\@ff@offset + \setlength{\@ff@tmp@y}{\@ff@offset}% + \fi + }% + \setlength{\ffareawidth}{\@ff@tmp@x}% + \addtolength{\ffareawidth}{-\ffareax}% + \setlength{\ffareaheight}{\@ff@tmp@y}% + \addtolength{\ffareaheight}{-\ffareay}% +} \newcommand*{\@ff@swaplen}[2]{% -\setlength{\@ff@tmp@x}{#1}% -\setlength{#1}{#2}% -\setlength{#2}{\@ff@tmp@x}} + \setlength{\@ff@tmp@x}{#1}% + \setlength{#1}{#2}% + \setlength{#2}{\@ff@tmp@x}% +} \newcommand*{\@ff@getdim}[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\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{\ffareaevenx}{\flowframeevenx{#2}}% - \setlength{\ffareaeveny}{\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}{\staticframex{#2}}% - \setlength{\ffareay}{\staticframey{#2}}% - \setlength{\ffareaevenx}{\staticframeevenx{#2}}% - \setlength{\ffareaeveny}{\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}% + \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\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{\ffareaevenx}{\flowframeevenx{#2}}% + \setlength{\ffareaeveny}{\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}{\staticframex{#2}}% + \setlength{\ffareay}{\staticframey{#2}}% + \setlength{\ffareaevenx}{\staticframeevenx{#2}}% + \setlength{\ffareaeveny}{\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}{\dynamicframex{#2}}% + \setlength{\ffareay}{\dynamicframey{#2}}% + \setlength{\ffareaevenx}{\dynamicframeevenx{#2}}% + \setlength{\ffareaeveny}{\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 - \setlength{\ffareax}{\dynamicframex{#2}}% - \setlength{\ffareay}{\dynamicframey{#2}}% - \setlength{\ffareaevenx}{\dynamicframeevenx{#2}}% - \setlength{\ffareaeveny}{\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)}% -\fi + \PackageError{flowfram}% + {Unknown frame ID type '#1'}% + {% + Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)% + }% + \fi } \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}% + \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 - \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}% + \PackageError{flowfram}% + {Unknown frame ID type '#1'}% + {% + Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)% + }% \fi -\else - \PackageError{flowfram}{Unknown frame ID type '#1'}{% - Frame ID types are: 1 (flow), 2 (static) and 3 (dynamic)} -\fi } \newcommand*{\getstaticbounds}{% -\@ifstar\@sgetstaticbounds\@getstaticbounds} + \@ifstar\@sgetstaticbounds\@getstaticbounds +} \newcommand*{\@sgetstaticbounds}[1]{% -\@staticframeid{#1}\@getstaticbounds{\ff@id}} + \@staticframeid{#1}\@getstaticbounds{\ff@id}% +} \newcommand*{\@getstaticbounds}[1]{\@ff@getdim{2}{#1}} \newcommand*{\getstaticevenbounds}{% -\@ifstar\@sgetstaticevenbounds\@getstaticevenbounds} + \@ifstar\@sgetstaticevenbounds\@getstaticevenbounds +} \newcommand*{\@sgetstaticevenbounds}[1]{% -\@staticframeid{#1}\@getstaticevenbounds{\ff@id}} + \@staticframeid{#1}\@getstaticevenbounds{\ff@id}% +} \newcommand*{\@getstaticevenbounds}[1]{\@ff@getevendim{2}{#1}} \newcommand*{\getflowbounds}{% -\@ifstar\@sgetflowbounds\@getflowbounds} + \@ifstar\@sgetflowbounds\@getflowbounds +} \newcommand*{\@sgetflowbounds}[1]{% -\@flowframeid{#1}\@getflowbounds{\ff@id}} + \@flowframeid{#1}\@getflowbounds{\ff@id}% +} \newcommand*{\@getflowbounds}[1]{\@ff@getdim{1}{#1}} \newcommand*{\getflowevenbounds}{% -\@ifstar\@sgetflowevenbounds\@getflowevenbounds} + \@ifstar\@sgetflowevenbounds\@getflowevenbounds +} \newcommand*{\@sgetflowevenbounds}[1]{% -\@flowframeid{#1}\@getflowevenbounds{\ff@id}} + \@flowframeid{#1}\@getflowevenbounds{\ff@id}% +} \newcommand*{\@getflowevenbounds}[1]{\@ff@getevendim{1}{#1}} \newcommand*{\getdynamicbounds}{% -\@ifstar\@sgetdynamicbounds\@getdynamicbounds} + \@ifstar\@sgetdynamicbounds\@getdynamicbounds +} \newcommand*{\@sgetdynamicbounds}[1]{% -\@dynamicframeid{#1}\@getdynamicbounds{\ff@id}} + \@dynamicframeid{#1}\@getdynamicbounds{\ff@id}% +} \newcommand*{\@getdynamicbounds}[1]{\@ff@getdim{3}{#1}} \newcommand*{\getdynamicevenbounds}{% -\@ifstar\@sgetdynamicevenbounds\@getdynamicevenbounds} + \@ifstar\@sgetdynamicevenbounds\@getdynamicevenbounds +} \newcommand*{\@sgetdynamicevenbounds}[1]{% -\@dynamicframeid{#1}\@getdynamicevenbounds{\ff@id}} + \@dynamicframeid{#1}\@getdynamicevenbounds{\ff@id}% +} \newcommand*{\@getdynamicevenbounds}[1]{\@ff@getevendim{3}{#1}} \newif\ifFLFabove \newif\ifFLFbelow \newif\ifFLFleft \newif\ifFLFright \newcommand*{\checkifframeabove}{% -\@ifstar\@scheckifframeabove\@checkifframeabove} + \@ifstar\@scheckifframeabove\@checkifframeabove +} \newcommand*{\@scheckifframeabove}[4]{% -\ifodd\c@page - \@soddcheckifframeabove{#1}{#2}{#3}{#4}% -\else - \@sevencheckifframeabove{#1}{#2}{#3}{#4}% -\fi} + \ifodd\c@page + \@soddcheckifframeabove{#1}{#2}{#3}{#4}% + \else + \@sevencheckifframeabove{#1}{#2}{#3}{#4}% + \fi +} \newcommand*{\@checkifframeabove}[4]{% -\ifodd\c@page - \@oddcheckifframeabove{#1}{#2}{#3}{#4}% -\else - \@evencheckifframeabove{#1}{#2}{#3}{#4}% -\fi} + \ifodd\c@page + \@oddcheckifframeabove{#1}{#2}{#3}{#4}% + \else + \@evencheckifframeabove{#1}{#2}{#3}{#4}% + \fi +} \newcommand*{\oddcheckifframeabove}{% -\@ifstar\@soddcheckifframeabove\@oddcheckifframeabove} + \@ifstar\@soddcheckifframeabove\@oddcheckifframeabove +} \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 + \@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 } \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 + \@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 } \newcommand*{\checkifframebelow}{% -\@ifstar\@scheckifframebelow\@checkifframebelow} + \@ifstar\@scheckifframebelow\@checkifframebelow +} \newcommand*{\@scheckifframebelow}[4]{% -\ifodd\c@page - \@soddcheckifframebelow{#1}{#2}{#3}{#4}% -\else - \@sevencheckifframebelow{#1}{#2}{#3}{#4}% -\fi} + \ifodd\c@page + \@soddcheckifframebelow{#1}{#2}{#3}{#4}% + \else + \@sevencheckifframebelow{#1}{#2}{#3}{#4}% + \fi +} \newcommand*{\@checkifframebelow}[4]{% -\ifodd\c@page - \@oddcheckifframebelow{#1}{#2}{#3}{#4}% -\else - \@evencheckifframebelow{#1}{#2}{#3}{#4}% -\fi} + \ifodd\c@page + \@oddcheckifframebelow{#1}{#2}{#3}{#4}% + \else + \@evencheckifframebelow{#1}{#2}{#3}{#4}% + \fi +} \newcommand*{\oddcheckifframebelow}{% -\@ifstar\@soddcheckifframebelow\@oddcheckifframebelow} + \@ifstar\@soddcheckifframebelow\@oddcheckifframebelow +} \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 + \@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 } \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 + \@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 } \newcommand*{\checkifframeleft}{% -\@ifstar\@scheckifframeleft\@checkifframeleft} + \@ifstar\@scheckifframeleft\@checkifframeleft +} \newcommand*{\@scheckifframeleft}[4]{% -\ifodd\c@page - \@soddcheckifframeleft{#1}{#2}{#3}{#4}% -\else - \@sevencheckifframeleft{#1}{#2}{#3}{#4}% -\fi} + \ifodd\c@page + \@soddcheckifframeleft{#1}{#2}{#3}{#4}% + \else + \@sevencheckifframeleft{#1}{#2}{#3}{#4}% + \fi +} \newcommand*{\@checkifframeleft}[4]{% -\ifodd\c@page - \@oddcheckifframeleft{#1}{#2}{#3}{#4}% -\else - \@evencheckifframeleft{#1}{#2}{#3}{#4}% -\fi} + \ifodd\c@page + \@oddcheckifframeleft{#1}{#2}{#3}{#4}% + \else + \@evencheckifframeleft{#1}{#2}{#3}{#4}% + \fi +} \newcommand*{\oddcheckifframeleft}{% -\@ifstar\@soddcheckifframeleft\@oddcheckifframeleft} + \@ifstar\@soddcheckifframeleft\@oddcheckifframeleft +} \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 + \@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 } \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 + \@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 } \newcommand*{\checkifframeright}{% -\@ifstar\@scheckifframeright\@checkifframeright} + \@ifstar\@scheckifframeright\@checkifframeright +} \newcommand*{\@scheckifframeright}[4]{% -\ifodd\c@page - \@soddcheckifframeright{#1}{#2}{#3}{#4}% -\else - \@sevencheckifframeright{#1}{#2}{#3}{#4}% -\fi} + \ifodd\c@page + \@soddcheckifframeright{#1}{#2}{#3}{#4}% + \else + \@sevencheckifframeright{#1}{#2}{#3}{#4}% + \fi +} \newcommand*{\@checkifframeright}[4]{% -\ifodd\c@page - \@oddcheckifframeright{#1}{#2}{#3}{#4}% -\else - \@evencheckifframeright{#1}{#2}{#3}{#4}% -\fi} + \ifodd\c@page + \@oddcheckifframeright{#1}{#2}{#3}{#4}% + \else + \@evencheckifframeright{#1}{#2}{#3}{#4}% + \fi +} \newcommand*{\oddcheckifframeright}{% -\@ifstar\@soddcheckifframeright\@oddcheckifframeright} + \@ifstar\@soddcheckifframeright\@oddcheckifframeright +} \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 + \@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 } \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 + \@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 } \newcommand*{\evencheckifframeabove}{% -\@ifstar\@sevencheckifframeabove\@evencheckifframeabove} + \@ifstar\@sevencheckifframeabove\@evencheckifframeabove +} \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 + \@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 } \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 + \@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 } \newcommand*{\evencheckifframebelow}{% -\@ifstar\@sevencheckifframebelow\@evencheckifframebelow} + \@ifstar\@sevencheckifframebelow\@evencheckifframebelow +} \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 + \@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 +} +\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 +} +\newcommand*{\evencheckifframeleft}{% + \@ifstar\@sevencheckifframeleft\@evencheckifframeleft +} +\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 +} +\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 +} +\newcommand*{\evencheckifframeright}{% + \@ifstar\@sevencheckifframeright\@evencheckifframeright +} +\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 +} +\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 +} +\newcommand*{\FFaboveleft}{above left} +\newcommand*{\FFaboveright}{above right} +\newcommand*{\FFbelowleft}{below left} +\newcommand*{\FFbelowright}{below right} +\newcommand*{\FFleft}{on the left} +\newcommand*{\FFright}{on the right} +\newcommand*{\FFabove}{above} +\newcommand*{\FFbelow}{below} +\newcommand*{\FFoverlap}{overlap} +\DeclareRobustCommand*{\relativeframelocation}{% + \@ifstar\@srelativeframelocation\@relativeframelocation +} +\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 +} +\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 +} +\DeclareRobustCommand*{\reldynamicloc}{% + \@ifstar\@sreldynamicloc\@reldynamicloc +} +\newcommand*{\@sreldynamicloc}[2]{% + \@srelativeframelocation{dynamic}{#1}{dynamic}{#2}% +} +\newcommand*{\@reldynamicloc}[2]{% + \@relativeframelocation{dynamic}{#1}{dynamic}{#2}% +} +\DeclareRobustCommand*{\relstaticloc}{% + \@ifstar\@srelstaticloc\@relstaticloc +} +\newcommand*{\@srelstaticloc}[2]{% + \@srelativeframelocation{static}{#1}{static}{#2}% +} +\newcommand*{\@relstaticloc}[2]{% + \@relativeframelocation{static}{#1}{static}{#2}% +} +\DeclareRobustCommand*{\relflowloc}{% + \@ifstar\@srelflowloc\@relflowloc +} +\newcommand*{\@srelflowloc}[2]{% + \@srelativeframelocation{flow}{#1}{flow}{#2}% +} +\newcommand*{\@relflowloc}[2]{% + \@relativeframelocation{flow}{#1}{flow}{#2}% +} +\newcommand*{\setinitialframe}[1]{% + \c@thisframe=#1% + \global\usedframebreaktrue + \global\setlength{\hsize} + {% + \csname colwidth\romannumeral\c@thisframe\endcsname + }% +} +\newif\if@setfr@mes +\@setfr@mesfalse +\newcommand*{\setframes}{% + \ifnum\c@thisframe=0\relax + \PackageWarning{flowfram}% + {Can't find a flow frame on page 1. + \MessageBreak + Attempting to find the first page with a flow frame% + }% + \@nxtcol=1\relax + \c@curpg=1\relax + \@g@tnextcol{\@nxtcol}% + \advance\c@curpg by -1\relax + \whiledo{\c@curpg>0}% + {% + \advance\c@curpg by -1\relax + \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% + \@outputpage + }% + \c@thisframe=\@nxtcol + \fi + \@setcol{\c@thisframe}\relax + \@setfr@mestrue + \edef\ff@txtcol{% + \csname @ff@txtcol@\romannumeral\c@thisframe\endcsname}% + \@s@tfftextcol +} +\newcommand{\emulatetwocolumn}[1][]{% + \finishthispage + \setallflowframes{pages=none}% + \settoheight{\@ff@staticH}{#1}% + \settodepth{\@ff@tmp@y}{#1}% + \addtolength{\@ff@staticH}{\@ff@tmp@y}% + \ifdim\@ff@staticH>0pt\relax + \twocolumnStop[\@ff@pages@countreg]{\@ff@staticH}% + \c@thisframe=\c@maxflow + \advance\c@thisframe by -1\relax + \@twocolumn[>\@ff@pages@countreg]% + \setstaticcontents{\c@maxstatic}{#1}% + \else + \@twocolumn + \c@thisframe=\c@maxflow + \advance\c@thisframe by -1\relax + \fi + \@setcol{\c@thisframe}% + \relax +} +\newcommand{\emulateonecolumn}[1][]{% + \finishthispage + \setallflowframes{pages=none}% + \settoheight{\@ff@staticH}{#1}% + \settodepth{\@ff@tmp@y}{#1}% + \addtolength{\@ff@staticH}{\@ff@tmp@y}% + \ifdim\@ff@staticH>0pt\relax + \onecolumnStop[\@ff@pages@countreg]{\@ff@staticH}% + \c@thisframe=\c@maxflow + \advance\c@thisframe by -1\relax + \@onecolumn[>\@ff@pages@countreg]% + \setstaticcontents{\c@maxstatic}{#1}% + \else + \@twocolumn + \c@thisframe=\c@maxflow + \advance\c@thisframe by -1\relax + \fi + \@setcol{\c@thisframe}% + \relax +} +\AtBeginDocument{% + \c@absolutepage=1\relax + \ifnum\c@maxflow=0\relax + \PackageWarning{flowfram}{No flow frames, adding one}% + \@onecolumn + \fi + \setframes + \renewcommand{\onecolumn}[1][]{% + \PackageWarning{flowfram}% + {% + Ignoring \string\onecolumn\space found in document environment. + Frames must be defined in the preamble% + }% + #1% + }% + \renewcommand{\twocolumn}[1][]{% + \PackageWarning{flowfram}% + {% + Ignoring \string\twocolumn\space found in document environment. + Frames must be defined in the preamble}% + #1% + }% +} +\newlength\fftolerance +\setlength\fftolerance{2pt} +\newcommand{\@setcol}[1]{% + \ifnum\c@maxflow<#1\relax + \PackageError{flowfram}% + {Can't set frame '\number#1', doesn't exist}{}% + \else + \flf@message{Switching to flow frame \number#1\space on page + \number\@ff@pages@countreg}% + \expandafter\global\expandafter\columnwidth + \csname colwidth\romannumeral#1\endcsname + \dimen@\columnwidth + \advance\dimen@ by -\hsize\relax + \ifdim\dimen@<0pt\relax + \dimen@=-\dimen@ + \fi + \ifdim\dimen@>\fftolerance + \ifusedframebreak + \else + \PackageWarning{flowfram}% + {Moving to flow frame of unequal + width,\MessageBreak use of \string\framebreak\space advised, + or text might not appear correctly (difference = + \the\dimen@, tolerance = \the\fftolerance)}% + \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}% +} +\output={% + \let\par\@@par + \ifnum\outputpenalty <-\@M + \@specialoutput + \else + \@makecol + \@opcol \@startcolumn + \@whilesw \if@fcolmade \fi {\@opcol \@startcolumn }% + \fi + \ifnum\outputpenalty>-\@Miv + \ifdim\@colroom<1.5\baselineskip + \ifdim\@colroom<\vsize + \@latex@warning@no@line{Text page \thepage \space + contains only floats}% + \@emptycol + \else + \global\vsize\@colroom + \fi + \else + \global\vsize\@colroom + \fi + \else + \global\vsize\maxdimen + \fi +} +\def\@doclearpage{% + \ifvoid\footins + \setbox\@tempboxa\vsplit\@cclv to\z@ + \unvbox\@tempboxa + \setbox\@tempboxa\box\@cclv + \xdef\@deferlist{\@toplist\@botlist\@deferlist}% + \global\let\@toplist\@empty + \global\let\@botlist\@empty + \global\@colroom\@colht + \ifx\@currlist\@empty + \else + \@latexerr{Float(s) lost}\@ehb + \global\let\@currlist\@empty + \fi + \@makefcolumn\@deferlist + \@whilesw \if@fcolmade \fi + {% + \@opcol + \@makefcolumn\@deferlist + }% + \if@firstcolumn + \xdef\@dbldeferlist{\@dbltoplist\@dbldeferlist}% + \global\let\@dbltoplist\@empty + \global\@colht\vsize + \begingroup + \@dblfloatplacement + \@makefcolumn\@dbldeferlist + \@whilesw \if@fcolmade \fi + {% + \@outputpage + \@makefcolumn\@dbldeferlist + }% + \endgroup + \else + \vbox{}% + \clearpage + \fi + \else + \setbox\@cclv\vbox{\box\@cclv\vfil}% + \@makecol\@opcol + \clearpage + \fi +} +\newcommand{\@dothehead}{% + \vbox to \headheight + {% + \color@hbox\normalcolor\hbox to \textwidth{\@thehead}% + \color@endbox + }% +} +\newcommand{\@dothefoot}{% + \color@hbox\normalcolor\hbox to \textwidth{\@thefoot}% + \color@endbox +} +\newcommand{\@dodynamicthehead}{} +\newcommand{\@dodynamicthefoot}{} +\def\@outputpage{% + \begingroup + \let\protect\noexpand + \@resetactivechars + \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@ + \vskip\topmargin\moveright\@themargin + \vbox + {% + \vskip\headheight + \vskip\headsep + \box\@outputbox + }% + }% + \global\let\if@newlist\@@if@newlist + \stepcounter{page}% + \stepcounter{absolutepage}% + \setcounter{displayedframe}{0}% + \let\firstmark\botmark +} +\newcommand*{\makedfheaderfooter}{% + \setlength{\@ff@tmp@y}{\textheight}% + \addtolength{\@ff@tmp@y}{\headsep}% + \newdynamicframe{\textwidth}{\headheight}{0pt}{\@ff@tmp@y}[header]% + \newdynamicframe{\textwidth}{\headheight}{0pt}{-\footskip}[footer]% + \renewcommand{\@dothehead}{}% + \renewcommand{\@dothefoot}{}% + \renewcommand{\@dodynamicthehead}{% + \@dynamicframeid{header}% + \expandafter + \def\csname @dynamicframe@\romannumeral\ff@id\endcsname{% + \vfill\@thehead\vfill + }% + }% + \renewcommand{\@dodynamicthefoot}{% + \@dynamicframeid{footer}% + \expandafter + \def\csname @dynamicframe@\romannumeral\ff@id\endcsname{% + \vfill\@thefoot\vfill + }% + }% +} +\@onlypreamble{\makedfheaderfooter} +\newcommand{\footnotecolor}{% + \@ifundefined{@ff@txtcol@\romannumeral\c@thisframe}% + {% + \normalcolor + }% + {% + \edef\ff@txtcol{% + \csname @ff@txtcol@\romannumeral\c@thisframe\endcsname + }% + \@s@tfftextcol + }% +} +\renewcommand{\@makecol}{% + \ifvoid\footins + \setbox\@outputbox\box\@cclv + \else + \setbox\@outputbox\vbox + {% + \boxmaxdepth\@maxdepth\@tempdima\dp\@cclv + \unvbox\@cclv + \vskip\skip\footins + \color@begingroup + \footnotecolor + \footnoterule + \unvbox\footins + \color@endgroup + }% + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox\vbox to\@colht{% + \@texttop\dimen@\dp\@outputbox + \unvbox \@outputbox + \vskip -\dimen@\@textbottom + }% + \fi + \global\maxdepth\@maxdepth +} +\def\@opcol{% + \@outputdblcol + \global\@mparbottom\z@ + \global\@textfloatsheight\z@ + \@floatplacement +} +\newif\if@ff@moreframes +\newcommand*{\@ff@checkifmoreframes}{% + \@ff@moreframesfalse + \@colN=\c@thisframe + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \edef\ff@xpages{\csname @ff@xpages@\romannumeral\@colN\endcsname}% + \@for\@ff@pp:=\ff@xpages\do + {% + \ifnum0\@ff@pp=\@ff@pages@countreg\relax + \@endfortrue + \fi + }% + \if@endfor + \else + \edef\ff@pages{\csname @ff@pages@\romannumeral\@colN\endcsname}% + \@ff@checkpages{\ff@pages}% + \if@ff@moreframes + \@colN=\c@maxflow\relax + \fi + \fi + }% + \if@ff@moreframes + \else + \@ff@tmpN=\@ff@pages@countreg + \count@=0\relax + \loop + \advance\@ff@tmpN by 1\relax + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \edef\ff@xpages{\csname @ff@xpages@\romannumeral\@colN\endcsname}% + \@for\@ff@pp:=\ff@xpages\do + {% + \ifnum0\@ff@pp=\@ff@tmpN\relax + \@endfortrue + \fi + }% + \if@endfor + \else + \edef\ff@pages{\csname @ff@pages@\romannumeral\@colN\endcsname}% + \@ff@checkpages[\@ff@tmpN]{\ff@pages}% + \if@ff@moreframes + \@colN=\c@maxflow\relax + \fi + \fi + }% + \if@ff@moreframes + \count@=4\relax + \else + \advance\count@ by 1\relax + \fi + \ifnum\count@<4 + \repeat + \fi +} +\newcommand*{\@ff@checkpages}[2][\@ff@pages@countreg]{% + \@for\@ff@pp:=#2\do{% + \@ff@checkthispage{#1}{\@ff@pp}% + }% +} +\newcommand*{\@ff@checkthispage}[2]{% + \ifthenelse{\equal{#2}{all}\or\equal{#2}{even}\or\equal{#2}{odd}}% + {% + \@ff@moreframestrue + }% + {% + \ifthenelse{\equal{#2}{none}}% + {}% + {% + \@ff@checknumrange{#1}{#2}% + }% + }% +} +\newcommand*{\@ff@checknumrange}[2]{% + \def\@ff@numstart{0}% + \def\@ff@numend{100000}% + \@ff@getrange{#2}% + \ifnum\@ff@numend>#1\relax + \@ff@moreframestrue + \else + \ifnum\@ff@numend=#1\relax + \@ff@moreframestrue + \fi + \fi +} +\newcount\c@ffrangenum +\newcommand*{\@ff@getrange}[1]{% + \expandafter\@ff@@getrange#1-\relax\end +} +\def\@ff@@getrange#1#2\end{% + \ifx#1<\relax + \@ff@getrangeless#1#2\end + \else + \ifx#1>\relax + \@ff@getrangegreater#1#2\end + \else + \@@ff@getrange#1#2\end + \fi + \fi +} +\def\@ff@getrangeless<#1-\relax\end{% + \c@ffrangenum=#1\relax + \advance\c@ffrangenum by -1\relax + \def\@ff@numstart{0}% + \edef\@ff@numend{\number\c@ffrangenum}% +} +\def\@ff@getrangegreater>#1-\relax\end{% + \c@ffrangenum=#1\relax + \advance\c@ffrangenum by 1\relax + \edef\@ff@numstart{\number\c@ffrangenum}% + \def\@ff@numend{100000}% +} +\def\@@ff@getrange#1-#2\end{% + \ifx\relax#2\relax + \def\@ff@numstart{#1}% + \def\@ff@numend{#1}% + \else + \def\@ff@numstart{#1}% + \@@@ff@getrange#2\end + \fi +} +\def\@@@ff@getrange#1-\relax\end{% + \def\@ff@numend{#1}% +} +\newcommand*{\@ff@output@adjustframes}{} +\newcommand*{\flowswitchonnext}{% + \@ifstar\@sflowswitchonnext\@flowswitchonnext +} +\newcommand{\@sflowswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} +\newcommand{\@flowswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} +\newcommand*{\flowswitchonnextodd}{% + \@ifstar\@sflowswitchonnextodd\@flowswitchonnextodd +} +\newcommand{\@sflowswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi + \@ff@chckifthispg{\count@}{\ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% +} +\newcommand{\@flowswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi + \@ff@chckifthispg{\count@}{\@ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% +} +\newcommand*{\flowswitchoffnext}{% + \@ifstar\@sflowswitchoffnext\@flowswitchoffnext +} +\newcommand{\@sflowswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% +} +\newcommand{\@flowswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} +\newcommand*{\flowswitchoffnextodd}{% + \@ifstar\@sflowswitchoffnextodd\@flowswitchoffnextodd +} +\newcommand{\@sflowswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \if@notthiscol + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{none}% + \else + \@ff@chckifthispg{\count@}{\ff@id}% + \if@notthiscol + \def\@ff@nextpages{none}% + \else + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \@ff@chckifthispg{\count@}{\ff@id}% + \if@notthiscol + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{\@ff@nextpages}% + }% + }% +} +\newcommand{\@flowswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \if@notthiscol + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{none}% + \else + \@ff@chckifthispg{\count@}{\@ff@id}% + \if@notthiscol + \def\@ff@nextpages{none}% + \else + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \@ff@chckifthispg{\count@}{\@ff@id}% + \if@notthiscol + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{\@ff@nextpages}% + }% + }% +} +\newcommand*{\flowswitchonnextonly}{% + \@ifstar\@sflowswitchonnextonly\@flowswitchonnextonly +} +\newcommand{\@sflowswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{\number\count@}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% +} +\newcommand{\@flowswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{\number\count@}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% +} +\newcommand*{\flowswitchonnextoddonly}{% + \@ifstar\@sflowswitchonnextoddonly\@flowswitchonnextoddonly +} +\newcommand{\@sflowswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \@ff@chckifthispg{\@ff@pages@countreg}{\ff@id}% + \if@notthiscol + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@ff@chckifthispg{\count@}{\ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@ff@chckifthispg{\count@}{\ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% +} +\newcommand{\@flowswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@ff@chckifthispg{\@ff@pages@countreg}{\@ff@id}% + \if@notthiscol + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@ff@chckifthispg{\count@}{\@ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@ff@chckifthispg{\count@}{\@ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} +\newcommand*{\flowswitchoffnextonly}{% + \@ifstar\@sflowswitchoffnextonly\@flowswitchoffnextonly +} +\newcommand{\@sflowswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowaddexclusion{\number\ff@id}{\number\count@}% + }% + }% +} +\newcommand{\@flowswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} +\newcommand*{\flowswitchoffnextoddonly}{% + \@ifstar\@sflowswitchoffnextoddonly\@flowswitchoffnextoddonly +} +\newcommand{\@sflowswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax + \else + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@flowframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowaddexclusion{\number\ff@id}{\number\count@}% + }% + }% +} +\newcommand{\@flowswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax + \else + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\flowaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} +\newcommand*{\dynamicswitchonnext}{% + \@ifstar\@sdynamicswitchonnext\@dynamicswitchonnext +} +\newcommand{\@sdynamicswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} +\newcommand{\@dynamicswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} +\newcommand*{\dynamicswitchonnextodd}{% + \@ifstar\@sdynamicswitchonnextodd\@dynamicswitchonnextodd +} +\newcommand{\@sdynamicswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi + \@df@chckifthispg[\count@]{\ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% +} +\newcommand{\@dynamicswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \def\@ff@prepages{}% + \if@notthiscol + \else + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi + \@df@chckifthispg[\count@]{\@ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol + \else + \edef\@ff@prepages{\@ff@prepages\number\count@,}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% +} +\newcommand*{\dynamicswitchoffnext}{% + \@ifstar\@sdynamicswitchoffnext\@dynamicswitchoffnext +} +\newcommand{\@sdynamicswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% +} +\newcommand{\@dynamicswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} +\newcommand*{\dynamicswitchoffnextodd}{% + \@ifstar\@sdynamicswitchoffnextodd\@dynamicswitchoffnextodd +} +\newcommand{\@sdynamicswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{none}% + \else + \@df@chckifthispg[\count@]{\ff@id}% + \if@notthiscol + \def\@ff@nextpages{none}% + \else + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \@df@chckifthispg[\count@]{\ff@id}% + \if@notthiscol + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{\@ff@nextpages}% + }% + }% +} +\newcommand{\@dynamicswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{none}% + \else + \@df@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol + \def\@ff@nextpages{none}% + \else + \def\@ff@nextpages{\number\count@}% + \fi + \fi + \else + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \@df@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{\@ff@nextpages}% + }% + }% +} +\newcommand*{\dynamicswitchonnextonly}{% + \@ifstar\@sdynamicswitchonnextonly\@dynamicswitchonnextonly +} +\newcommand{\@sdynamicswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{\number\count@}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% +} +\newcommand{\@dynamicswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{\number\count@}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% +} +\newcommand*{\dynamicswitchonnextoddonly}{% + \@ifstar\@sdynamicswitchonnextoddonly\@dynamicswitchonnextoddonly +} +\newcommand{\@sdynamicswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \@df@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@df@chckifthispg[\count@]{\ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@df@chckifthispg[\count@]{\ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% +} +\newcommand{\@dynamicswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@df@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@df@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi + \else + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@df@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% } -\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 +\newcommand*{\dynamicswitchoffnextonly}{% + \@ifstar\@sdynamicswitchoffnextonly\@dynamicswitchoffnextonly } -\newcommand*{\evencheckifframeleft}{% -\@ifstar\@sevencheckifframeleft\@evencheckifframeleft} -\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 +\newcommand{\@sdynamicswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicaddexclusion{\number\ff@id}{\number\count@}% + }% + }% } -\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 +\newcommand{\@dynamicswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% } -\newcommand*{\evencheckifframeright}{% -\@ifstar\@sevencheckifframeright\@evencheckifframeright} -\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 +\newcommand*{\dynamicswitchoffnextoddonly}{% + \@ifstar\@sdynamicswitchoffnextoddonly\@dynamicswitchoffnextoddonly } -\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 +\newcommand{\@sdynamicswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax + \else + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@dynamicframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicaddexclusion{\number\ff@id}{\number\count@}% + }% + }% } -\newcommand*{\FFaboveleft}{above left} -\newcommand*{\FFaboveright}{above right} -\newcommand*{\FFbelowleft}{below left} -\newcommand*{\FFbelowright}{below right} -\newcommand*{\FFleft}{on the left} -\newcommand*{\FFright}{on the right} -\newcommand*{\FFabove}{above} -\newcommand*{\FFbelow}{below} -\newcommand*{\FFoverlap}{overlap} -\DeclareRobustCommand*{\relativeframelocation}{% -\@ifstar\@srelativeframelocation\@relativeframelocation} -\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 +\newcommand{\@dynamicswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax \else - \ifFLFright - \FFaboveright + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\dynamicaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} +\newcommand*{\staticswitchonnext}{% + \@ifstar\@sstaticswitchonnext\@staticswitchonnext +} +\newcommand{\@sstaticswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{>\number\@ff@pages@countreg}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% + \fi + }% +} +\newcommand{\@staticswitchonnext}[1]{% + \@for\@ff@id:=#1\do{% + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{>\number\@ff@pages@countreg}% + }% \else - \FFabove + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,>\number\@ff@pages@countreg}% + }% \fi + }% +} +\newcommand*{\staticswitchonnextodd}{% + \@ifstar\@sstaticswitchonnextodd\@staticswitchonnextodd +} +\newcommand{\@sstaticswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax \fi -\else - \ifFLFbelow - \ifFLFleft - \FFbelowleft + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \def\@ff@prepages{}% + \if@notthiscol \else - \ifFLFright - \FFbelowright + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi + \@sf@chckifthispg[\count@]{\ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol \else - \FFbelow + \edef\@ff@prepages{\@ff@prepages\number\count@,}% \fi \fi - \else - \ifFLFleft - \FFleft + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% +} +\newcommand{\@staticswitchonnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\count@\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \def\@ff@prepages{}% + \if@notthiscol \else - \ifFLFright - \FFright + \def\@ff@prepages{\number\@ff@pages@countreg,}% + \fi + \@sf@chckifthispg[\count@]{\@ff@id}% + \ifnum\count@=\@ff@pages@countreg\relax + \else + \if@notthiscol \else - \FFoverlap + \edef\@ff@prepages{\@ff@prepages\number\count@,}% \fi \fi - \fi -\fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}% + {\@ff@prepages>\number\count@}% + }% + }% } -\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 +\newcommand*{\staticswitchoffnext}{% + \@ifstar\@sstaticswitchoffnext\@staticswitchoffnext +} +\newcommand{\@sstaticswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol + \def\@ff@pages{none}% + \else + \def\@ff@pages{\number\@ff@pages@countreg}% + \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% +} +\newcommand{\@staticswitchoffnext}[1]{% + \@for\@ff@id:=#1\do{% + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol + \def\@ff@pages{none}% \else - \FFabove + \def\@ff@pages{\number\@ff@pages@countreg}% \fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% +} +\newcommand*{\staticswitchoffnextodd}{% + \@ifstar\@sstaticswitchoffnextodd\@staticswitchoffnextodd +} +\newcommand{\@sstaticswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax \fi -\else - \ifFLFbelow - \ifFLFleft - \FFbelowleft + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{none}% + \else + \@sf@chckifthispg[\count@]{\ff@id}% + \if@notthiscol + \def\@ff@nextpages{none}% + \else + \def\@ff@nextpages{\number\count@}% + \fi + \fi \else - \ifFLFright - \FFbelowright + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{\number\@ff@pages@countreg}% \else - \FFbelow + \@sf@chckifthispg[\count@]{\ff@id}% + \if@notthiscol + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi \fi \fi - \else - \ifFLFleft - \FFleft + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{\@ff@nextpages}% + }% + }% +} +\newcommand{\@staticswitchoffnextodd}[1]{% + \count@=\@ff@pages@countreg\relax + \ifodd\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{none}% + \else + \@sf@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol + \def\@ff@nextpages{none}% + \else + \def\@ff@nextpages{\number\count@}% + \fi + \fi \else - \ifFLFright - \FFright + \ifnum\@ff@pages@countreg=\count@\relax + \def\@ff@nextpages{\number\@ff@pages@countreg}% \else - \FFoverlap + \@sf@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol + \def\@ff@nextpages{\number\@ff@pages@countreg}% + \else + \def\@ff@nextpages{\number\@ff@pages@countreg,\number\count@}% + \fi \fi \fi - \fi -\fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{\@ff@nextpages}% + }% + }% } -\DeclareRobustCommand*{\reldynamicloc}{% -\@ifstar\@sreldynamicloc\@reldynamicloc} -\newcommand*{\@sreldynamicloc}[2]{ -\@srelativeframelocation{dynamic}{#1}{dynamic}{#2}} -\newcommand*{\@reldynamicloc}[2]{ -\@relativeframelocation{dynamic}{#1}{dynamic}{#2}} -\DeclareRobustCommand*{\relstaticloc}{% -\@ifstar\@srelstaticloc\@relstaticloc} -\newcommand*{\@srelstaticloc}[2]{ -\@srelativeframelocation{static}{#1}{static}{#2}} -\newcommand*{\@relstaticloc}[2]{ -\@relativeframelocation{static}{#1}{static}{#2}} -\DeclareRobustCommand*{\relflowloc}{% -\@ifstar\@srelflowloc\@relflowloc} -\newcommand*{\@srelflowloc}[2]{ -\@srelativeframelocation{flow}{#1}{flow}{#2}} -\newcommand*{\@relflowloc}[2]{ -\@relativeframelocation{flow}{#1}{flow}{#2}} -\newcommand*{\setinitialframe}[1]{\c@thisframe=#1% -\global\usedframebreaktrue -\global\setlength{\hsize}{% -\csname colwidth\romannumeral\c@thisframe\endcsname}} -\newif\if@setfr@mes -\@setfr@mesfalse -\newcommand*{\setframes}{% -\ifnum\c@thisframe=0\relax -\PackageWarning{flowfram}{Can't find a flow frame on page 1. -\MessageBreak -Attempting to find the first page with a flow frame}% -\@nxtcol=1\relax -\c@curpg=1\relax -\@g@tnextcol{\@nxtcol}% -\advance\c@curpg by -1\relax - \whiledo{\c@curpg>0}{\advance\c@curpg by -1\relax - \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% -\@outputpage}% -\c@thisframe=\@nxtcol -\fi -\@setcol{\c@thisframe}\relax -\@setfr@mestrue -\edef\ff@txtcol{% -\csname @ff@txtcol@\romannumeral\c@thisframe\endcsname}% -\@s@tfftextcol +\newcommand*{\staticswitchonnextonly}{% + \@ifstar\@sstaticswitchonnextonly\@staticswitchonnextonly } -\newcommand{\emulatetwocolumn}[1][]{% -\finishthispage -\setallflowframes{pages=none}% -\settoheight{\@ff@staticH}{#1}% -\settodepth{\@ff@tmp@y}{#1}% -\addtolength{\@ff@staticH}{\@ff@tmp@y}% -\ifdim\@ff@staticH>0pt\relax -\twocolumnStop[\c@page]{\@ff@staticH}% -\c@thisframe=\c@maxflow -\advance\c@thisframe by -1\relax -\@twocolumn[>\c@page]% -\setstaticcontents{\c@maxstatic}{#1}% -\else -\@twocolumn -\c@thisframe=\c@maxflow -\advance\c@thisframe by -1\relax -\fi -\@setcol{\c@thisframe}\relax +\newcommand{\@sstaticswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{\number\count@}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% } -\newcommand{\emulateonecolumn}[1][]{% -\finishthispage -\setallflowframes{pages=none}% -\settoheight{\@ff@staticH}{#1}% -\settodepth{\@ff@tmp@y}{#1}% -\addtolength{\@ff@staticH}{\@ff@tmp@y}% -\ifdim\@ff@staticH>0pt\relax -\onecolumnStop[\c@page]{\@ff@staticH}% -\c@thisframe=\c@maxflow -\advance\c@thisframe by -1\relax -\@onecolumn[>\c@page]% -\setstaticcontents{\c@maxstatic}{#1}% -\else -\@twocolumn -\c@thisframe=\c@maxflow -\advance\c@thisframe by -1\relax -\fi -\@setcol{\c@thisframe}\relax +\newcommand{\@staticswitchonnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \if@notthiscol + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{\number\count@}% + }% + \else + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}% + {\number\@ff@pages@countreg,\number\count@}% + }% + \fi + }% } -\AtBeginDocument{% -\ifnum\c@maxflow=0\relax -\PackageWarning{flowfram}{No flow frames, adding one}% -\@onecolumn -\fi -\setframes -\renewcommand{\onecolumn}[1][]{\PackageWarning{flowfram}{% -Ignoring \string\onecolumn\space found in document environment. -Frames must be defined in the preamble}#1}% -\renewcommand{\twocolumn}[1][]{\PackageWarning{flowfram}{% -Ignoring \string\twocolumn\space found in document environment. -Frames must be defined in the preamble}#1}% +\newcommand*{\staticswitchonnextoddonly}{% + \@ifstar\@sstaticswitchonnextoddonly\@staticswitchonnextoddonly } -\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 - \else - \ifusedframebreak +\newcommand{\@sstaticswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \@sf@chckifthispg[\@ff@pages@countreg]{\ff@id}% + \if@notthiscol + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@sf@chckifthispg[\count@]{\ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi \else - \PackageWarning{flowfram}{Moving to flow frame of unequal - width,\MessageBreak use of \string\framebreak\space advised, - or text might not appear correctly}% + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@sf@chckifthispg[\count@]{\ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi \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}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\ff@id}{\@ff@pages}% + }% + }% } -\output={\let\par\@@par -\ifnum\outputpenalty <-\@M - \@specialoutput -\else - \@makecol - \@opcol \@startcolumn - \@whilesw \if@fcolmade \fi {\@opcol \@startcolumn }% -\fi -\ifnum\outputpenalty>-\@Miv - \ifdim\@colroom<1.5\baselineskip - \ifdim\@colroom<\vsize - \@latex@warning@no@line{Text page \thepage \space - contains only floats}\@emptycol +\newcommand{\@staticswitchonnextoddonly}[1]{% + \@for\@ff@id:=#1\do{% + \@sf@chckifthispg[\@ff@pages@countreg]{\@ff@id}% + \if@notthiscol + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@sf@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \else + \edef\@ff@pages{\number\count@}% + \advance\count@ by 1\relax + \edef\@ff@pages{\@ff@pages,\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\count@}% + \fi \else - \global\vsize\@colroom + \ifodd\@ff@pages@countreg + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@sf@chckifthispg[\count@]{\@ff@id}% + \if@notthiscol + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \else + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg-\number\count@}% + \fi + \else + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \edef\@ff@pages{\number\@ff@pages@countreg,\number\count@}% + \fi \fi - \else - \global\vsize\@colroom - \fi -\else - \global\vsize\maxdimen -\fi + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticsetpagelist{\number\@ff@id}{\@ff@pages}% + }% + }% } -\def\@doclearpage{% -\ifvoid\footins - \setbox\@tempboxa\vsplit\@cclv to\z@ - \unvbox\@tempboxa - \setbox\@tempboxa\box\@cclv - \xdef\@deferlist{\@toplist\@botlist\@deferlist}% -\global\let\@toplist\@empty -\global\let\@botlist\@empty -\global\@colroom\@colht - \ifx\@currlist\@empty - \else - \@latexerr{Float(s) lost}\@ehb - \global\let\@currlist\@empty - \fi - \@makefcolumn - \@deferlist - \@whilesw \if@fcolmade \fi {\@opcol - \@makefcolumn - \@deferlist}% -\if@firstcolumn - \xdef\@dbldeferlist{\@dbltoplist\@dbldeferlist}% -\global\let\@dbltoplist\@empty -\global\@colht\vsize -\begingroup - \@dblfloatplacement - \@makefcolumn - \@dbldeferlist - \@whilesw \if@fcolmade \fi {\@outputpage -\@makefcolumn\@dbldeferlist}% -\endgroup -\else - \vbox{}\clearpage -\fi -\else - \setbox\@cclv\vbox{\box\@cclv\vfil}% -\@makecol\@opcol\clearpage\fi} -\newcommand{\@dothehead}{\vbox to \headheight{% -\color@hbox\normalcolor\hbox to \textwidth{% -\@thehead}\color@endbox}} -\newcommand{\@dothefoot}{% -\color@hbox\normalcolor\hbox to \textwidth{% -\@thefoot}\color@endbox} -\newcommand{\@dodynamicthehead}{} -\newcommand{\@dodynamicthefoot}{} -\def\@outputpage{% -\begingroup - \let\protect\noexpand - \@resetactivechars - \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@ - \vskip\topmargin\moveright\@themargin - \vbox{% - \vskip\headheight - \vskip\headsep - \box\@outputbox - }}% - \global\let\if@newlist\@@if@newlist - \stepcounter{page}% - \setcounter{displayedframe}{0}% - \let\firstmark\botmark} -\newcommand*{\makedfheaderfooter}{% -\setlength{\@ff@tmp@y}{\textheight}% -\addtolength{\@ff@tmp@y}{\headsep}% -\newdynamicframe{\textwidth}{\headheight}{0pt}{\@ff@tmp@y}[header]% -\newdynamicframe{\textwidth}{\headheight}{0pt}{-\footskip}[footer]% -\renewcommand{\@dothehead}{}% -\renewcommand{\@dothefoot}{}% -\renewcommand{\@dodynamicthehead}{% -\@dynamicframeid{header}% -\expandafter -\def\csname @dynamicframe@\romannumeral\ff@id\endcsname{% -\vfill\@thehead\vfill}% -}% -\renewcommand{\@dodynamicthefoot}{% -\@dynamicframeid{footer}% -\expandafter -\def\csname @dynamicframe@\romannumeral\ff@id\endcsname{% -\vfill\@thefoot\vfill}% -}% +\newcommand*{\staticswitchoffnextonly}{% + \@ifstar\@sstaticswitchoffnextonly\@staticswitchoffnextonly } -\@onlypreamble{\makedfheaderfooter} -\newcommand{\footnotecolor}{% -\@ifundefined{@ff@txtcol@\romannumeral\c@thisframe}{% -\normalcolor}{% -\edef\ff@txtcol{% -\csname @ff@txtcol@\romannumeral\c@thisframe\endcsname}% -\@s@tfftextcol}} -\renewcommand{\@makecol}{% -\ifvoid\footins - \setbox\@outputbox\box\@cclv -\else - \setbox\@outputbox\vbox{% -\boxmaxdepth\@maxdepth\@tempdima\dp\@cclv - \unvbox\@cclv - \vskip\skip\footins - \color@begingroup - \footnotecolor - \footnoterule - \unvbox\footins - \color@endgroup -}\fi -\xdef\@freelist{\@freelist \@midlist }% -\global\let\@midlist\@empty -\@combinefloats -\ifvbox\@kludgeins - \@makespecialcolbox -\else - \setbox\@outputbox\vbox to\@colht{% -\@texttop\dimen@\dp\@outputbox - \unvbox \@outputbox - \vskip -\dimen@\@textbottom -}\fi -\global\maxdepth\@maxdepth} -\def\@opcol{\@outputdblcol -\global\@mparbottom\z@ -\global\@textfloatsheight\z@ -\@floatplacement +\newcommand{\@sstaticswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticaddexclusion{\number\ff@id}{\number\count@}% + }% + }% } -\newif\if@ff@moreframes -\newcommand*{\@ff@checkifmoreframes}{% -\@ff@moreframesfalse -\@colN=\c@thisframe -\whiledo{\@colN<\c@maxflow}{% -\advance\@colN by 1\relax -\edef\ff@pages{\csname @ff@pages@\romannumeral\@colN\endcsname}% -\@ff@checkpages{\ff@pages}% -}% -\if@ff@moreframes -\else -\@ff@tmpN=\c@page -\advance\@ff@tmpN by 1\relax -\@colN=0\relax -\whiledo{\@colN<\c@thisframe}{% -\advance\@colN by 1\relax -\edef\ff@pages{\csname @ff@pages@\romannumeral\@colN\endcsname}% -\@ff@checkpages[\@ff@tmpN]{\ff@pages}% -}% -\fi +\newcommand{\@staticswitchoffnextonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% } -\newcommand*{\@ff@checkpages}[2][\c@page]{% -\@for\@ff@pp:=#2\do{% -\@ff@checkthispage{#1}{\@ff@pp}}} -\newcommand*{\@ff@checkthispage}[2]{% -\ifthenelse{\equal{#2}{all}\or\equal{#2}{even}\or\equal{#2}{odd}}{% -\@ff@moreframestrue}{% -\ifthenelse{\equal{#2}{none}}{}{% -\@ff@checknumrange{#1}{#2}}}} -\newcommand*{\@ff@checknumrange}[2]{% -\def\@ff@numstart{0}\def\@ff@numend{10000}% -\@ff@getrange{#2}% -\ifnum\@ff@numend>#1\relax -\@ff@moreframestrue -\else -\ifnum\@ff@numend=#1\relax -\@ff@moreframestrue -\fi -\fi +\newcommand*{\staticswitchoffnextoddonly}{% + \@ifstar\@sstaticswitchoffnextoddonly\@staticswitchoffnextoddonly } -\newcount\c@ffrangenum -\newcommand*{\@ff@getrange}[1]{% -\expandafter\@ff@@getrange#1-\relax\end} -\def\@ff@@getrange#1#2\end{% -\ifx#1<\relax - \@ff@getrangeless#1#2\end -\else - \ifx#1>\relax - \@ff@getrangegreater#1#2\end +\newcommand{\@sstaticswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax \else - \@@ff@getrange#1#2\end + \advance\count@ by 1\relax \fi -\fi + \@for\@ff@id:=#1\do{% + \@staticframeid{\@ff@id}% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticaddexclusion{\number\ff@id}{\number\count@}% + }% + }% } -\def\@ff@getrangeless<#1-\relax\end{% -\c@ffrangenum=#1\relax -\advance\c@ffrangenum by -1\relax -\def\@ff@numstart{0}% -\edef\@ff@numend{\number\c@ffrangenum}} -\def\@ff@getrangegreater>#1-\relax\end{% -\c@ffrangenum=#1\relax -\advance\c@ffrangenum by 1\relax -\edef\@ff@numstart{\number\c@ffrangenum}% -\def\@ff@numend{10000}} -\def\@@ff@getrange#1-#2\end{% -\ifx\relax#2\relax -\def\@ff@numstart{#1}\def\@ff@numend{#1}% -\else -\def\@ff@numstart{#1}% -\@@@ff@getrange#2\end -\fi +\newcommand{\@staticswitchoffnextoddonly}[1]{% + \count@=\@ff@pages@countreg\relax + \advance\count@ by 1\relax + \ifodd\count@\relax + \else + \advance\count@ by 1\relax + \fi + \@for\@ff@id:=#1\do{% + \expandafter\toks@\expandafter{\@ff@output@adjustframes}% + \xdef\@ff@output@adjustframes{% + \the\toks@ + \noexpand\staticaddexclusion{\number\@ff@id}{\number\count@}% + }% + }% +} +\newcommand*{\ffaddtoadjustframeshook}[1]{% + \@ff@addtolist\@ff@output@adjustframes\entry{#1}% } -\def\@@@ff@getrange#1-\relax\end{% -\def\@ff@numend{#1}} \newif\if@notthiscol \newif\if@ff@nwpg \newcount\c@curpg \newcommand*{\@g@tnextcol}[1]{% -\@ff@checkifmoreframes -\if@ff@moreframes -\else -\PackageWarning{flowfram}{Run out of flows frames, -adding new one}% -\@onecolumn -#1=\c@maxflow -\fi -\@notthiscoltrue -\@ff@nwpgfalse -\@colN=#1\relax -\c@curpg=\c@page -\loop -\ifnum\@colN=\c@maxflow - \@colN=1\@ff@nwpgtrue - \advance\c@curpg by 1\relax -\else - \advance\@colN by 1\relax -\fi -\@ff@chckifthispg{\c@curpg}{\@colN}% -\if@notthiscol -\repeat -#1=\@colN + \@ff@output@adjustframes + \global\let\@ff@output@adjustframes\@empty + \@ff@checkifmoreframes + \if@ff@moreframes + \else + \PackageWarning{flowfram}% + {Run out of flows frames on page \number\@ff@pages@countreg, adding new one}% + \flf@doifverbose + {% + \def\flf@messinfo{Here's the list of flow frames:}% + \count@=0\relax + \loop + \advance\count@ by 1\relax + \expandafter\toks@\expandafter{\flf@messinfo\MessageBreak}% + \edef\flf@messinfo{\the\toks@ + \number\count@. + Pages: \csname @ff@pages@\romannumeral\count@\endcsname. + Exclusions: \csname @ff@xpages@\romannumeral\count@\endcsname. + }% + \ifnum\count@<\c@maxflow + \repeat + \PackageInfo{flowfram}{\flf@messinfo\@gobbletwo}% + }% + \@onecolumn + #1=\c@maxflow + \fi + \@notthiscoltrue + \@ff@nwpgfalse + \@colN=#1\relax + \c@curpg=\@ff@pages@countreg + \loop + \ifnum\@colN=\c@maxflow + \@colN=1\relax + \@ff@nwpgtrue + \advance\c@curpg by 1\relax + \else + \advance\@colN by 1\relax + \fi + \@ff@chckifthispg{\c@curpg}{\@colN}% + \if@notthiscol + \repeat + #1=\@colN\relax } \newcommand*{\@ff@chckifthispg}[2]{% -\@notthiscoltrue -\edef\ff@pages{\csname @ff@pages@\romannumeral#2\endcsname}% -\@@ff@chckifthispg{#1}% + \@notthiscolfalse + \edef\ff@xpages{\csname @ff@xpages@\romannumeral#2\endcsname}% + \@for\@ff@pp:=\ff@xpages\do + {% + \ifnum0\@ff@pp=#1\relax + \@notthiscoltrue + \@endfortrue + \fi + }% + \if@notthiscol + \else + \@notthiscoltrue + \edef\ff@pages{\csname @ff@pages@\romannumeral#2\endcsname}% + \@@ff@chckifthispg{#1}% + \fi } \newcommand*{\@@ff@chckifthispg}[1]{% -\ifthenelse{\equal{\ff@pages}{none}}{}{% -\ifthenelse{\equal{\ff@pages}{all}}{\@notthiscolfalse}{% -\ifthenelse{\equal{\ff@pages}{odd}}{% -\ifodd#1\@notthiscolfalse\fi}{% -\ifthenelse{\equal{\ff@pages}{even}}{% -\ifodd#1\else\@notthiscolfalse\fi}{% -\@for\@ff@pp:=\ff@pages\do{% -\def\@ff@numstart{0}\def\@ff@numend{0}% -\@ff@getrange{\@ff@pp}% -\ifthenelse{#1<\@ff@numstart \or #1>\@ff@numend}{}{% -\@notthiscolfalse}% -}% -}}}}% + \ifthenelse{\equal{\ff@pages}{none}}% + {}% + {% + \ifthenelse{\equal{\ff@pages}{all}}% + {% + \@notthiscolfalse + }% + {% + \ifthenelse{\equal{\ff@pages}{odd}}% + {% + \ifodd#1\@notthiscolfalse\fi + }% + {% + \ifthenelse{\equal{\ff@pages}{even}}% + {% + \ifodd#1\else\@notthiscolfalse\fi + }% + {% + \@for\@ff@pp:=\ff@pages\do{% + \def\@ff@numstart{0}% + \def\@ff@numend{0}% + \@ff@getrange{\@ff@pp}% + \ifthenelse{#1<\@ff@numstart \or #1>\@ff@numend}% + {}% + {% + \@notthiscolfalse + }% + }% + }% + }% + }% + }% } -\newcommand*{\@sf@chckifthispg}[1]{% -\@notthiscoltrue -\edef\ff@pages{\csname @sf@pages@\romannumeral#1\endcsname}% -\@@ff@chckifthispg{\c@page}% +\newcommand*{\@sf@chckifthispg}[2][\@ff@pages@countreg]{% + \@notthiscoltrue + \edef\ff@pages{\csname @sf@pages@\romannumeral#2\endcsname}% + \@@ff@chckifthispg{#1}% } -\newcommand*{\@df@chckifthispg}[1]{% -\@notthiscoltrue -\edef\ff@pages{\csname @df@pages@\romannumeral#1\endcsname}% -\@@ff@chckifthispg{\c@page}% +\newcommand*{\@df@chckifthispg}[2][\@ff@pages@countreg]{% + \@notthiscoltrue + \edef\ff@pages{\csname @df@pages@\romannumeral#2\endcsname}% + \@@ff@chckifthispg{#1}% } \newcommand*{\@setcolbox}[1]{% -\expandafter\global\expandafter\setbox -\csname column\romannumeral#1\endcsname\box\@outputbox + \flf@message{Setting contents of box for flow frame \number#1}% + \expandafter\global\expandafter\setbox + \csname column\romannumeral#1\endcsname\box\@outputbox } \newcommand*{\@docolbox}[1]{% -\edef\ff@frametype{% -\csname @ff@frametype@\romannumeral#1\endcsname}% -\edef\ff@col{\csname @ff@col@\romannumeral#1\endcsname}% -\edef\ff@txtcol{\csname @ff@txtcol@\romannumeral#1\endcsname}% -\edef\ff@backcol{\csname @ff@backcol@\romannumeral#1\endcsname}% -\@ff@setoffset{#1}% -\rotateframe{\csname @ff@angle@\romannumeral#1\endcsname}{% -\ifthenelse{\boolean{columnframe\romannumeral#1}}{% -\@ff@fbox{\csname colwidth\romannumeral#1\endcsname}% -{\csname colheight\romannumeral#1\endcsname}{% -\expandafter\box\csname column\romannumeral#1\endcsname}{% -\csname\ff@frametype\endcsname}% -}{% -\@ff@box{\csname colwidth\romannumeral#1\endcsname}% -{\csname colheight\romannumeral#1\endcsname}{% -\expandafter\box\csname column\romannumeral#1\endcsname}% -}}} + \flf@message{Doing flow frame \number#1\space + (page \number\@ff@pages@countreg)}% + \edef\ff@frametype{% + \csname @ff@frametype@\romannumeral#1\endcsname}% + \edef\ff@col{\csname @ff@col@\romannumeral#1\endcsname}% + \edef\ff@txtcol{\csname @ff@txtcol@\romannumeral#1\endcsname}% + \edef\ff@backcol{\csname @ff@backcol@\romannumeral#1\endcsname}% + \@ff@setoffset{#1}% + \rotateframe{\csname @ff@angle@\romannumeral#1\endcsname}% + {% + \ifthenelse{\boolean{columnframe\romannumeral#1}}% + {% + \@ff@fbox + {\csname colwidth\romannumeral#1\endcsname}% + {\csname colheight\romannumeral#1\endcsname}% + {% + \expandafter\box\csname column\romannumeral#1\endcsname + }% + {% + \csname\ff@frametype\endcsname + }% + }% + {% + \@ff@box + {\csname colwidth\romannumeral#1\endcsname}% + {\csname colheight\romannumeral#1\endcsname}% + {% + \expandafter\box\csname column\romannumeral#1\endcsname + }% + }% + }% +} \newcommand*{\@docolbbox}[1]{% -\@ff@setoffset{#1}% -\def\ff@col{}\def\ff@txtcol{}% -\@fr@meifdraft{% -\@ff@box{\csname colwidth\romannumeral#1\endcsname}% -{\csname colheight\romannumeral#1\endcsname}{% -\expandafter\box\csname column\romannumeral#1\endcsname}}% -{F:\number#1;\csname @col@id@\romannumeral#1\endcsname}} -\newcommand{\@ff@fbox}[4]{{% -\fboxsep=\flowframesep\fboxrule=\flowframerule\@s@tffcol -\kern\@ff@offset -#4{\@ff@box{#1}{#2}{#3}}}} -\newcommand{\@ff@box}[3]{{\@ffbackground{\vbox to#2 -{\hb@xt@ #1{\hss{\@s@tfftextcol #3}\hss}\vss\kern\z@}}}} + \@ff@setoffset{#1}% + \def\ff@col{}\def\ff@txtcol{}% + \@fr@meifdraft + {% + \@ff@box + {\csname colwidth\romannumeral#1\endcsname}% + {\csname colheight\romannumeral#1\endcsname}% + {% + \expandafter\box\csname column\romannumeral#1\endcsname + }% + }% + {F:\number#1;\csname @col@id@\romannumeral#1\endcsname}% +} +\newcommand{\@ff@fbox}[4]{% + {% + \fboxsep=\flowframesep + \fboxrule=\flowframerule + \@s@tffcol + \kern\@ff@offset + #4{\@ff@box{#1}{#2}{#3}}% + }% +} +\newcommand{\@ff@box}[3]{% + {% + \@ffbackground + {% + \vbox to#2 {\hb@xt@ #1{\hss{\@s@tfftextcol #3}\hss}\vss\kern\z@}% + }% + }% +} \newcommand*{\@putcolbox}[1]{% -\@ff@chckifthispg{\c@page}{#1}% -\if@notthiscol -\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname col@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@posx\endcsname -\@docolbox{#1}\hss}% -\else -\expandafter\raise\csname col@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@evenx\endcsname -\@docolbox{#1}\hss}% -\fi -\else -\expandafter\raise\csname col@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@posx\endcsname -\@docolbox{#1}\hss}% -\fi -\fi + \@ff@chckifthispg{\@ff@pages@countreg}{#1}% + \if@notthiscol + \expandafter\ifvoid\csname column\romannumeral#1\endcsname + \else + \PackageWarning{flowfram}{Box \number#1\space is not void. + Dumping. This page: \number\@ff@pages@countreg. + Page list: "\csname @ff@pages@\romannumeral#1\endcsname". + Exclusion list: "\csname @ff@xpages@\romannumeral#1\endcsname". + (Maybe the page list was changed after this frame was + selected or maybe you should use package option pages=absolute)}% + \@notthiscolfalse + \fi + \fi + \if@notthiscol + \flf@message{Flow frame \number#1\space is not required on page + \number\@ff@pages@countreg}% + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname col@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@posx\endcsname + \@docolbox{#1}\hss + }% + \else + \expandafter\raise\csname col@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@evenx\endcsname + \@docolbox{#1}\hss + }% + \fi + \else + \expandafter\raise\csname col@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@posx\endcsname + \@docolbox{#1}\hss + }% + \fi + \fi } \newcommand*{\@putcolbbox}[1]{% -\@ff@chckifthispg{\c@page}{#1}% -\if@notthiscol -\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname col@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@posx\endcsname -\@docolbbox{#1}\hss}% -\else -\expandafter\raise\csname col@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@evenx\endcsname -\@docolbbox{#1}\hss}% -\fi -\else -\expandafter\raise\csname col@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname col@\romannumeral#1@posx\endcsname -\@docolbbox{#1}\hss}% -\fi -\fi + \@ff@chckifthispg{\@ff@pages@countreg}{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname col@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@posx\endcsname + \@docolbbox{#1}\hss + }% + \else + \expandafter\raise\csname col@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@evenx\endcsname + \@docolbbox{#1}\hss + }% + \fi + \else + \expandafter\raise\csname col@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname col@\romannumeral#1@posx\endcsname + \@docolbbox{#1}\hss + }% + \fi + \fi } \newcommand*{\@ff@s@t@doubleboxoffset}{% -\setlength{\@ff@offset}{-\flowframesep}% -\addtolength{\@ff@offset}{-3.75\flowframerule}% -\addtolength{\@ff@offset}{-.5pt}% + \setlength{\@ff@offset}{-\flowframesep}% + \addtolength{\@ff@offset}{-3.75\flowframerule}% + \addtolength{\@ff@offset}{-.5pt}% } \newcommand*{\@ff@s@t@ovalboxoffset}{% -\@ff@offset=-\fontdimen 8\tenln\relax -\advance\@ff@offset by -\flowframesep\relax + \@ff@offset=-\fontdimen 8\tenln\relax + \advance\@ff@offset by -\flowframesep\relax } \newcommand*{\@ff@s@t@Ovalboxoffset}{% -\@ff@offset=-\fontdimen 8\tenlnw\relax -\advance\@ff@offset by -\flowframesep\relax + \@ff@offset=-\fontdimen 8\tenlnw\relax + \advance\@ff@offset by -\flowframesep\relax } \newcommand*{\@ff@s@t@defaultoffset}{% -\@ff@offset=-\flowframesep\relax -\addtolength{\@ff@offset}{-\flowframerule}% + \@ff@offset=-\flowframesep\relax + \addtolength{\@ff@offset}{-\flowframerule}% } \newcommand*{\@ff@setoffset}[1]{% -\ifthenelse{\equal{\csname @ff@offset@\romannumeral#1\endcsname}% -{compute}}{% -\ifthenelse{\boolean{columnframe\romannumeral#1}}{% -\ifthenelse{% -\equal{\csname @ff@frametype@\romannumeral#1\endcsname}% -{doublebox}}{% -\@ff@s@t@doubleboxoffset -}{% -\ifthenelse{% -\equal{\csname @ff@frametype@\romannumeral#1\endcsname}% -{ovalbox}}{% -\@ff@s@t@ovalboxoffset -}{% -\ifthenelse{% -\equal{\csname @ff@frametype@\romannumeral#1\endcsname}% -{Ovalbox}}{% -\@ff@s@t@Ovalboxoffset}{% -\@ff@s@t@defaultoffset -}}}% -}{}% -}{% -\setlength{\@ff@offset}% -{\csname @ff@offset@\romannumeral#1\endcsname}}% + \ifthenelse + {\equal{\csname @ff@offset@\romannumeral#1\endcsname}{compute}}% + {% + \ifthenelse{\boolean{columnframe\romannumeral#1}}% + {% + \ifthenelse + {% + \equal{\csname @ff@frametype@\romannumeral#1\endcsname}% + {doublebox}% + }% + {% + \@ff@s@t@doubleboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @ff@frametype@\romannumeral#1\endcsname}% + {ovalbox}% + }% + {% + \@ff@s@t@ovalboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @ff@frametype@\romannumeral#1\endcsname}% + {Ovalbox}% + }% + {% + \@ff@s@t@Ovalboxoffset + }% + {% + \@ff@s@t@defaultoffset + }% + }% + }% + }% + {}% + }% + {% + \setlength{\@ff@offset}% + {\csname @ff@offset@\romannumeral#1\endcsname}% + }% } \newcommand*{\@sf@setoffset}[1]{% -\ifthenelse{% -\equal{\csname @sf@offset@\romannumeral#1\endcsname}% -{compute}}{% -\ifthenelse{\boolean{staticframe\romannumeral#1}}{% -\ifthenelse{% -\equal{\csname @sf@frametype@\romannumeral#1\endcsname}% -{doublebox}}{% -\@ff@s@t@doubleboxoffset -}{% -\ifthenelse{% -\equal{\csname @sf@frametype@\romannumeral#1\endcsname}% -{ovalbox}}{% -\@ff@s@t@ovalboxoffset -}{% -\ifthenelse{% -\equal{\csname @sf@frametype@\romannumeral#1\endcsname}% -{Ovalbox}}{% -\@ff@s@t@Ovalboxoffset -}{% -\@ff@s@t@defaultoffset -}}}% -}{}% -}{% -\setlength{\@ff@offset}% -{\csname @sf@offset@\romannumeral#1\endcsname}}% + \ifthenelse + {% + \equal{\csname @sf@offset@\romannumeral#1\endcsname}% + {compute}% + }% + {% + \ifthenelse{\boolean{staticframe\romannumeral#1}}% + {% + \ifthenelse + {% + \equal{\csname @sf@frametype@\romannumeral#1\endcsname}% + {doublebox}% + }% + {% + \@ff@s@t@doubleboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @sf@frametype@\romannumeral#1\endcsname}% + {ovalbox}% + }% + {% + \@ff@s@t@ovalboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @sf@frametype@\romannumeral#1\endcsname}% + {Ovalbox}% + }% + {% + \@ff@s@t@Ovalboxoffset + }% + {% + \@ff@s@t@defaultoffset + }% + }% + }% + }% + {}% + }% + {% + \setlength{\@ff@offset}% + {\csname @sf@offset@\romannumeral#1\endcsname}% + }% } \newcommand*{\@df@setoffset}[1]{% -\ifthenelse{% -\equal{\csname @df@offset@\romannumeral#1\endcsname}% -{compute}}{% -\setlength{\@ff@offset}{0pt}% -\ifthenelse{\boolean{dynamicframe\romannumeral#1}}{% -\ifthenelse{% -\equal{\csname @df@frametype@\romannumeral#1\endcsname}% -{doublebox}}{% -\@ff@s@t@doubleboxoffset -}{% -\ifthenelse{% -\equal{\csname @df@frametype@\romannumeral#1\endcsname}% -{ovalbox}}{% -\@ff@s@t@ovalboxoffset -}{% -\ifthenelse{% -\equal{\csname @df@frametype@\romannumeral#1\endcsname}% -{Ovalbox}}{% -\@ff@s@t@Ovalboxoffset}{% -\@ff@s@t@defaultoffset -}}}% -}{}% -}{% -\setlength{\@ff@offset}% -{\csname @df@offset@\romannumeral#1\endcsname}}% + \ifthenelse + {% + \equal{\csname @df@offset@\romannumeral#1\endcsname}% + {compute}% + }% + {% + \setlength{\@ff@offset}{0pt}% + \ifthenelse{\boolean{dynamicframe\romannumeral#1}}% + {% + \ifthenelse + {% + \equal{\csname @df@frametype@\romannumeral#1\endcsname}% + {doublebox}% + }% + {% + \@ff@s@t@doubleboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @df@frametype@\romannumeral#1\endcsname}% + {ovalbox}% + }% + {% + \@ff@s@t@ovalboxoffset + }% + {% + \ifthenelse + {% + \equal{\csname @df@frametype@\romannumeral#1\endcsname}% + {Ovalbox}% + }% + {% + \@ff@s@t@Ovalboxoffset + }% + {% + \@ff@s@t@defaultoffset + }% + }% + }% + }% + {}% + }% + {% + \setlength{\@ff@offset}% + {\csname @df@offset@\romannumeral#1\endcsname}% + }% } \newcommand*{\@putmarginbox}[1]{% -\@ff@chckifthispg{\c@page}{#1}% -\if@notthiscol -\else -\@killglue -\if@twoside -\ifodd\c@page -\edef\ff@x{\csname col@\romannumeral#1@posx\endcsname}% -\edef\ff@y{\csname col@\romannumeral#1@posy\endcsname}% -\else -\edef\ff@x{\csname col@\romannumeral#1@evenx\endcsname}% -\edef\ff@y{\csname col@\romannumeral#1@eveny\endcsname}% -\fi -\else -\edef\ff@x{\csname col@\romannumeral#1@posx\endcsname}% -\edef\ff@y{\csname col@\romannumeral#1@posy\endcsname}% -\fi -\setlength{\@ff@tmp@x}{\ff@x}% -\setlength{\@ff@tmp@y}{\ff@y}% -\@getmarginpos{\csname @ff@margin@\romannumeral#1\endcsname}% -\ifthenelse{\equal{\ff@margin}{left}}{% -\addtolength{\@ff@tmp@x}{-\marginparwidth}% -\addtolength{\@ff@tmp@x}{-\marginparsep}% -\ifthenelse{\boolean{columnframe\romannumeral#1}}{% -}{}% -}{% -\addtolength{\@ff@tmp@x}% -{\csname colwidth\romannumeral#1\endcsname}% -\addtolength{\@ff@tmp@x}{\marginparsep}% -\ifthenelse{\boolean{columnframe\romannumeral#1}}{% -}{}% -}% -\raise\@ff@tmp@y -\hb@xt@\z@{% -\expandafter\kern\@ff@tmp@x -\@fr@meifdraft{\@ff@box{\marginparwidth}% -{\csname colheight\romannumeral#1\endcsname}{}}% -{M:\number#1}\hss}\fi -\ignorespaces} + \@ff@chckifthispg{\@ff@pages@countreg}{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \edef\ff@x{\csname col@\romannumeral#1@posx\endcsname}% + \edef\ff@y{\csname col@\romannumeral#1@posy\endcsname}% + \else + \edef\ff@x{\csname col@\romannumeral#1@evenx\endcsname}% + \edef\ff@y{\csname col@\romannumeral#1@eveny\endcsname}% + \fi + \else + \edef\ff@x{\csname col@\romannumeral#1@posx\endcsname}% + \edef\ff@y{\csname col@\romannumeral#1@posy\endcsname}% + \fi + \setlength{\@ff@tmp@x}{\ff@x}% + \setlength{\@ff@tmp@y}{\ff@y}% + \@getmarginpos{\csname @ff@margin@\romannumeral#1\endcsname}% + \ifthenelse{\equal{\ff@margin}{left}}% + {% + \addtolength{\@ff@tmp@x}{-\marginparwidth}% + \addtolength{\@ff@tmp@x}{-\marginparsep}% + \ifthenelse{\boolean{columnframe\romannumeral#1}}% + {}% + {}% + }% + {% + \addtolength{\@ff@tmp@x}% + {\csname colwidth\romannumeral#1\endcsname}% + \addtolength{\@ff@tmp@x}{\marginparsep}% + \ifthenelse{\boolean{columnframe\romannumeral#1}}% + {}% + {}% + }% + \raise\@ff@tmp@y + \hb@xt@\z@ + {% + \expandafter\kern\@ff@tmp@x + \@fr@meifdraft{\@ff@box{\marginparwidth}% + {\csname colheight\romannumeral#1\endcsname}{}}% + {M:\number#1}\hss + }% + \fi + \ignorespaces +} \newcommand*{\@ff@drawmargins}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxflow}{% -\advance\@colN by 1\relax -\makebox[0pt][l]{\@putmarginbox{\@colN}}% -}% + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \makebox[0pt][l]{\@putmarginbox{\@colN}}% + }% +} +\def\@ff@getstaticpos[#1][#2][#3]#4{% + \@ff@tmp@x=#4\relax + \@ff@tmp@y=#2\relax + \def\ff@valign{#3}% } -\def\@ff@getstaticpos[#1][#2][#3]#4{\@ff@tmp@x=#4\relax -\@ff@tmp@y=#2\relax -\def\ff@valign{#3}} \newcommand*{\@dostaticbox}[1]{% -\edef\ff@frametype{% -\csname @sf@frametype@\romannumeral#1\endcsname}% -\edef\ff@col{\csname @sf@col@\romannumeral#1\endcsname}% -\edef\ff@backcol{\csname @sf@backcol@\romannumeral#1\endcsname}% -\@sf@setoffset{#1}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname -\rotateframe{\csname @sf@angle@\romannumeral#1\endcsname}{% -\ifthenelse{\boolean{staticframe\romannumeral#1}}{% -\@ff@fbox{\@ff@tmp@x}{\@ff@tmp@y}{% -\expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname} -{\csname\ff@frametype\endcsname}% -}{% -\@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% -{\expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname}% -}}} + \edef\ff@frametype{% + \csname @sf@frametype@\romannumeral#1\endcsname + }% + \edef\ff@col{\csname @sf@col@\romannumeral#1\endcsname}% + \edef\ff@backcol{\csname @sf@backcol@\romannumeral#1\endcsname}% + \@sf@setoffset{#1}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname + \rotateframe + {\csname @sf@angle@\romannumeral#1\endcsname}% + {% + \ifthenelse{\boolean{staticframe\romannumeral#1}}% + {% + \@ff@fbox{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname + } + {\csname\ff@frametype\endcsname}% + }% + {% + \@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname + }% + }% + }% +} \newcommand*{\@dostaticbbox}[1]{% -\edef\ff@col{}% -\@sf@setoffset{#1}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname -\@fr@meifdraft{% -\@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% -{\expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname}% -}{S:\number#1;\csname @sf@id@\romannumeral#1\endcsname}} + \edef\ff@col{}% + \@sf@setoffset{#1}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @sf@dim@\romannumeral#1\endcsname + \@fr@meifdraft + {% + \@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \expandafter\usebox\csname @staticframe@\romannumeral#1\endcsname + }% + }% + {S:\number#1;\csname @sf@id@\romannumeral#1\endcsname}% +} \newcommand*{\@putstaticbox}[1]{% -\@sf@chckifthispg{#1}% -\if@notthiscol\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname -\@dostaticbox{#1}\hss}% -\else -\expandafter\raise\csname @sf@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@evenx\endcsname -\@dostaticbox{#1}\hss}% -\fi -\else -\expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname -\@dostaticbox{#1}\hss}% + \@sf@chckifthispg{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname + \@dostaticbox{#1}\hss + }% + \else + \expandafter\raise\csname @sf@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@evenx\endcsname + \@dostaticbox{#1}\hss + }% + \fi + \else + \expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname + \@dostaticbox{#1}\hss + }% + \fi \fi -\fi} +} \newcommand*{\@putstaticbbox}[1]{% -\@sf@chckifthispg{#1}% -\if@notthiscol\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname -\@dostaticbbox{#1}\hss}\ignorespaces -\else -\expandafter\raise\csname @sf@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@evenx\endcsname -\@dostaticbbox{#1}\hss}\ignorespaces -\fi -\else -\expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname -\@dostaticbbox{#1}\hss}\ignorespaces -\fi -\fi} + \@sf@chckifthispg{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname + \@dostaticbbox{#1}\hss + }% + \ignorespaces + \else + \expandafter\raise\csname @sf@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@evenx\endcsname + \@dostaticbbox{#1}\hss + }% + \ignorespaces + \fi + \else + \expandafter\raise\csname @sf@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @sf@\romannumeral#1@posx\endcsname + \@dostaticbbox{#1}\hss + }% + \ignorespaces + \fi + \fi +} \newcommand*{\@resetst@tics}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\ifthenelse{\boolean{@sf@clear@\romannumeral\@colN}}{% -\global\sbox{% -\csname @staticframe@\romannumeral\@colN\endcsname}{}}{}}} + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \ifthenelse{\boolean{@sf@clear@\romannumeral\@colN}}% + {% + \global\sbox + {% + \csname @staticframe@\romannumeral\@colN\endcsname + }% + {}% + }% + {}% + }% +} \newcommand*{\@resetdyn@mics}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\ifthenelse{\boolean{@df@clear@\romannumeral\@colN}}{% -\expandafter\global\expandafter -\gdef\csname @dynamicframe@\romannumeral\@colN\endcsname{}}{}}} + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \ifthenelse{\boolean{@df@clear@\romannumeral\@colN}}% + {% + \expandafter\global\expandafter + \gdef\csname @dynamicframe@\romannumeral\@colN\endcsname{}% + }% + {}% + }% +} \newcommand*{\@dodfparbox}[1]{% -\expandafter\let\expandafter -\@ff@parshape\csname @df@shape@\romannumeral#1\endcsname -\expandafter\@ff@getshape\@ff@parshape\relax -\ifcase\ff@shape -\expandafter\expandafter\expandafter -\parbox\csname @df@dim@\romannumeral#1\endcsname -{% -\setlength\parindent\sdfparindent -\csname\ff@style\endcsname{\ff@contents}}% -\or -\expandafter\expandafter\expandafter -\parbox\csname @df@dim@\romannumeral#1\endcsname -{% -\setlength\parindent\sdfparindent -\csname\ff@style\endcsname{{% -\let\oldpar=\par -\let\par=\ffpshpar -\@ff@setsecthead -\@ff@parshape -\ff@contents\oldpar}}}% -\or -\expandafter\expandafter\expandafter -\parbox\csname @df@dim@\romannumeral#1\endcsname -{% -\setlength\parindent\sdfparindent -\csname\ff@style\endcsname{{\@ff@disablesec\@ff@parshape -\ff@contents\par}}}% -\fi + \expandafter\let\expandafter + \@ff@parshape\csname @df@shape@\romannumeral#1\endcsname + \expandafter\@ff@getshape\@ff@parshape\relax + \ifcase\ff@shape + \expandafter\expandafter\expandafter + \parbox\csname @df@dim@\romannumeral#1\endcsname + {% + \setlength\parindent\sdfparindent + \csname\ff@style\endcsname{\ff@contents}% + }% + \or + \expandafter\expandafter\expandafter + \parbox\csname @df@dim@\romannumeral#1\endcsname + {% + \setlength\parindent\sdfparindent + \csname\ff@style\endcsname + {{% + \let\oldpar=\par + \let\par=\ffpshpar + \@ff@setsecthead + \@ff@parshape + \ff@contents\oldpar + }}% + }% + \or + \expandafter\expandafter\expandafter + \parbox\csname @df@dim@\romannumeral#1\endcsname + {% + \setlength\parindent\sdfparindent + \csname\ff@style\endcsname + {{% + \@ff@disablesec\@ff@parshape + \ff@contents\par + }}% + }% + \fi } \newcommand*{\@dodynamicbox}[1]{% -\edef\ff@frametype{% -\csname @df@frametype@\romannumeral#1\endcsname}% -\edef\ff@col{\csname @df@col@\romannumeral#1\endcsname}% -\edef\ff@txtcol{\csname @df@txtcol@\romannumeral#1\endcsname}% -\edef\ff@backcol{\csname @df@backcol@\romannumeral#1\endcsname}% -\edef\ff@style{\csname @df@style@\romannumeral#1\endcsname}% -\def\ff@contents{\csname @dynamicframe@\romannumeral#1\endcsname}% -\@df@setoffset{#1}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname -\rotateframe{\csname @df@angle@\romannumeral#1\endcsname}{% -\ifthenelse{\boolean{dynamicframe\romannumeral#1}}{% -\@ff@fbox{\@ff@tmp@x}{\@ff@tmp@y}% -{\@dodfparbox{#1}}% -{\csname\ff@frametype\endcsname}% -}{% -\@ff@box{\@ff@tmp@x}{\@ff@tmp@y}{% -\@dodfparbox{#1}}% -}}} + \edef\ff@frametype{% + \csname @df@frametype@\romannumeral#1\endcsname + }% + \edef\ff@col{\csname @df@col@\romannumeral#1\endcsname}% + \edef\ff@txtcol{\csname @df@txtcol@\romannumeral#1\endcsname}% + \edef\ff@backcol{\csname @df@backcol@\romannumeral#1\endcsname}% + \edef\ff@style{\csname @df@style@\romannumeral#1\endcsname}% + \def\ff@contents{\csname @dynamicframe@\romannumeral#1\endcsname}% + \@df@setoffset{#1}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname + \rotateframe{\csname @df@angle@\romannumeral#1\endcsname}% + {% + \ifthenelse{\boolean{dynamicframe\romannumeral#1}}% + {% + \@ff@fbox{\@ff@tmp@x}{\@ff@tmp@y}% + {\@dodfparbox{#1}}% + {\csname\ff@frametype\endcsname}% + }% + {% + \@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \@dodfparbox{#1}% + }% + }% + }% +} \newcommand*{\@dodynamicbbox}[1]{% -\edef\ff@col{}% -\@df@setoffset{#1}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname -\@fr@meifdraft{% -\@ff@box{\@ff@tmp@x}{\@ff@tmp@y}{% -\expandafter\expandafter\expandafter -\parbox\csname @df@dim@\romannumeral#1\endcsname -{}}% -}{D:\number#1;\csname @df@id@\romannumeral#1\endcsname}} + \edef\ff@col{}% + \@df@setoffset{#1}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @df@dim@\romannumeral#1\endcsname + \@fr@meifdraft + {% + \@ff@box{\@ff@tmp@x}{\@ff@tmp@y}% + {% + \expandafter\expandafter\expandafter + \parbox\csname @df@dim@\romannumeral#1\endcsname + {}% + }% + }% + {D:\number#1;\csname @df@id@\romannumeral#1\endcsname}% +} \newcommand*{\@putdynamicbox}[1]{% -\@df@chckifthispg{#1}% -\if@notthiscol\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname @df@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@posx\endcsname -\@dodynamicbox{#1}\hss}\ignorespaces -\else -\expandafter\raise\csname @df@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@evenx\endcsname -\@dodynamicbox{#1}\hss}\ignorespaces -\fi -\else -\expandafter\raise\csname @df@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@posx\endcsname -\@dodynamicbox{#1}\hss}\ignorespaces -\fi -\fi} + \@df@chckifthispg{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname @df@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@posx\endcsname + \@dodynamicbox{#1}\hss + }% + \ignorespaces + \else + \expandafter\raise\csname @df@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@evenx\endcsname + \@dodynamicbox{#1}\hss + }% + \ignorespaces + \fi + \else + \expandafter\raise\csname @df@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@posx\endcsname + \@dodynamicbox{#1}\hss + }% + \ignorespaces + \fi + \fi +} \newcommand*{\@putdynamicbbox}[1]{% -\@df@chckifthispg{#1}% -\if@notthiscol\else -\@killglue -\if@twoside -\ifodd\c@page -\expandafter\raise\csname @df@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@posx\endcsname -\@dodynamicbbox{#1}\hss}\ignorespaces -\else -\expandafter\raise\csname @df@\romannumeral#1@eveny\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@evenx\endcsname -\@dodynamicbbox{#1}\hss}\ignorespaces -\fi -\else -\expandafter\raise\csname @df@\romannumeral#1@posy\endcsname -\hb@xt@\z@{% -\expandafter\kern \csname @df@\romannumeral#1@posx\endcsname -\@dodynamicbbox{#1}\hss}\ignorespaces -\fi -\fi} + \@df@chckifthispg{#1}% + \if@notthiscol + \else + \@killglue + \if@twoside + \ifodd\c@page + \expandafter\raise\csname @df@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@posx\endcsname + \@dodynamicbbox{#1}\hss + }% + \ignorespaces + \else + \expandafter\raise\csname @df@\romannumeral#1@eveny\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@evenx\endcsname + \@dodynamicbbox{#1}\hss + }% + \ignorespaces + \fi + \else + \expandafter\raise\csname @df@\romannumeral#1@posy\endcsname + \hb@xt@\z@ + {% + \expandafter\kern \csname @df@\romannumeral#1@posx\endcsname + \@dodynamicbbox{#1}\hss + }% + \ignorespaces + \fi + \fi +} \newcommand*{\@@doheader}{% -\setlength\@ff@tmp@y{\textheight}% -\addtolength{\@ff@tmp@y}{\headsep}% -\def\ff@col{}% -\def\ff@txtcol{}% -\def\ff@backcol{{none}}% -\@ff@box{0pt}{\@ff@tmp@y}{\makebox[0pt][l]{\@dothehead}}% + \setlength\@ff@tmp@y{\textheight}% + \addtolength{\@ff@tmp@y}{\headsep}% + \def\ff@col{}% + \def\ff@txtcol{}% + \def\ff@backcol{{none}}% + \@ff@box{0pt}{\@ff@tmp@y}{\makebox[0pt][l]{\@dothehead}}% } \newcommand*{\@@dofooter}{% -\setlength\@ff@tmp@y{-\footskip}% -\def\ff@col{}% -\def\ff@txtcol{}% -\def\ff@backcol{{none}}% -\@ff@box{0pt}{\@ff@tmp@y}{\makebox[0pt][l]{\@dothefoot}}% -} -\newcommand{\@s@tfr@mes}[1]{{\@picht\textheight -\setbox\@picbox\hb@xt@ \textwidth -\bgroup \hbox \bgroup #1\relax -\egroup -\hss \egroup -\ht\@picbox\@picht \dp\@picbox -\z@ \mbox{\box \@picbox}}} + \setlength\@ff@tmp@y{-\footskip}% + \def\ff@col{}% + \def\ff@txtcol{}% + \def\ff@backcol{{none}}% + \@ff@box{0pt}{\@ff@tmp@y}{\makebox[0pt][l]{\@dothefoot}}% +} +\newcommand{\@s@tfr@mes}[1]{% + {% + \@picht\textheight + \setbox\@picbox\hb@xt@ \textwidth + \bgroup + \hbox + \bgroup + #1\relax + \egroup + \hss + \egroup + \ht\@picbox\@picht + \dp\@picbox\z@ + \mbox{\box\@picbox}% + }% +} \newcommand*{\@ff@doallflowframes}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\@putcolbox{\@colN}}% + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \@putcolbox{\@colN}% + }% } \newcommand*{\@ff@doallflowframesbbox}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxflow}{\advance\@colN by 1\relax -\@putcolbbox{\@colN}}% + \@colN=0\relax + \whiledo{\@colN<\c@maxflow}% + {% + \advance\@colN by 1\relax + \@putcolbbox{\@colN}% + }% } \newcommand*{\@ff@doallstatics}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\@putstaticbox{\@colN}}% + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \@putstaticbox{\@colN}% + }% } \newcommand*{\@ff@doallstaticsbbox}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxstatic}{\advance\@colN by 1\relax -\@putstaticbbox{\@colN}}% + \@colN=0\relax + \whiledo{\@colN<\c@maxstatic}% + {% + \advance\@colN by 1\relax + \@putstaticbbox{\@colN}% + }% } \newcommand*{\@ff@doalldynamics}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\@putdynamicbox{\@colN}}% + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \@putdynamicbox{\@colN}% + }% } \newcommand*{\@ff@doalldynamicsbbox}{% -\@colN=0\relax -\whiledo{\@colN<\c@maxdynamic}{\advance\@colN by 1\relax -\@putdynamicbbox{\@colN}}% + \@colN=0\relax + \whiledo{\@colN<\c@maxdynamic}% + {% + \advance\@colN by 1\relax + \@putdynamicbbox{\@colN}% + }% } \newcommand*{\@ff@dotypeblock}{% -\makebox[0pt][l]{\@fr@meifdraft[\setffdrafttypeblockcolor]{% -\vbox to \textheight{\hbox to \textwidth{}}}{}}} + \makebox[0pt][l]% + {% + \@fr@meifdraft[\setffdrafttypeblockcolor]% + {% + \vbox to \textheight{\hbox to \textwidth{}}% + }% + {}% + }% +} \newlength\ffevenoffset \newcommand*{\@ff@do@allframes}{% -\ffevenoffset=0pt\relax -\if@twoside - \ifodd\c@page - \else - \ffevenoffset=-\oddsidemargin\relax - \advance\ffevenoffset by \evensidemargin\relax - \kern\ffevenoffset\relax + \ffevenoffset=0pt\relax + \if@twoside + \ifodd\c@page + \else + \ffevenoffset=-\oddsidemargin\relax + \advance\ffevenoffset by \evensidemargin\relax + \kern\ffevenoffset\relax + \fi \fi -\fi -\setlength{\@ff@tmp@x}{\textwidth}% -\advance\@ff@tmp@x by -\ffevenoffset\relax -\makebox[\@ff@tmp@x][l]{% -\@s@tfr@mes{% -\@ff@doallstatics -\@@doheader -\@@dofooter -\@ff@doallflowframes -\@ff@doalldynamics -\ifshowtypeblock - \@ff@dotypeblock -\fi -\ifshowframebbox - \@ff@doallstaticsbbox - \@ff@doallflowframesbbox - \@ff@doalldynamicsbbox -\fi -\ifshowmargins - \@ff@drawmargins -\fi -}}} + \setlength{\@ff@tmp@x}{\textwidth}% + \advance\@ff@tmp@x by -\ffevenoffset\relax + \makebox[\@ff@tmp@x][l]% + {% + \@s@tfr@mes + {% + \@ff@doallstatics + \@@doheader + \@@dofooter + \@ff@doallflowframes + \@ff@doalldynamics + \ifshowtypeblock + \@ff@dotypeblock + \fi + \ifshowframebbox + \@ff@doallstaticsbbox + \@ff@doallflowframesbbox + \@ff@doalldynamicsbbox + \fi + \ifshowmargins + \@ff@drawmargins + \fi + }% + }% +} \newcount\@nxtcol \def\@outputdblcol{% -\@nxtcol=\c@thisframe -\c@curpg=\c@page -\@g@tnextcol{\@nxtcol}% -\if@ff@nwpg % next flow frame starts on new page - \global\@firstcolumntrue - \@setcolbox\c@thisframe - \if@specialpage - \global\@specialpagefalse - \@nameuse{ps@\@specialstyle}\relax - \fi - \if@twoside - \ifodd\count\z@ + \@nxtcol=\c@thisframe + \c@curpg=\@ff@pages@countreg + \@g@tnextcol{\@nxtcol}% + \if@ff@nwpg + \global\@firstcolumntrue + \@setcolbox\c@thisframe + \if@specialpage + \global\@specialpagefalse + \@nameuse{ps@\@specialstyle}\relax + \fi + \if@twoside + \ifodd\count\z@ + \let\@thehead\@oddhead + \let\@thefoot\@oddfoot + \else + \let\@thehead\@evenhead + \let\@thefoot\@evenfoot + \fi + \else \let\@thehead\@oddhead \let\@thefoot\@oddfoot - \else - \let\@thehead\@evenhead - \let\@thefoot\@evenfoot \fi + \@begindvi + \@dodynamicthehead\@dodynamicthefoot + \vbadness=\@M + \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% + \@combinedblfloats + \@outputpage + \advance\c@curpg by -\@ff@pages@countreg\relax + \whiledo{\c@curpg>0}% + {% + \advance\c@curpg by -1\relax + \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% + \@outputpage + } + \begingroup + \@dblfloatplacement + \@startdblcolumn + \@whilesw \if@fcolmade \fi + {\@outputpage \@startdblcolumn }% + \endgroup + \@resetst@tics + \@resetdyn@mics \else - \let\@thehead\@oddhead - \let\@thefoot\@oddfoot - \fi - \@begindvi - \@dodynamicthehead\@dodynamicthefoot - \vbadness=\@M - \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% - \@combinedblfloats - \@outputpage -\advance\c@curpg by -\c@page\relax - \whiledo{\c@curpg>0}{\advance\c@curpg by -1\relax - \setbox\@outputbox\vbox{\hbox to \textwidth{\@ff@do@allframes}}% -\@outputpage} - \begingroup - \@dblfloatplacement - \@startdblcolumn - \@whilesw \if@fcolmade \fi - {\@outputpage \@startdblcolumn }\endgroup - \@resetst@tics - \@resetdyn@mics -\else % still on same page, save contents of box255 - \global\@firstcolumnfalse - \@setcolbox\c@thisframe -\fi -\global\c@thisframe=\@nxtcol -\@setcol{\c@thisframe}\relax -\global\@colht\vsize + \global\@firstcolumnfalse + \@setcolbox\c@thisframe + \fi + \global\c@thisframe=\@nxtcol + \@setcol{\c@thisframe}\relax + \global\@colht\vsize } \def\@dblfloatplacement{% \global\@dbltopnum\c@dbltopnumber \global\@dbltoproom\dbltopfraction\@colht\@textmin \@colht\advance\@textmin -\@dbltoproom \@fpmin\dblfloatpagefraction\vsize - \@fptop \@dblfptop \@fpsep \@dblfpsep \@fpbot \@dblfpbot} + \@fptop \@dblfptop \@fpsep \@dblfpsep \@fpbot \@dblfpbot +} \newenvironment{statictable}{\def\@captype{table}}{} \newenvironment{staticfigure}{\def\@captype{figure}}{} \newif\ifffvadjust \ffvadjusttrue \renewcommand*{\onecolumn}{\@onecolumn} \newcommand*{\@onecolumn}[1][all]{% -\@onecolumninarea[#1]{\textwidth}{\textheight}{0pt}{0pt}} + \@onecolumninarea[#1]{\textwidth}{\textheight}{0pt}{0pt}% +} \newlength\columnheight \newcommand*{\onecolumninarea}{\@onecolumninarea} \@onlypreamble{\onecolumninarea} \newcommand*{\@onecolumninarea}[5][all]{% -\setlength{\columnheight}{#3}% -\ifffvadjust\adjustheight{\columnheight}\fi% -\@n@wflowframe[#1]{#2}{\columnheight}{#4}{#5}} + \setlength{\columnheight}{#3}% + \ifffvadjust + \adjustheight{\columnheight}% + \fi + \@n@wflowframe[#1]{#2}{\columnheight}{#4}{#5}% +} \renewcommand*{\twocolumn}{\@twocolumn} \newcommand*{\@twocolumn}[1][all]{% -\@twocolumninarea[#1]{\textwidth}{\textheight}{0pt}{0pt}} + \@twocolumninarea[#1]{\textwidth}{\textheight}{0pt}{0pt}% +} \newcommand*{\twocolumninarea}{\@twocolumninarea} \@onlypreamble{\twocolumninarea} \newcommand*{\@twocolumninarea}[5][all]{% \setlength{\columnheight}{#3}% - \ifffvadjust\adjustheight{\columnheight}\fi% + \ifffvadjust + \adjustheight{\columnheight}% + \fi \setlength{\columnwidth}{#2}% \addtolength{\columnwidth}{-\columnsep}% \divide\columnwidth by 2\relax @@ -3038,27 +5904,36 @@ adding new one}% \fi } \newcommand*{\Ncolumn}[2][all]{% -\Ncolumninarea[#1]{#2}{\textwidth}{\textheight}{0pt}{0pt}} + \Ncolumninarea[#1]{#2}{\textwidth}{\textheight}{0pt}{0pt}% +} \@onlypreamble{\Ncolumn} \newcommand*{\Ncolumninarea}[6][all]{% -\ifnum#2>2\relax - \@Ncolumninarea[#1]{#2}{#3}{#4}{#5}{#6}% -\else - \ifcase#2\relax - \PackageError{flowfram}{% - You have requested 0 flowframes!}{% - It does not make much sense to ask to create 0 flow frames}% - \or - \onecolumninarea[#1]{#3}{#4}{#5}{#6}% - \or - \twocolumninarea[#1]{#3}{#4}{#5}{#6}% + \ifnum#2>2\relax + \@Ncolumninarea[#1]{#2}{#3}{#4}{#5}{#6}% \else - \PackageError{flowfram}{% - Can't create a negative number of flow frames!}{% - You have asked for \number#2 \space flow frames - which really doesn't make sense}% + \ifcase#2\relax + \PackageError{flowfram}% + {% + You have requested 0 flowframes!% + }% + {% + It does not make much sense to ask to create 0 flow frames% + }% + \or + \onecolumninarea[#1]{#3}{#4}{#5}{#6}% + \or + \twocolumninarea[#1]{#3}{#4}{#5}{#6}% + \else + \PackageError{flowfram}% + {% + Can't create a negative number of flow frames!% + }% + {% + You have asked for \number#2 \space flow frames + which really doesn't make sense% + }% + \fi \fi -\fi } \@onlypreamble{\Ncolumninarea} @@ -3093,48 +5968,73 @@ adding new one}% \newlength{\vcolumnsep} \setlength{\vcolumnsep}{\columnsep} \newcommand*{\onecolumntop}[3][all]{% -\onecolumntopinarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} + \onecolumntopinarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}% +} \@onlypreamble{\onecolumntop} \newcommand*{\onecolumnStop}[2][all]{% -\onecolumntopinarea[#1]{static}{#2}{\textwidth}{\textheight}{0pt}{0pt}} + \onecolumntopinarea[#1]{static}{#2}{\textwidth}{\textheight}{0pt}{0pt}% +} \newcommand*{\onecolumnDtop}[2][all]{% -\onecolumntopinarea[#1]{dynamic}{#2}{\textwidth}{\textheight}{0pt}{0pt}} + \onecolumntopinarea[#1]{dynamic}{#2}{\textwidth}{\textheight}{0pt}{0pt}% +} \newcommand*{\newframe}[6][all]{% -\ifthenelse{\equal{#2}{flow}}{% -\@n@wflowframe[#1]{#3}{#4}{#5}{#6}% -}{% -\ifthenelse{\equal{#2}{dynamic}}{% -\@n@wdynamicframe[#1]{#3}{#4}{#5}{#6}}{% -\ifthenelse{\equal{#2}{static}}{% -\@n@wstaticframe[#1]{#3}{#4}{#5}{#6}}{% -\PackageError{flowfram}{Unknown frame type '#2'}{% -Available frame types are: 'flow', 'static' and 'dynamic'}}}}} + \ifthenelse{\equal{#2}{flow}}% + {% + \@n@wflowframe[#1]{#3}{#4}{#5}{#6}% + }% + {% + \ifthenelse{\equal{#2}{dynamic}}% + {% + \@n@wdynamicframe[#1]{#3}{#4}{#5}{#6}% + }% + {% + \ifthenelse{\equal{#2}{static}}% + {% + \@n@wstaticframe[#1]{#3}{#4}{#5}{#6}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#2'}% + {% + Available frame types are: 'flow', 'static' and 'dynamic'% + }% + }% + }% + }% +} \newlength\@ff@staticH \newcommand*{\onecolumntopinarea}[7][all]{% -\setlength{\@ff@staticH}{#3}% -\setlength{\@ff@tmp@y}{#5}% -\addtolength{\@ff@tmp@y}{-\@ff@staticH}% -\setlength{\columnheight}{\@ff@tmp@y}% -\addtolength{\columnheight}{-\vcolumnsep}% -\ifffvadjust\adjustheight{\columnheight}\fi% -\addtolength{\@ff@tmp@y}{#7}% -\newframe[#1]{#2}{#4}{\@ff@staticH}{#6}{\@ff@tmp@y}% -\@n@wflowframe[#1]{#4}{\columnheight}{#6}{#7}% + \setlength{\@ff@staticH}{#3}% + \setlength{\@ff@tmp@y}{#5}% + \addtolength{\@ff@tmp@y}{-\@ff@staticH}% + \setlength{\columnheight}{\@ff@tmp@y}% + \addtolength{\columnheight}{-\vcolumnsep}% + \ifffvadjust + \adjustheight{\columnheight}% + \fi + \addtolength{\@ff@tmp@y}{#7}% + \newframe[#1]{#2}{#4}{\@ff@staticH}{#6}{\@ff@tmp@y}% + \@n@wflowframe[#1]{#4}{\columnheight}{#6}{#7}% } \@onlypreamble{\onecolumntopinarea} \newcommand*{\onecolumnStopinarea}[6][all]{% -\onecolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}} + \onecolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}% +} \newcommand*{\onecolumnDtopinarea}[6][all]{% -\onecolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}} + \onecolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}% +} \newcommand*{\twocolumntop}[3][all]{% -\twocolumntopinarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} + \twocolumntopinarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}% +} \@onlypreamble{\twocolumntop} \newcommand*{\twocolumnStop}[2][all]{% -\@twocolumntopinarea[#1]{static}{#2}{\textwidth}{\textheight}{0pt}{0pt}} + \@twocolumntopinarea[#1]{static}{#2}{\textwidth}{\textheight}{0pt}{0pt}% +} \newcommand*{\twocolumnDtop}[2][all]{% -\twocolumntop[#1]{dynamic}{#2}} + \twocolumntop[#1]{dynamic}{#2}% +} \newcommand*{\twocolumntopinarea}{\@twocolumntopinarea} \newcommand*{\@twocolumntopinarea}[7][all]{% \setlength{\@ff@staticH}{#3}% @@ -3168,35 +6068,48 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} } \@onlypreamble{\twocolumntopinarea} \newcommand*{\twocolumnStopinarea}[6][all]{% -\twocolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}} + \twocolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}% +} \newcommand*{\twocolumnDtopinarea}[6][all]{% -\twocolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}} + \twocolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}% +} \newcommand*{\Ncolumntop}[4][all]{% -\Ncolumntopinarea[#1]{#2}{#3}{#4}{\textwidth}{\textheight}{0pt}{0pt}} + \Ncolumntopinarea[#1]{#2}{#3}{#4}{\textwidth}{\textheight}{0pt}{0pt}% +} \@onlypreamble{\Ncolumntop} \newcommand*{\NcolumnStop}[3][all]{% -\Ncolumntop[#1]{static}{#2}{#3}} + \Ncolumntop[#1]{static}{#2}{#3}% +} \newcommand*{\NcolumnDtop}[3][all]{% -\Ncolumntop[#1]{dynamic}{#2}{#3}} + \Ncolumntop[#1]{dynamic}{#2}{#3}% +} \newcommand*{\Ncolumntopinarea}[8][all]{% -\ifnum#3>2\relax - \@Ncolumntopinarea[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% -\else - \ifcase#3\relax - \PackageError{flowfram}{% - You have requested 0 flowframes!}{% - It does not make much sense to ask to create 0 flow frames} - \or - \onecolumntopinarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% - \or - \twocolumntopinarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \ifnum#3>2\relax + \@Ncolumntopinarea[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% \else - \PackageError{flowfram}{% - Can't create a negative number of flow frames!}{% - You have asked for \number#3 \space flow frames - which really doesn't make sense}% + \ifcase#3\relax + \PackageError{flowfram}% + {% + You have requested 0 flowframes!% + }% + {% + It does not make much sense to ask to create 0 flow frames% + }% + \or + \onecolumntopinarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \or + \twocolumntopinarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \else + \PackageError{flowfram}% + {% + Can't create a negative number of flow frames!% + }% + {% + You have asked for \number#3 \space flow frames + which really doesn't make sense% + }% + \fi \fi -\fi } \@onlypreamble{\Ncolumntopinarea} \newcommand*{\@Ncolumntopinarea}[8][all]{% @@ -3207,7 +6120,9 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} \addtolength{\@ff@tmp@y}{#8}% \newframe[#1]{#2}{#5}{\@ff@staticH}{#7}{\@ff@tmp@y}% \addtolength{\columnheight}{-\vcolumnsep}% - \ifffvadjust\adjustheight{\columnheight}\fi% + \ifffvadjust + \adjustheight{\columnheight}% + \fi \@colN=#3\relax \advance\@colN by -1\relax \setlength{\columnwidth}{#5}% @@ -3234,22 +6149,29 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} \repeat } \newcommand*{\NcolumnStopinarea}[7][all]{% -\Ncolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}{#7}} + \Ncolumntopinarea[#1]{static}{#2}{#3}{#4}{#5}{#6}{#7}% +} \newcommand*{\NcolumnDtopinarea}[7][all]{% -\Ncolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}{#7}} + \Ncolumntopinarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}{#7}% +} \newcommand*{\onecolumnbottom}[3][all]{% -\onecolumnbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} + \onecolumnbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}% +} \@onlypreamble{\onecolumnbottom} \newcommand*{\onecolumnSbottom}[2][all]{% -\onecolumnbottom[#1]{static}{#2}} + \onecolumnbottom[#1]{static}{#2}% +} \newcommand*{\onecolumnDbottom}[2][all]{% -\onecolumnbottom[#1]{dynamic}{#2}} + \onecolumnbottom[#1]{dynamic}{#2}% +} \newcommand*{\onecolumnbottominarea}[7][all]{% \setlength{\@ff@staticH}{#3}% \setlength{\columnheight}{#5}% \addtolength{\columnheight}{-\@ff@staticH}% \addtolength{\columnheight}{-\vcolumnsep}% - \ifffvadjust\adjustheight{\columnheight}\fi% + \ifffvadjust + \adjustheight{\columnheight}% + \fi \setlength{\@ff@tmp@y}{#5}% \addtolength{\@ff@tmp@y}{-\columnheight}% \addtolength{\@ff@tmp@y}{#7}% @@ -3258,16 +6180,21 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} } \@onlypreamble{\onecolumnbottominarea} \newcommand*{\onecolumnSbottominarea}[6][all]{% -\onecolumnbottominarea[#1]{static}{#2}{#3}{#4}{#5}{#6}} + \onecolumnbottominarea[#1]{static}{#2}{#3}{#4}{#5}{#6}% +} \newcommand*{\onecolumnDbottominarea}[6][all]{% -\onecolumnbottominarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}} + \onecolumnbottominarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}% +} \newcommand*{\twocolumnbottom}[3][all]{% -\twocolumnSbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}} + \twocolumnSbottominarea[#1]{#2}{#3}{\textwidth}{\textheight}{0pt}{0pt}% +} \@onlypreamble{\twocolumnbottom} \newcommand*{\twocolumnSbottom}[2][all]{% -\twocolumnbottom[#1]{static}{#2}} + \twocolumnbottom[#1]{static}{#2}% +} \newcommand*{\twocolumnDbottom}[2][all]{% -\twocolumnbottom[#1]{dynamic}{#2}} + \twocolumnbottom[#1]{dynamic}{#2}% +} \newcommand*{\twocolumnbottominarea}[7][all]{% \setlength{\@ff@staticW}{#4}% \setlength{\@ff@staticH}{#3}% @@ -3304,35 +6231,44 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} } \@onlypreamble{\twocolumnbottominarea} \newcommand*{\twocolumnSbottominarea}[6][all]{% -\twocolumnbottominarea[#1]{static}{#2}{#3}{#4}{#5}{#6}} + \twocolumnbottominarea[#1]{static}{#2}{#3}{#4}{#5}{#6}% +} \newcommand*{\twocolumnDbottominarea}[6][all]{% -\twocolumnbottominarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}} + \twocolumnbottominarea[#1]{dynamic}{#2}{#3}{#4}{#5}{#6}% +} \newcommand*{\Ncolumnbottom}[4][all]{% -\Ncolumnbottominarea[#1]{#2}{#3}{#4}{\textwidth}{\textheight}{0pt}{0pt}} + \Ncolumnbottominarea[#1]{#2}{#3}{#4}{\textwidth}{\textheight}{0pt}{0pt}% +} \@onlypreamble{\Ncolumnbottom} \newcommand*{\NcolumnSbottom}[3][all]{% -\Ncolumnbottom[#1]{static}{#2}{#3}} + \Ncolumnbottom[#1]{static}{#2}{#3}% +} \newcommand*{\NcolumnDbottom}[3][all]{% -\Ncolumnbottom[#1]{dynamic}{#2}{#3}} + \Ncolumnbottom[#1]{dynamic}{#2}{#3}% +} \newcommand*{\Ncolumnbottominarea}[8][all]{% -\ifnum#3>2\relax - \@Ncolumnbottominarea[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% -\else - \ifcase#3\relax - \PackageError{flowfram}{% - You have requested 0 flowframes!}{% - It does not make much sense to ask to create 0 flow frames} - \or - \onecolumnbottominarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% - \or - \twocolumnbottominarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \ifnum#3>2\relax + \@Ncolumnbottominarea[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% \else - \PackageError{flowfram}{% - Can't create a negative number of flow frames!}{% - You have asked for \number#3 \space flow frames - which really doesn't make sense}% + \ifcase#3\relax + \PackageError{flowfram}{% + You have requested 0 flowframes!}{% + It does not make much sense to ask to create 0 flow frames} + \or + \onecolumnbottominarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \or + \twocolumnbottominarea[#1]{#2}{#4}{#5}{#6}{#7}{#8}% + \else + \PackageError{flowfram}% + {% + Can't create a negative number of flow frames!% + }% + {% + You have asked for \number#3 \space flow frames + which really doesn't make sense% + }% + \fi \fi -\fi } \@onlypreamble{\Ncolumnbottominarea} \newcommand*{\@NcolumnSbottominarea}[8][all]{% @@ -3340,7 +6276,9 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} \setlength{\columnheight}{#6}% \addtolength{\columnheight}{-\@ff@staticH}% \addtolength{\columnheight}{-\vcolumnsep}% - \ifffvadjust\adjustheight{\columnheight}\fi + \ifffvadjust + \adjustheight{\columnheight}% + \fi \newframe[#1]{#2}{#5}{\@ff@staticH}{#7}{#8}% \setlength{\@ff@tmp@y}{#6}% \addtolength{\@ff@tmp@y}{-\columnheight}% @@ -3372,259 +6310,311 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} \repeat } \newcommand*{\NcolumnSbottominarea}[1][all]{% -\Ncolumnbottominarea[#1]{static}} + \Ncolumnbottominarea[#1]{static}% +} \newcommand*{\NcolumnDbottominarea}[1][all]{% -\Ncolumnbottominarea[#1]{dynamic}} + \Ncolumnbottominarea[#1]{dynamic}% +} \newcount\@ff@adjh \newcommand*{\adjustheight}[1]{% -\@ff@adjh=#1\relax -\divide\@ff@adjh by \baselineskip\relax -#1=\baselineskip\relax -\multiply#1 by \@ff@adjh\relax + \@ff@adjh=#1\relax + \divide\@ff@adjh by \baselineskip\relax + #1=\baselineskip\relax + \multiply#1 by \@ff@adjh\relax } \newcommand*{\adjustcolsep}{% -\multiply\columnsep by 2\relax -\addtolength{\columnsep}{\marginparwidth}} + \multiply\columnsep by 2\relax + \addtolength{\columnsep}{\marginparwidth}% +} \newlength\@ff@staticW \newcommand*{\vtwotone}[1][all]{% -\def\ff@pages{#1}\@vtwotone} + \def\ff@pages{#1}% + \@vtwotone +} \newcommand*{\@vtwotone}[1][0pt]{\@@vtwotonebottom{#1}{\paperheight}} \newcommand*{\@@vtwotonebottom}[8]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@x}{#1}% -\addtolength{\@ff@tmp@x@even}{#1}% -\@nextvband{\ff@pages}{#2}{#3}{#4}{#5}% -\@nextvband{\ff@pages}{#2}{#6}{#7}{#8}% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@x}{#1}% + \addtolength{\@ff@tmp@x@even}{#1}% + \@nextvband{\ff@pages}{#2}{#3}{#4}{#5}% + \@nextvband{\ff@pages}{#2}{#6}{#7}{#8}% } \@onlypreamble{\vtwotone} \newcommand*{\vtwotonebottom}[1][all]{% -\def\ff@pages{#1}\@vtwotonebottom} + \def\ff@pages{#1}% + \@vtwotonebottom +} \@onlypreamble{\vtwotonebottom} \newcommand*{\@vtwotonebottom}[2][0pt]{\@@vtwotonebottom{#1}{#2}} \newcommand*{\vtwotonetop}[1][all]{% -\def\ff@pages{#1}\@vtwotonetop} + \def\ff@pages{#1}% + \@vtwotonetop +} \newcommand*{\@vtwotonetop}[2][0pt]{\@@vtwotonetop{#1}{#2}} \newcommand*{\@@vtwotonetop}[8]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computetopedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{-#2}% -\addtolength{\@ff@tmp@x}{#1}% -\addtolength{\@ff@tmp@x@even}{#1}% -\@nextvband{\ff@pages}{#2}{#3}{#4}{#5}% -\@nextvband{\ff@pages}{#2}{#6}{#7}{#8}% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computetopedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{-#2}% + \addtolength{\@ff@tmp@x}{#1}% + \addtolength{\@ff@tmp@x@even}{#1}% + \@nextvband{\ff@pages}{#2}{#3}{#4}{#5}% + \@nextvband{\ff@pages}{#2}{#6}{#7}{#8}% } \newcommand*{\@nextvband}[5]{% -\setlength{\@ff@staticW}{#3}% -\ifthenelse{\equal{#5}{}}{% -\newstaticframe[#1]{\@ff@staticW}{#2}{\@ff@tmp@x}{\@ff@tmp@y}}% -{\newstaticframe[#1]{\@ff@staticW}{#2}{\@ff@tmp@x}{\@ff@tmp@y}[#5]}% -\expandafter\global\expandafter\setlength - \csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{% - \@ff@tmp@x@even}% -\@setframecol#4\end{\c@maxstatic}{backcol}{sf}% -\addtolength{\@ff@tmp@x}{\@ff@staticW}% -\addtolength{\@ff@tmp@x@even}{\@ff@staticW}% + \setlength{\@ff@staticW}{#3}% + \ifthenelse{\equal{#5}{}}% + {% + \newstaticframe[#1]{\@ff@staticW}{#2}{\@ff@tmp@x}{\@ff@tmp@y}% + }% + {% + \newstaticframe[#1]{\@ff@staticW}{#2}{\@ff@tmp@x}{\@ff@tmp@y}[#5]% + }% + \expandafter\global\expandafter\setlength + \csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{% + \@ff@tmp@x@even}% + \@setframecol#4\end{\c@maxstatic}{backcol}{sf}% + \addtolength{\@ff@tmp@x}{\@ff@staticW}% + \addtolength{\@ff@tmp@x@even}{\@ff@staticW}% } \newcount\@thisstrip \newcommand*{\vNtone}[1][all]{% -\def\ff@pages{#1}\@vNtone} + \def\ff@pages{#1}% + \@vNtone +} \newcommand*{\@vNtone}[2][0pt]{% -\@@vNtone{#1}{#2}{\paperheight}} + \@@vNtone{#1}{#2}{\paperheight}% +} \newcommand*{\@@vNtone}[3]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@x}{#1}% -\addtolength{\@ff@tmp@x@even}{#1}% -\@thisstrip=#2\relax -\setlength{\@ff@staticH}{#3}% -\@nextvNband% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@x}{#1}% + \addtolength{\@ff@tmp@x@even}{#1}% + \@thisstrip=#2\relax + \setlength{\@ff@staticH}{#3}% + \@nextvNband } \newcommand*{\@nextvNband}{% -\ifnum\@thisstrip>0\relax - \let\flf@next\@@nextvNband -\else - \let\flf@next\relax -\fi -\advance\@thisstrip by -1\relax -\flf@next} + \ifnum\@thisstrip>0\relax + \let\flf@next\@@nextvNband + \else + \let\flf@next\relax + \fi + \advance\@thisstrip by -1\relax + \flf@next +} \newcommand*{\@@nextvNband}[3]{% -\@nextvband{\ff@pages}{\@ff@staticH}{#1}{#2}{#3}\@nextvNband} + \@nextvband{\ff@pages}{\@ff@staticH}{#1}{#2}{#3}% + \@nextvNband +} \@onlypreamble{\vNtone} \newcommand*{\vNtonebottom}[1][all]{% -\def\ff@pages{#1}\@vNtonebottom} + \def\ff@pages{#1}% + \@vNtonebottom +} \@onlypreamble{\vNtonebottom} \newcommand*{\@vNtonebottom}[3][0pt]{% -\@@vNtone{#1}{#2}{#3}} + \@@vNtone{#1}{#2}{#3}% +} \newcommand*{\vNtonetop}[1][all]{% -\def\ff@pages{#1}\@vNtonetop} + \def\ff@pages{#1}% + \@vNtonetop +} \@onlypreamble{\vNtonetop} \newcommand*{\@vNtonetop}[3][0pt]{% -\@@vNtonetop{#1}{#2}{#3}} + \@@vNtonetop{#1}{#2}{#3}% +} \newcommand*{\@@vNtonetop}[3]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computetopedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{-#3}% -\addtolength{\@ff@tmp@x}{#1}% -\addtolength{\@ff@tmp@x@even}{#1}% -\@thisstrip=#2\relax -\setlength{\@ff@staticH}{#3}% -\@nextvNband% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computetopedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{-#3}% + \addtolength{\@ff@tmp@x}{#1}% + \addtolength{\@ff@tmp@x@even}{#1}% + \@thisstrip=#2\relax + \setlength{\@ff@staticH}{#3}% + \@nextvNband% } \newcommand*{\htwotone}[1][all]{% -\def\ff@pages{#1}\@htwotone} + \def\ff@pages{#1}% + \@htwotone +} \newcommand*{\@htwotone}[1][0pt]{\@@htwotoneleft{#1}{\paperwidth}} \newcommand*{\@@htwotoneleft}[8]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{#1}% -\@nexthband{\ff@pages}{#2}{#3}{#4}{#5}% -\@nexthband{\ff@pages}{#2}{#6}{#7}{#8}% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#1}% + \@nexthband{\ff@pages}{#2}{#3}{#4}{#5}% + \@nexthband{\ff@pages}{#2}{#6}{#7}{#8}% } \@onlypreamble{\htwotone} \newcommand*{\htwotoneleft}[1][all]{% -\def\ff@pages{#1}\@htwotoneleft} + \def\ff@pages{#1}% + \@htwotoneleft +} \@onlypreamble{\htwotoneleft} \newcommand*{\@htwotoneleft}[2][0pt]{\@@htwotoneleft{#1}{#2}} \newcommand*{\htwotoneright}[1][all]{% -\def\ff@pages{#1}\@htwotoneright} + \def\ff@pages{#1}% + \@htwotoneright +} \@onlypreamble{\htwotoneright} \newcommand*{\@htwotoneright}[2][0pt]{\@@htwotoneright{#1}{#2}} -\newcommand*{\@@htwotoneright}[8]{% -\computerightedgeodd{\@ff@tmp@x}% -\if@twoside - \computerightedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{#1}% -\addtolength{\@ff@tmp@x}{-#2}% -\addtolength{\@ff@tmp@x@even}{-#2}% -\@nexthband{\ff@pages}{#2}{#3}{#4}{#5}% -\@nexthband{\ff@pages}{#2}{#6}{#7}{#8}% +\newcommand*{\@@htwotoneright}[8]{% + \computerightedgeodd{\@ff@tmp@x}% + \if@twoside + \computerightedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#1}% + \addtolength{\@ff@tmp@x}{-#2}% + \addtolength{\@ff@tmp@x@even}{-#2}% + \@nexthband{\ff@pages}{#2}{#3}{#4}{#5}% + \@nexthband{\ff@pages}{#2}{#6}{#7}{#8}% } \newcommand*{\hNtone}[1][all]{% -\def\ff@pages{#1}\@hNtone} + \def\ff@pages{#1}% + \@hNtone +} \@onlypreamble{\hNtone} \newcommand*{\@hNtone}[2][0pt]{% -\@@hNtone{#1}{#2}{\paperwidth}} + \@@hNtone{#1}{#2}{\paperwidth}% +} \newcommand*{\@@hNtone}[3]{% -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{#1}% -\@thisstrip=#2\relax -\setlength{\@ff@staticW}{#3}% -\@nexthNband% + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#1}% + \@thisstrip=#2\relax + \setlength{\@ff@staticW}{#3}% + \@nexthNband } \newcommand*{\hNtoneleft}[1][all]{% -\def\ff@pages{#1}\@hNtoneleft} + \def\ff@pages{#1}% + \@hNtoneleft +} \@onlypreamble{\hNtoneleft} \newcommand*{\@hNtoneleft}[3][0pt]{% -\@@hNtone{#1}{#2}{#3}} + \@@hNtone{#1}{#2}{#3}% +} \newcommand*{\hNtoneright}[1][all]{% -\def\ff@pages{#1}\@hNtoneright} + \def\ff@pages{#1}% + \@hNtoneright +} \@onlypreamble{\hNtoneright} \newcommand*{\@hNtoneright}[3][0pt]{% -\@@hNtoneright{#1}{#2}{#3}} + \@@hNtoneright{#1}{#2}{#3}% +} \newcommand*{\@@hNtoneright}[3]{% -\computerightedgeodd{\@ff@tmp@x}% -\if@twoside - \computerightedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\addtolength{\@ff@tmp@y}{#1}% -\addtolength{\@ff@tmp@x}{-#3}% -\addtolength{\@ff@tmp@x@even}{-#3}% -\@thisstrip=#2\relax -\setlength{\@ff@staticW}{#3}% -\@nexthNband% + \computerightedgeodd{\@ff@tmp@x}% + \if@twoside + \computerightedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{#1}% + \addtolength{\@ff@tmp@x}{-#3}% + \addtolength{\@ff@tmp@x@even}{-#3}% + \@thisstrip=#2\relax + \setlength{\@ff@staticW}{#3}% + \@nexthNband } \newcommand*{\@nexthband}[5]{% -\setlength{\@ff@staticH}{#3}% -\ifthenelse{\equal{#5}{}}{% -\newstaticframe[#1]{#2}{\@ff@staticH}{\@ff@tmp@x}{\@ff@tmp@y}}% -{\newstaticframe[#1]{#2}{\@ff@staticH}{\@ff@tmp@x}{\@ff@tmp@y}[#5]}% -\expandafter\global\expandafter -\setlength\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname{% -\@ff@tmp@x@even}% -\@setframecol#4\end{\c@maxstatic}{backcol}{sf}% -\addtolength{\@ff@tmp@y}{\@ff@staticH}% + \setlength{\@ff@staticH}{#3}% + \ifthenelse{\equal{#5}{}}% + {% + \newstaticframe[#1]{#2}{\@ff@staticH}{\@ff@tmp@x}{\@ff@tmp@y}% + }% + {% + \newstaticframe[#1]{#2}{\@ff@staticH}{\@ff@tmp@x}{\@ff@tmp@y}[#5]% + }% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname + {\@ff@tmp@x@even}% + \@setframecol#4\end{\c@maxstatic}{backcol}{sf}% + \addtolength{\@ff@tmp@y}{\@ff@staticH}% } \newcommand*{\@nexthNband}{% -\ifnum\@thisstrip>0\relax - \let\flf@next\@@nexthNband% -\else - \let\flf@next\relax% -\fi -\advance\@thisstrip by -1\relax -\flf@next} + \ifnum\@thisstrip>0\relax + \let\flf@next\@@nexthNband + \else + \let\flf@next\relax + \fi + \advance\@thisstrip by -1\relax + \flf@next +} \newcommand*{\@@nexthNband}[3]{% -\@nexthband{\ff@pages}{\@ff@staticW}{#1}{#2}{#3}\@nexthNband} + \@nexthband{\ff@pages}{\@ff@staticW}{#1}{#2}{#3}% + \@nexthNband +} \newcommand*{\makebackgroundframe}[1][all]{% -\ifnum\c@maxstatic>0\relax - \PackageWarning{flowfram}{Background frame is not - first static frame to be defined. All previously defined - static frames may be obscured.}% -\fi -\computeleftedgeodd{\@ff@tmp@x}% -\if@twoside - \computeleftedgeeven{\@ff@tmp@x@even}% -\else - \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% -\fi -\computebottomedge{\@ff@tmp@y}% -\newstaticframe[#1]{\paperwidth}{\paperheight}{\@ff@tmp@x}% -{\@ff@tmp@y}% -\expandafter\global\expandafter -\setlength\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname -{\@ff@tmp@x@even}} + \ifnum\c@maxstatic>0\relax + \PackageWarning{flowfram}% + {% + Background frame is not first static frame to be + defined. All previously defined static frames may be + obscured.% + }% + \fi + \computeleftedgeodd{\@ff@tmp@x}% + \if@twoside + \computeleftedgeeven{\@ff@tmp@x@even}% + \else + \setlength{\@ff@tmp@x@even}{\@ff@tmp@x}% + \fi + \computebottomedge{\@ff@tmp@y}% + \newstaticframe[#1]{\paperwidth}{\paperheight}{\@ff@tmp@x}% + {\@ff@tmp@y}% + \expandafter\global\expandafter + \setlength\csname @sf@\romannumeral\c@maxstatic @evenx\endcsname + {\@ff@tmp@x@even}% +} \newlength\ffcolumnseprule \setlength{\ffcolumnseprule}{2pt} \newcommand*{\ffruledeclarations}{} \newcommand*{\insertvrule}{\@ifstar\@sinsertvrule\@insertvrule} \newcommand*{\@insertvrule}[1][0pt]{% -\@ifnextchar[{\@@insertvrule[#1]}{\@@insertvrule[#1][0pt]}} + \@ifnextchar[{\@@insertvrule[#1]}{\@@insertvrule[#1][0pt]}% +} \newlength\@ff@left@x \newlength\@ff@left@y \newlength\@ff@left@evenx @@ -3632,592 +6622,908 @@ Available frame types are: 'flow', 'static' and 'dynamic'}}}}} \newlength\@ff@left@width \newlength\@ff@left@height \def\@@insertvrule[#1][#2]#3#4#5#6{% -\ifthenelse{\equal{#3}{flow}}{% -\def\@ff@type@i{1}}{\ifthenelse{\equal{#3}{static}}{% -\def\@ff@type@i{2}}{\ifthenelse{\equal{#3}{dynamic}}{% -\def\@ff@type@i{3}}{\PackageError{flowfram}{Unknown frame -type '#3'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\ifthenelse{\equal{#5}{flow}}{% -\def\@ff@type@ii{1}}{\ifthenelse{\equal{#5}{static}}{% -\def\@ff@type@ii{2}}{\ifthenelse{\equal{#5}{dynamic}}{% -\def\@ff@type@ii{3}}{\PackageError{flowfram}{Unknown frame -type '#5'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\@@insert@vrule{#1}{#2}{\@ff@type@i}{#4}{\@ff@type@ii}{#6}% + \ifthenelse{\equal{#3}{flow}}% + {% + \def\@ff@type@i{1}% + }% + {% + \ifthenelse{\equal{#3}{static}}% + {% + \def\@ff@type@i{2}% + }% + {% + \ifthenelse{\equal{#3}{dynamic}}% + {% + \def\@ff@type@i{3}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#3'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \ifthenelse{\equal{#5}{flow}}% + {% + \def\@ff@type@ii{1}% + }% + {% + \ifthenelse{\equal{#5}{static}}% + {% + \def\@ff@type@ii{2}% + }% + {% + \ifthenelse{\equal{#5}{dynamic}}% + {% + \def\@ff@type@ii{3}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#5'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \@@insert@vrule{#1}{#2}{\@ff@type@i}{#4}{\@ff@type@ii}{#6}% } \newcommand*{\@@insert@vrule}[6]{% -\@ff@getdim{#3}{#4}% -\setlength{\@ff@left@x}{\ffareax}% -\setlength{\@ff@left@y}{\ffareay}% -\setlength{\@ff@left@width}{\ffareawidth}% -\setlength{\@ff@left@height}{\ffareaheight}% -\@ff@getdim{#5}{#6}% -\ifnum\@ff@left@x>\ffareax\relax - \@ff@swaplen{\@ff@left@x}{\ffareax}% - \@ff@swaplen{\@ff@left@y}{\ffareax}% - \@ff@swaplen{\@ff@left@evenx}{\ffareaevenx}% - \@ff@swaplen{\@ff@left@eveny}{\ffareaevenx}% - \@ff@swaplen{\@ff@left@width}{\ffareawidth}% - \@ff@swaplen{\@ff@left@height}{\ffareaheight}% -\fi -\setlength{\@ff@tmp@x}{\@ff@left@x} -\addtolength{\@ff@tmp@x}{\@ff@left@width}% -\setlength{\@ff@staticW}{\ffareax}% -\addtolength{\@ff@staticW}{-\@ff@tmp@x}% -\setlength{\@ff@staticH}{\@ff@left@y}% -\addtolength{\@ff@staticH}{\@ff@left@height}% -\setlength{\@ff@tmp@y}{\ffareay}% -\addtolength{\@ff@tmp@y}{\ffareaheight}% -\ifnum\@ff@tmp@y>\@ff@staticH - \setlength{\@ff@staticH}{\@ff@tmp@y}% -\fi -\ifnum\@ff@left@y<\ffareay\relax - \setlength{\@ff@tmp@y}{\@ff@left@y}% -\else + \@ff@getdim{#3}{#4}% + \setlength{\@ff@left@x}{\ffareax}% + \setlength{\@ff@left@y}{\ffareay}% + \setlength{\@ff@left@width}{\ffareawidth}% + \setlength{\@ff@left@height}{\ffareaheight}% + \@ff@getdim{#5}{#6}% + \ifnum\@ff@left@x>\ffareax\relax + \@ff@swaplen{\@ff@left@x}{\ffareax}% + \@ff@swaplen{\@ff@left@y}{\ffareax}% + \@ff@swaplen{\@ff@left@evenx}{\ffareaevenx}% + \@ff@swaplen{\@ff@left@eveny}{\ffareaevenx}% + \@ff@swaplen{\@ff@left@width}{\ffareawidth}% + \@ff@swaplen{\@ff@left@height}{\ffareaheight}% + \fi + \setlength{\@ff@tmp@x}{\@ff@left@x} + \addtolength{\@ff@tmp@x}{\@ff@left@width}% + \setlength{\@ff@staticW}{\ffareax}% + \addtolength{\@ff@staticW}{-\@ff@tmp@x}% + \setlength{\@ff@staticH}{\@ff@left@y}% + \addtolength{\@ff@staticH}{\@ff@left@height}% \setlength{\@ff@tmp@y}{\ffareay}% -\fi -\addtolength{\@ff@staticH}{-\@ff@tmp@y}% -\newstaticframe{\@ff@staticW}{\@ff@staticH}% -{\@ff@tmp@x}{\@ff@tmp@y}% -\addtolength{\@ff@staticH}{#1}% -\addtolength{\@ff@staticH}{#2}% -\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}% -\or \edef\@ff@pages{\csname @df@pages@\romannumeral#4\endcsname}% -\fi -\setstaticframe{\c@maxstatic}{pages=\@ff@pages}% -\addtolength{\@ff@tmp@x}{\@ff@left@evenx}% -\addtolength{\@ff@tmp@x}{-\@ff@left@x}% -\addtolength{\@ff@tmp@y}{\@ff@left@eveny}% -\addtolength{\@ff@tmp@y}{-\@ff@left@y}% -\setstaticframe{\c@maxstatic}{evenx=\@ff@tmp@x,eveny=\@ff@tmp@y}% + \addtolength{\@ff@tmp@y}{\ffareaheight}% + \ifnum\@ff@tmp@y>\@ff@staticH + \setlength{\@ff@staticH}{\@ff@tmp@y}% + \fi + \ifnum\@ff@left@y<\ffareay\relax + \setlength{\@ff@tmp@y}{\@ff@left@y}% + \else + \setlength{\@ff@tmp@y}{\ffareay}% + \fi + \addtolength{\@ff@staticH}{-\@ff@tmp@y}% + \newstaticframe{\@ff@staticW}{\@ff@staticH}% + {\@ff@tmp@x}{\@ff@tmp@y}% + \addtolength{\@ff@staticH}{#1}% + \addtolength{\@ff@staticH}{#2}% + \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}% + \or \edef\@ff@pages{\csname @df@pages@\romannumeral#4\endcsname}% + \fi + \setstaticframe{\c@maxstatic}{pages=\@ff@pages}% + \addtolength{\@ff@tmp@x}{\@ff@left@evenx}% + \addtolength{\@ff@tmp@x}{-\@ff@left@x}% + \addtolength{\@ff@tmp@y}{\@ff@left@eveny}% + \addtolength{\@ff@tmp@y}{-\@ff@left@y}% + \setstaticframe{\c@maxstatic}{evenx=\@ff@tmp@x,eveny=\@ff@tmp@y}% } \newcommand*{\ffvrule}[3]{% -\hfill \rule[-#1]{#2}{#3}\hfill\mbox{}} + \hfill \rule[-#1]{#2}{#3}\hfill\mbox{}% +} \newcommand*{\@sinsertvrule}[1][0pt]{% -\@ifnextchar[{\@@sinsertvrule[#1]}{\@@sinsertvrule[#1][0pt]}} + \@ifnextchar[{\@@sinsertvrule[#1]}{\@@sinsertvrule[#1][0pt]}% +} \def\@@sinsertvrule[#1][#2]#3#4#5#6{% -\ifthenelse{\equal{#3}{flow}}{% -\def\@ff@type@i{1}\@flowframeid{#4}\@ff@tmpN=\ff@id}{% -\ifthenelse{\equal{#3}{static}}{% -\def\@ff@type@i{2}\@staticframeid{#4}\@ff@tmpN=\ff@id}{% -\ifthenelse{\equal{#3}{dynamic}}{% -\def\@ff@type@i{3}\@dynamicframeid{#4}\@ff@tmpN=\ff@id}{% -\PackageError{flowfram}{Unknown frame -type '#3'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\ifthenelse{\equal{#5}{flow}}{% -\def\@ff@type@ii{1}\@flowframeid{#6}}{% -\ifthenelse{\equal{#5}{static}}{% -\def\@ff@type@ii{2}\@staticframeid{#6}}{% -\ifthenelse{\equal{#5}{dynamic}}{% -\def\@ff@type@ii{3}\@dynamicframeid{#6}}{% -\PackageError{flowfram}{Unknown frame -type '#5'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\@@insert@vrule{#1}{#2}{\@ff@type@i}{\@ff@tmpN}% -{\@ff@type@ii}{\ff@id}% + \ifthenelse{\equal{#3}{flow}}% + {% + \def\@ff@type@i{1}% + \@flowframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \ifthenelse{\equal{#3}{static}}% + {% + \def\@ff@type@i{2}\@staticframeid{#4}\@ff@tmpN=\ff@id + }% + {% + \ifthenelse{\equal{#3}{dynamic}}% + {% + \def\@ff@type@i{3}% + \@dynamicframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#3'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \ifthenelse{\equal{#5}{flow}}% + {% + \def\@ff@type@ii{1}\@flowframeid{#6}% + }% + {% + \ifthenelse{\equal{#5}{static}}% + {% + \def\@ff@type@ii{2}% + \@staticframeid{#6}% + }% + {% + \ifthenelse{\equal{#5}{dynamic}}% + {% + \def\@ff@type@ii{3}% + \@dynamicframeid{#6}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#5'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \@@insert@vrule{#1}{#2}{\@ff@type@i}{\@ff@tmpN}% + {\@ff@type@ii}{\ff@id}% } \newcommand*{\inserthrule}{\@ifstar\@sinserthrule\@inserthrule} \newcommand*{\@inserthrule}[1][0pt]{% -\@ifnextchar[{\@@inserthrule[#1]}{\@@inserthrule[#1][0pt]}} + \@ifnextchar[{\@@inserthrule[#1]}{\@@inserthrule[#1][0pt]}% +} \def\@@inserthrule[#1][#2]#3#4#5#6{% -\ifthenelse{\equal{#3}{flow}}{% -\def\@ff@type@i{1}}{\ifthenelse{\equal{#3}{static}}{% -\def\@ff@type@i{2}}{\ifthenelse{\equal{#3}{dynamic}}{% -\def\@ff@type@i{3}}{\PackageError{flowfram}{Unknown frame -type '#3'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\ifthenelse{\equal{#5}{flow}}{% -\def\@ff@type@ii{1}}{\ifthenelse{\equal{#5}{static}}{% -\def\@ff@type@ii{2}}{\ifthenelse{\equal{#5}{dynamic}}{% -\def\@ff@type@ii{3}}{\PackageError{flowfram}{Unknown frame -type '#5'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\@@insert@hrule{#1}{#2}{\@ff@type@i}{#4}{\@ff@type@ii}{#6}% + \ifthenelse{\equal{#3}{flow}}% + {% + \def\@ff@type@i{1}% + }% + {% + \ifthenelse{\equal{#3}{static}}% + {% + \def\@ff@type@i{2}% + }% + {% + \ifthenelse{\equal{#3}{dynamic}}% + {% + \def\@ff@type@i{3}}% + {% + \PackageError{flowfram}% + {Unknown frame type '#3'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \ifthenelse{\equal{#5}{flow}}% + {% + \def\@ff@type@ii{1}% + }% + {% + \ifthenelse{\equal{#5}{static}}% + {% + \def\@ff@type@ii{2}% + }% + {% + \ifthenelse{\equal{#5}{dynamic}}% + {% + \def\@ff@type@ii{3}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#5'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \@@insert@hrule{#1}{#2}{\@ff@type@i}{#4}{\@ff@type@ii}{#6}% } \newcommand*{\@@insert@hrule}[6]{% -\@ff@getdim{#3}{#4}% -\setlength{\@ff@left@x}{\ffareax}% -\setlength{\@ff@left@y}{\ffareay}% -\setlength{\@ff@left@width}{\ffareawidth}% -\setlength{\@ff@left@height}{\ffareaheight}% -\@ff@getdim{#5}{#6}% -\ifnum\@ff@left@y>\ffareay\relax - \@ff@swaplen{\@ff@left@x}{\ffareax}% - \@ff@swaplen{\@ff@left@y}{\ffareay}% - \@ff@swaplen{\@ff@left@width}{\ffareawidth}% - \@ff@swaplen{\@ff@left@height}{\ffareaheight}% -\fi -\setlength{\@ff@tmp@y}{\@ff@left@y}% -\addtolength{\@ff@tmp@y}{\@ff@left@height}% -\setlength{\@ff@staticH}{\ffareay}% -\addtolength{\@ff@staticH}{-\@ff@tmp@y}% -\setlength{\@ff@staticW}{\@ff@left@x}% -\addtolength{\@ff@staticW}{\@ff@left@width}% -\setlength{\@ff@tmp@x}{\ffareax}% -\addtolength{\@ff@tmp@x}{\ffareawidth}% -\ifnum\@ff@tmp@x>\@ff@staticW\relax - \setlength{\@ff@staticW}{\@ff@tmp@x}% -\fi -\ifnum\@ff@left@x<\ffareax\relax - \setlength{\@ff@tmp@x}{\@ff@left@x}% -\else + \@ff@getdim{#3}{#4}% + \setlength{\@ff@left@x}{\ffareax}% + \setlength{\@ff@left@y}{\ffareay}% + \setlength{\@ff@left@width}{\ffareawidth}% + \setlength{\@ff@left@height}{\ffareaheight}% + \@ff@getdim{#5}{#6}% + \ifnum\@ff@left@y>\ffareay\relax + \@ff@swaplen{\@ff@left@x}{\ffareax}% + \@ff@swaplen{\@ff@left@y}{\ffareay}% + \@ff@swaplen{\@ff@left@width}{\ffareawidth}% + \@ff@swaplen{\@ff@left@height}{\ffareaheight}% + \fi + \setlength{\@ff@tmp@y}{\@ff@left@y}% + \addtolength{\@ff@tmp@y}{\@ff@left@height}% + \setlength{\@ff@staticH}{\ffareay}% + \addtolength{\@ff@staticH}{-\@ff@tmp@y}% + \setlength{\@ff@staticW}{\@ff@left@x}% + \addtolength{\@ff@staticW}{\@ff@left@width}% \setlength{\@ff@tmp@x}{\ffareax}% -\fi -\addtolength{\@ff@staticW}{-\@ff@tmp@x}% -\newstaticframe{\@ff@staticW}{\@ff@staticH}% -{\@ff@tmp@x}{\@ff@tmp@y}% -\addtolength{\@ff@staticW}{#1}% -\addtolength{\@ff@staticW}{#2}% -\setstaticcontents{\c@maxstatic}{% -\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}% -\or \edef\@ff@pages{\csname @df@pages@\romannumeral#4\endcsname}% -\fi -\setstaticframe{\c@maxstatic}{pages=\@ff@pages}% -\addtolength{\@ff@tmp@x}{\@ff@left@evenx}% -\addtolength{\@ff@tmp@x}{-\@ff@left@x}% -\addtolength{\@ff@tmp@y}{\@ff@left@eveny}% -\addtolength{\@ff@tmp@y}{-\@ff@left@y}% -\setstaticframe{\c@maxstatic}{evenx=\@ff@tmp@x,eveny=\@ff@tmp@y}% + \addtolength{\@ff@tmp@x}{\ffareawidth}% + \ifnum\@ff@tmp@x>\@ff@staticW\relax + \setlength{\@ff@staticW}{\@ff@tmp@x}% + \fi + \ifnum\@ff@left@x<\ffareax\relax + \setlength{\@ff@tmp@x}{\@ff@left@x}% + \else + \setlength{\@ff@tmp@x}{\ffareax}% + \fi + \addtolength{\@ff@staticW}{-\@ff@tmp@x}% + \newstaticframe{\@ff@staticW}{\@ff@staticH}% + {\@ff@tmp@x}{\@ff@tmp@y}% + \addtolength{\@ff@staticW}{#1}% + \addtolength{\@ff@staticW}{#2}% + \setstaticcontents{\c@maxstatic}% + {% + \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}% + \or \edef\@ff@pages{\csname @df@pages@\romannumeral#4\endcsname}% + \fi + \setstaticframe{\c@maxstatic}{pages=\@ff@pages}% + \addtolength{\@ff@tmp@x}{\@ff@left@evenx}% + \addtolength{\@ff@tmp@x}{-\@ff@left@x}% + \addtolength{\@ff@tmp@y}{\@ff@left@eveny}% + \addtolength{\@ff@tmp@y}{-\@ff@left@y}% + \setstaticframe{\c@maxstatic}{evenx=\@ff@tmp@x,eveny=\@ff@tmp@y}% } \newcommand*{\ffhrule}[3]{% -\hspace*{-#1}\rule{#2}{#3}} + \hspace*{-#1}\rule{#2}{#3}% +} \newcommand*{\@sinserthrule}[1][0pt]{% -\@ifnextchar[{\@@sinserthrule[#1]}{\@@sinserthrule[#1][0pt]}} + \@ifnextchar[{\@@sinserthrule[#1]}{\@@sinserthrule[#1][0pt]}% +} \def\@@sinserthrule[#1][#2]#3#4#5#6{% -\ifthenelse{\equal{#3}{flow}}{% -\def\@ff@type@i{1}\@flowframeid{#4}\@ff@tmpN=\ff@id}{% -\ifthenelse{\equal{#3}{static}}{% -\def\@ff@type@i{2}\@staticframeid{#4}\@ff@tmpN=\ff@id}{% -\ifthenelse{\equal{#3}{dynamic}}{% -\def\@ff@type@i{3}\@dynamicframeid{#4}\@ff@tmpN=\ff@id}{% -\PackageError{flowfram}{Unknown frame -type '#3'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\ifthenelse{\equal{#5}{flow}}{% -\def\@ff@type@ii{1}\@flowframeid{#6}}{% -\ifthenelse{\equal{#5}{static}}{% -\def\@ff@type@ii{2}\@staticframeid{#6}}{% -\ifthenelse{\equal{#5}{dynamic}}{% -\def\@ff@type@ii{3}\@dynamicframeid{#6}}{% -\PackageError{flowfram}{Unknown frame -type '#5'}{Available frame types are: 'flow', 'static' -or 'dynamic'}}}}% -\@@insert@hrule{#1}{#2}{\@ff@type@i}{\@ff@tmpN}% -{\@ff@type@ii}{\ff@id}% + \ifthenelse{\equal{#3}{flow}}% + {% + \def\@ff@type@i{1}% + \@flowframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \ifthenelse{\equal{#3}{static}}% + {% + \def\@ff@type@i{2}% + \@staticframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \ifthenelse{\equal{#3}{dynamic}}% + {% + \def\@ff@type@i{3}% + \@dynamicframeid{#4}% + \@ff@tmpN=\ff@id + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#3'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \ifthenelse{\equal{#5}{flow}}% + {% + \def\@ff@type@ii{1}% + \@flowframeid{#6}% + }% + {% + \ifthenelse{\equal{#5}{static}}% + {% + \def\@ff@type@ii{2}% + \@staticframeid{#6}% + }% + {% + \ifthenelse{\equal{#5}{dynamic}}% + {% + \def\@ff@type@ii{3}% + \@dynamicframeid{#6}% + }% + {% + \PackageError{flowfram}% + {Unknown frame type '#5'}% + {% + Available frame types are: 'flow', 'static' + or 'dynamic'% + }% + }% + }% + }% + \@@insert@hrule{#1}{#2}{\@ff@type@i}{\@ff@tmpN}% + {\@ff@type@ii}{\ff@id}% } \newcommand*{\dfchaphead}{% -\@ifstar\@sdynamicchap\@dynamicchap} + \@ifstar\@sdynamicchap\@dynamicchap +} \newcommand{\DFchapterstyle}[1]{#1} \newcommand{\DFschapterstyle}[1]{#1} \newcommand{\@dynamicchap}[1]{% -\@ifundefined{chapter}{\PackageError{flowfram}{Chapters aren't -defined}{The document -class you are using does not define chapters}}{% -\let\@ff@OLDmakechapterhead\@makechapterhead -\let\@ff@OLDmakeschapterhead\@makeschapterhead -\renewcommand{\DFchapterstyle}[1]{\@ff@OLDmakechapterhead{##1}}% -\renewcommand{\DFschapterstyle}[1]{\@ff@OLDmakeschapterhead{##1}}% -\xdef\@makechapterhead##1{% -\noexpand\@setdynamiccontents{\number#1}{% -\noexpand\DFchapterstyle{##1}}}% -\xdef\@makeschapterhead##1{% -\noexpand\@setdynamiccontents{\number#1}{% -\noexpand\DFschapterstyle{##1}}}% -}} + \@ifundefined{chapter}% + {% + \PackageError{flowfram}% + {Chapters aren't defined}% + {% + The document class you are using does not + define chapters% + }% + }% + {% + \let\@ff@OLDmakechapterhead\@makechapterhead + \let\@ff@OLDmakeschapterhead\@makeschapterhead + \renewcommand{\DFchapterstyle}[1]{\@ff@OLDmakechapterhead{##1}}% + \renewcommand{\DFschapterstyle}[1]{\@ff@OLDmakeschapterhead{##1}}% + \xdef\@makechapterhead##1{% + \noexpand\@setdynamiccontents{\number#1}% + {% + \noexpand\DFchapterstyle{##1}% + }% + }% + \xdef\@makeschapterhead##1{% + \noexpand\@setdynamiccontents{\number#1}% + {% + \noexpand\DFschapterstyle{##1}% + }% + }% + }% +} \newcommand{\@sdynamicchap}[1]{% -\@dynamicframeid{#1}\@dynamicchap{\ff@id}} + \@dynamicframeid{#1}% + \@dynamicchap{\ff@id}% +} \newcounter{maxthumbtabs} -\@ifundefined{chapter}{% -\newcommand*{\defaultthumbtabtype}{section}}{ -\newcommand*{\defaultthumbtabtype}{chapter} +\@ifundefined{chapter}% +{% + \newcommand*{\defaultthumbtabtype}{section}% +}% +{% + \newcommand*{\defaultthumbtabtype}{chapter}% } \newcommand*{\@ttb@type}{\defaultthumbtabtype} \newcommand*{\makethumbtabs}[2][0pt]{% -\@ifnextchar[{\@makethumbtabs[#1]{#2}}{% -\@makethumbtabs[#1]{#2}[\defaultthumbtabtype]}% + \@ifnextchar[% + {\@makethumbtabs[#1]{#2}}% + {% + \@makethumbtabs[#1]{#2}[\defaultthumbtabtype]% + }% } \def\@makethumbtabs[#1]#2[#3]{% -\@ifundefined{#3}{\PackageError{flowfram}{% -Unknown section type '#3'}{}}{% -\renewcommand{\@ttb@type}{#3}% -\ifthenelse{\equal{#3}{chapter}}{\@makethumbchapter}{% -\ifthenelse{\equal{#3}{part}}{\@makethumbpart}{% -\@makethumbsection{#3}}}} -\@starttoc{ttb}% -\@dothumbtabs{#1}{#2}% -} -\newcommand{\@makethumbchapter}{ -\let\@ttb@old@chapter\@chapter -\def\@chapter[##1]##2{% -\@ttb@old@chapter[##1]{##2}% -\addtocontents{ttb}{\protect\thumbtab - {\thepage}{\thechapter}{##1}{chapter.\thechapter}}% -\@afterheading -}} -\newcommand{\@makethumbpart}{ -\let\@ttb@old@part\@part -\@ifundefined{@endpart}{% -\def\@part[##1]##2{\@ttb@old@part[##1]{##2}% -\addtocontents{ttb}{\protect\thumbtab - {\thepage}{\thepart}{##1}{part.\thepage}}% -\@afterheading}}{% -\let\@ttb@old@endpart\@endpart -\def\@part[##1]##2{% -\def\@parttitle{##1}% -\@ttb@old@part[##1]{##2}% -}% -\def\@endpart{% -\addtocontents{ttb}{% -\protect\thumbtab{\thepage}% -{\thepart}{\@parttitle}{part.\thepage}}% -\@ttb@old@endpart -}}} + \@ifundefined{#3}% + {% + \PackageError{flowfram}% + {% + Unknown section type '#3'% + }% + {}% + }% + {% + \renewcommand{\@ttb@type}{#3}% + \ifthenelse{\equal{#3}{chapter}}% + {% + \@makethumbchapter + }% + {% + \ifthenelse{\equal{#3}{part}}% + {\@makethumbpart}% + {% + \@makethumbsection{#3}% + }% + }% + }% + \@starttoc{ttb}% + \@dothumbtabs{#1}{#2}% +} +\newcommand{\@makethumbchapter}{% + \let\@ttb@old@chapter\@chapter + \def\@chapter[##1]##2{% + \@ttb@old@chapter[##1]{##2}% + \addtocontents{ttb}{\protect\thumbtab + {\thepage}{\thechapter}{##1}{chapter.\thechapter}}% + \@afterheading + }% +} +\newcommand{\@makethumbpart}{% + \let\@ttb@old@part\@part + \@ifundefined{@endpart}% + {% + \def\@part[##1]##2{% + \@ttb@old@part[##1]{##2}% + \addtocontents{ttb}{\protect\thumbtab + {\thepage}{\thepart}{##1}{part.\thepage}}% + \@afterheading + }% + }% + {% + \let\@ttb@old@endpart\@endpart + \def\@part[##1]##2{% + \def\@parttitle{##1}% + \@ttb@old@part[##1]{##2}% + }% + \def\@endpart{% + \addtocontents{ttb}% + {% + \protect\thumbtab{\thepage}% + {\thepart}{\@parttitle}{part.\thepage}% + }% + \@ttb@old@endpart + }% + }% +} \newcommand*{\@makethumbsection}[1]{% -\let\@ttb@old@sect=\@sect -\def\@sect##1##2##3##4##5##6[##7]##8{% -\@ttb@old@sect{##1}{##2}{##3}{##4}{##5}{##6}[##7]{##8}% -\ifthenelse{\equal{##1}{#1}}{% -\addtocontents{ttb}{% -\protect\thumbtab{\thepage}{\csname the#1\endcsname}% -{##7}{#1.\csname the#1\endcsname}}% -\@afterheading}{}% -}} + \let\@ttb@old@sect=\@sect + \def\@sect##1##2##3##4##5##6[##7]##8{% + \@ttb@old@sect{##1}{##2}{##3}{##4}{##5}{##6}[##7]{##8}% + \ifthenelse{\equal{##1}{#1}}% + {% + \addtocontents{ttb}% + {% + \protect\thumbtab{\thepage}{\csname the#1\endcsname}% + {##7}{#1.\csname the#1\endcsname}% + }% + \@afterheading + }% + {}% + }% +} \newcommand{\thumbtab}[4]{% -\stepcounter{maxthumbtabs}% -\expandafter -\gdef\csname thumbtab@pages@\romannumeral\c@maxthumbtabs\endcsname -{#1}% -\expandafter -\gdef\csname thumbtab@num@\romannumeral\c@maxthumbtabs\endcsname -{#2}% -\expandafter -\gdef\csname thumbtab@title@\romannumeral\c@maxthumbtabs\endcsname -{#3}% -\expandafter -\gdef\csname thumbtab@link@\romannumeral\c@maxthumbtabs\endcsname -{#4}} + \stepcounter{maxthumbtabs}% + \expandafter + \gdef\csname thumbtab@pages@\romannumeral\c@maxthumbtabs\endcsname{#1}% + \expandafter + \gdef\csname thumbtab@num@\romannumeral\c@maxthumbtabs\endcsname{#2}% + \expandafter + \gdef\csname thumbtab@title@\romannumeral\c@maxthumbtabs\endcsname{#3}% + \expandafter + \gdef\csname thumbtab@link@\romannumeral\c@maxthumbtabs\endcsname{#4}% +} \newcommand*{\@dothumbtabs}[2]{% -\@colN=0\relax -\whiledo{\@colN<\c@maxthumbtabs}{% - \advance\@colN by 1\relax - \edef\ff@pages{% - \csname thumbtab@pages@\romannumeral\@colN\endcsname}% - \ifnum\@colN=\c@maxthumbtabs - \expandafter - \xdef\csname thumbtab@pages@\romannumeral\@colN\endcsname{% - \ff@pages,>\ff@pages}% - \else + \@colN=0\relax + \whiledo{\@colN<\c@maxthumbtabs}% + {% \advance\@colN by 1\relax - \edef\ff@endpage{% + \edef\ff@pages{% \csname thumbtab@pages@\romannumeral\@colN\endcsname}% - \advance\@colN by -1\relax - \@ff@tmpN=\ff@endpage\relax - \advance\@ff@tmpN by -1\relax - \ifnum\@ff@tmpN>\ff@pages + \ifnum\@colN=\c@maxthumbtabs \expandafter \xdef\csname thumbtab@pages@\romannumeral\@colN\endcsname{% - \ff@pages-\number\@ff@tmpN}% + \ff@pages,>\ff@pages}% + \else + \advance\@colN by 1\relax + \edef\ff@endpage{% + \csname thumbtab@pages@\romannumeral\@colN\endcsname}% + \advance\@colN by -1\relax + \@ff@tmpN=\ff@endpage\relax + \advance\@ff@tmpN by -1\relax + \ifnum\@ff@tmpN>\ff@pages + \expandafter + \xdef\csname thumbtab@pages@\romannumeral\@colN\endcsname{% + \ff@pages-\number\@ff@tmpN}% + \fi \fi - \fi -}% -\@@dothumbtabs{#1}{#2}% + }% + \@@dothumbtabs{#1}{#2}% } \newlength{\thumbtabwidth} \setlength{\thumbtabwidth}{1cm} -\@ifundefined{hyperlink}{% -\newcommand{\thumbtabindexformat}[3]{% -\thumbtabformat{#2}{#3}}}{% -\newcommand{\thumbtabindexformat}[3]{% -\hyperlink{#1}{\thumbtabformat{#2}{#3}}} +\@ifundefined{hyperlink}% +{% + \newcommand{\thumbtabindexformat}[3]{% + \thumbtabformat{#2}{#3}% + }% +}% +{% + \newcommand{\thumbtabindexformat}[3]{% + \hyperlink{#1}{\thumbtabformat{#2}{#3}}% + }% } \newcommand{\thumbtabformat}[2]{% -\if@ttb@rotate -\rotatebox{-90}{\parbox[c][\thumbtabwidth]{#2}{% -\centering#1}}% -\else -\parbox[c][#2]{\thumbtabwidth}{% -\centering\@ttb@stack{#1}}% -\fi} + \if@ttb@rotate + \rotatebox{-90}% + {% + \parbox[c][\thumbtabwidth]{#2}{% + \centering#1% + }% + }% + \else + \parbox[c][#2]{\thumbtabwidth}{% + \centering\@ttb@stack{#1}% + }% + \fi +} \def\@flf@subsp#1 #2{% -\expandafter\flf@ta\expandafter{\@flf@subsptext}% -\flf@tb{#1}% -\edef\@flf@subsptext{\the\flf@ta\the\flf@tb}% -\def\@flf@tmp{#2}% -\ifx\@flf@tmp\@nnil - \let\@flf@donextsubsp=\@gobble -\else \expandafter\flf@ta\expandafter{\@flf@subsptext}% - \edef\@flf@subsptext{\the\flf@ta\noexpand\space}% - \let\@flf@donextsubsp=\@flf@subsp -\fi -\@flf@donextsubsp{#2}% + \flf@tb{#1}% + \edef\@flf@subsptext{\the\flf@ta\the\flf@tb}% + \def\@flf@tmp{#2}% + \ifx\@flf@tmp\@nnil + \let\@flf@donextsubsp=\@gobble + \else + \expandafter\flf@ta\expandafter{\@flf@subsptext}% + \edef\@flf@subsptext{\the\flf@ta\noexpand\space}% + \let\@flf@donextsubsp=\@flf@subsp + \fi + \@flf@donextsubsp{#2}% } \newcommand{\@ttb@stack}[1]{% -\def\@flf@subsptext{}% -\expandafter\@flf@subsp#1 \@nil\relax -\begin{tabular}{l}% -\expandafter\@@ttb@stack\@flf@subsptext\@nil\relax -\end{tabular}} + \def\@flf@subsptext{}% + \expandafter\@flf@subsp#1 \@nil\relax + \begin{tabular}{l}% + \expandafter\@@ttb@stack\@flf@subsptext\@nil\relax + \end{tabular}% +} \def\@@ttb@stack#1#2{% -\def\@flf@tmp{#1}% -\ifx\@flf@tmp\@nnil - \let\flf@next\relax -\else - #1\\% - \def\@flf@tmp{#2}% - \ifx\@nnil#2\relax - \let\flf@next\@gobble + \def\@flf@tmp{#1}% + \ifx\@flf@tmp\@nnil + \let\flf@next\relax \else - \let\flf@next\@@ttb@stack + #1\\% + \def\@flf@tmp{#2}% + \ifx\@nnil#2\relax + \let\flf@next\@gobble + \else + \let\flf@next\@@ttb@stack + \fi \fi -\fi -\flf@next{#2}} + \flf@next{#2}% +} \newcount\@greyscale \newcommand{\@@dothumbtabs}[2]{% -\setlength{\@ff@tmp@y}{\textheight}% -\addtolength{\@ff@tmp@y}{-#2}% -\addtolength{\@ff@tmp@y}{-#1}% -\computerightedgeodd{\@ff@tmp@x}% -\addtolength{\@ff@tmp@x}{-\thumbtabwidth}% -\computeleftedgeeven{\@ff@tmp@x@even}% -\@ff@tmpN=0\relax -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% - \advance\@ff@tmpN by 1\relax - \@greyscale=\@ff@tmpN\relax - \multiply\@greyscale by 60\relax - \divide\@greyscale by \c@maxthumbtabs - \advance\@greyscale by 25\relax - \edef\@ff@greyscale{0.\number\@greyscale}% - \newdynamicframe[none]{\thumbtabwidth}{#2}% - {\@ff@tmp@x}{\@ff@tmp@y}[thumbtab\number\@ff@tmpN]% - \expandafter\global\expandafter - \setlength\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname - {\@ff@tmp@x@even}% - \ifthenelse{\boolean{@ttb@title}\and\boolean{@ttb@num}}{% - \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabformat{% - \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname\ - \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - }{% - \if@ttb@title - \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabformat{% - \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - \fi - \if@ttb@num + \setlength{\@ff@tmp@y}{\textheight}% + \addtolength{\@ff@tmp@y}{-#2}% + \addtolength{\@ff@tmp@y}{-#1}% + \computerightedgeodd{\@ff@tmp@x}% + \addtolength{\@ff@tmp@x}{-\thumbtabwidth}% + \computeleftedgeeven{\@ff@tmp@x@even}% + \@ff@tmpN=0\relax + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \@greyscale=\@ff@tmpN\relax + \multiply\@greyscale by 60\relax + \divide\@greyscale by \c@maxthumbtabs + \advance\@greyscale by 25\relax + \edef\@ff@greyscale{0.\number\@greyscale}% + \newdynamicframe[none]{\thumbtabwidth}{#2}% + {\@ff@tmp@x}{\@ff@tmp@y}[thumbtab\number\@ff@tmpN]% + \expandafter\global\expandafter + \setlength\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname + {\@ff@tmp@x@even}% + \ifthenelse{\boolean{@ttb@title}\and\boolean{@ttb@num}}% + {% \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabformat{% - \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname - }{#2}}% + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabformat + {% + \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname\ + \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + }% + {% + \if@ttb@title + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabformat + {% + \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + \fi + \if@ttb@num + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabformat + {% + \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% \fi - }% - \expandafter - \xdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname - {[gray]{\@ff@greyscale}} - \newdynamicframe[none]{\thumbtabwidth}{#2}% - {\@ff@tmp@x}{\@ff@tmp@y}[thumbtabindex\number\@ff@tmpN]% - \expandafter\global\expandafter - \setlength\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname - {\@ff@tmp@x@even}% - \expandafter - \ifthenelse{\boolean{@ttb@title}\and\boolean{@ttb@num}}{% + }% \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabindexformat{% - \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname}{% - \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname\ - \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - }{% - \if@ttb@title + \xdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname + {[gray]{\@ff@greyscale}} + \newdynamicframe[none]{\thumbtabwidth}{#2}% + {\@ff@tmp@x}{\@ff@tmp@y}[thumbtabindex\number\@ff@tmpN]% + \expandafter\global\expandafter + \setlength\csname @df@\romannumeral\c@maxdynamic @evenx\endcsname + {\@ff@tmp@x@even}% + \expandafter + \ifthenelse{\boolean{@ttb@title}\and\boolean{@ttb@num}}% + {% \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabindexformat{% - \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname}{% - \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - \fi - \if@ttb@num + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabindexformat + {% + \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname + }% + {% + \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname\ + \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + }% + {% + \if@ttb@title + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabindexformat + {% + \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname + }% + {% + \csname thumbtab@title@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + \fi + \if@ttb@num + \expandafter + \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% + \noexpand\thumbtabindexformat + {% + \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname + }% + {% + \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname + }% + {#2}% + }% + \fi + }% \expandafter - \xdef\csname @dynamicframe@\romannumeral\c@maxdynamic\endcsname{% - \noexpand\thumbtabindexformat{% - \csname thumbtab@link@\romannumeral\@ff@tmpN\endcsname}{% - \csname thumbtab@num@\romannumeral\@ff@tmpN\endcsname - }{#2}}% - \fi + \xdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname + {[gray]{\@ff@greyscale}} + \addtolength{\@ff@tmp@y}{-#2}% }% - \expandafter - \xdef\csname @df@backcol@\romannumeral\c@maxdynamic\endcsname - {[gray]{\@ff@greyscale}} - \addtolength{\@ff@tmp@y}{-#2}% -}% }% \newcommand*{\enablethumbtabs}{% -\ifnum\c@maxthumbtabs>0 -\@ff@tmpN=0\relax -\@dynamicframeid{thumbtab1}% -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax -\edef\@ff@pages{\csname thumbtab@pages@\romannumeral\@ff@tmpN\endcsname}% -\@@setdynamicframe{\ff@id}{pages=\@ff@pages}% -\advance\ff@id by 2\relax -}% -\else\PackageWarning{flowfram}{No thumb tabs defined}\fi} + \ifnum\c@maxthumbtabs>0\relax + \@ff@tmpN=0\relax + \@dynamicframeid{thumbtab1}% + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \edef\@ff@pages{\csname thumbtab@pages@\romannumeral\@ff@tmpN\endcsname}% + \@@setdynamicframe{\ff@id}{pages=\@ff@pages}% + \advance\ff@id by 2\relax + }% + \else + \PackageWarning{flowfram}{No thumb tabs defined}% + \fi +} \newcommand*{\disablethumbtabs}{% -\ifnum\c@maxthumbtabs>0 -\@ff@tmpN=0\relax -\@dynamicframeid{thumbtab1}% -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax -\expandafter\xdef\csname @df@pages@\romannumeral\ff@id\endcsname -{none}% -\advance\ff@id by 1\relax -\expandafter\xdef\csname @df@pages@\romannumeral\ff@id\endcsname -{none}% -\advance\ff@id by 1\relax -}\fi} + \ifnum\c@maxthumbtabs>0\relax + \@ff@tmpN=0\relax + \@dynamicframeid{thumbtab1}% + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \expandafter\xdef\csname @df@pages@\romannumeral\ff@id\endcsname + {none}% + \advance\ff@id by 1\relax + \expandafter\xdef\csname @df@pages@\romannumeral\ff@id\endcsname + {none}% + \advance\ff@id by 1\relax + }% + \fi +} \newcommand*{\thumbtabindex}{% -\ifnum\c@maxthumbtabs>0\relax -\@ff@tmpN=0\relax -\@dynamicframeid{thumbtabindex1}% -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax -\expandafter -\xdef\csname @df@pages@\romannumeral\ff@id\endcsname{\c@page}% -\edef\@ff@doafter{% -\noexpand\afterpage{% -\noexpand\setdynamicframe{\number\ff@id}{pages=none}}} -\@ff@doafter -\advance\ff@id by 2\relax -}\fi} + \ifnum\c@maxthumbtabs>0\relax + \@ff@tmpN=0\relax + \@dynamicframeid{thumbtabindex1}% + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \expandafter + \xdef\csname @df@pages@\romannumeral\ff@id\endcsname{\c@page}% + \edef\@ff@doafter{% + \noexpand\afterpage + {% + \noexpand\setdynamicframe{\number\ff@id}{pages=none}% + }% + }% + \@ff@doafter + \advance\ff@id by 2\relax + }% + \fi +} \newcommand{\setthumbtab}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\@ff@tmpN=0\relax -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax -\@setthumbtab{\@ff@tmpN}{#2}}}{% -\@for\@ttb@id:=#1\do{\@setthumbtab{\@ttb@id}{#2}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \@ff@tmpN=0\relax + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \@setthumbtab{\@ff@tmpN}{#2}% + }% + }% + {% + \@for\@ttb@id:=#1\do{\@setthumbtab{\@ttb@id}{#2}}% + }% +} \newcommand{\@setthumbtab}[2]{% -\ifthenelse{\(\c@maxthumbtabs<#1\) \or \(#1<1\)}{% -\PackageWarning{flowfram}{Can't find thumbtab number '#1', -ttb file may not be up-to-date}}{% -\@dynamicframeid{thumbtab\number#1}% -\@@setdynamicframe{\ff@id}{#2}% -\@dynamicframeid{thumbtabindex\number#1}% -\@@setdynamicframe{\ff@id}{#2}}} + \ifthenelse{\(\c@maxthumbtabs<#1\) \or \(#1<1\)}% + {% + \PackageWarning{flowfram}% + {% + Can't find thumbtab number '#1', ttb file may not be + up-to-date% + }% + }% + {% + \@dynamicframeid{thumbtab\number#1}% + \@@setdynamicframe{\ff@id}{#2}% + \@dynamicframeid{thumbtabindex\number#1}% + \@@setdynamicframe{\ff@id}{#2}% + }% +} \newcommand{\setthumbtabindex}[2]{% -\ifthenelse{\equal{#1}{all}}{% -\@ff@tmpN=0\relax -\whiledo{\@ff@tmpN<\c@maxthumbtabs}{% -\advance\@ff@tmpN by 1\relax -\@setthumbtabindex{\@ff@tmpN}{#2}}}{% -\@for\@ttb@id:=#1\do{\@setthumbtabindex{\@ttb@id}{#2}}}} + \ifthenelse{\equal{#1}{all}}% + {% + \@ff@tmpN=0\relax + \whiledo{\@ff@tmpN<\c@maxthumbtabs}% + {% + \advance\@ff@tmpN by 1\relax + \@setthumbtabindex{\@ff@tmpN}{#2}% + }% + }% + {% + \@for\@ttb@id:=#1\do{\@setthumbtabindex{\@ttb@id}{#2}}% + }% +} \newcommand{\@setthumbtabindex}[2]{% -\ifthenelse{\(\c@maxthumbtabs<#1\) \or \(#1<1\)}{% -\PackageWarning{flowfram}{Can't find thumbtab number `\number#1', -ttb file may not be up-to-date}}{% -\@dynamicframeid{thumbtabindex\number#1}% -\@@setdynamicframe{\ff@id}{#2}}} + \ifthenelse{\(\c@maxthumbtabs<#1\) \or \(#1<1\)}% + {% + \PackageWarning{flowfram}% + {% + Can't find thumbtab number `\number#1', + ttb file may not be up-to-date% + }% + }% + {% + \@dynamicframeid{thumbtabindex\number#1}% + \@@setdynamicframe{\ff@id}{#2}% + }% +} \newcommand*{\tocandthumbtabindex}{% -\aligntoctrue -\tableofcontents -\thumbtabindex -\aligntocfalse + \aligntoctrue + \tableofcontents + \thumbtabindex + \aligntocfalse } \newcommand*{\@ttb@minitoctype}{\@ttb@type} \let\@ttb@old@starttoc\@starttoc \newif\if@storetoc \@storetocfalse \renewcommand*{\@starttoc}[1]{% -\if@storetoc - \@ttb@storetoc{#1}% -\else - \@ttb@old@starttoc{#1}% -\fi} + \if@storetoc + \@ttb@storetoc{#1}% + \else + \@ttb@old@starttoc{#1}% + \fi +} \newcommand*{\@ttb@storetoc}[1]{% -\begingroup -\makeatletter -\@storefileconts{\jobname.#1}% -\if@filesw - \expandafter\newwrite\csname tf@#1\endcsname - \immediate\openout\csname tf@#1\endcsname\jobname.#1\relax -\fi -\@nobreakfalse -\endgroup} -\newcommand*{\@storefileconts}[1]{\IfFileExists{#1}{% -\@@storefileconts\@filef@und}{% -\PackageInfo{flowfram}{No file #1.}}} + \begingroup + \makeatletter + \@storefileconts{\jobname.#1}% + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout\csname tf@#1\endcsname\jobname.#1\relax + \fi + \@nobreakfalse + \endgroup +} +\newcommand*{\@storefileconts}[1]{% + \IfFileExists{#1}% + {% + \@@storefileconts\@filef@und + }% + {% + \PackageInfo{flowfram}{No file #1.}% + }% +} \newcount\c@maxtocunits \newcount\c@maxminitoc \newcommand{\@@storefileconts}[1]{% -\@ifundefined{\@ttb@minitoctype}{\@ttb@minitoclevel=6\relax}{% -\expandafter\@ttb@minitoclevel\expandafter - =\csname @ttb@\@ttb@minitoctype @level\endcsname}% -\newread\@ttb@toc -\openin\@ttb@toc=#1\relax -\c@maxtocunits=0\relax -\c@maxminitoc=0\relax -\whiledo{\not\boolean{eof}\@ttb@toc}{% -\read\@ttb@toc to\tocline -\@addtotoclist{\tocline}{\c@maxtocunits}% -}% -\closein\@ttb@toc} + \@ifundefined{\@ttb@minitoctype}% + {% + \@ttb@minitoclevel=6\relax + }% + {% + \expandafter\@ttb@minitoclevel\expandafter + =\csname @ttb@\@ttb@minitoctype @level\endcsname + }% + \newread\@ttb@toc + \openin\@ttb@toc=#1\relax + \c@maxtocunits=0\relax + \c@maxminitoc=0\relax + \whiledo{\not\boolean{eof}\@ttb@toc}% + {% + \read\@ttb@toc to\tocline + \@addtotoclist{\tocline}{\c@maxtocunits}% + }% + \closein\@ttb@toc +} \newif\if@contsline \newcount\@ttb@level \newcount\@ttb@minitoclevel \newcommand{\@addtotoclist}[2]{% -\expandafter\@checkcontentsline#1\end -\if@contsline -\expandafter\@gettype#1\end -\ifthenelse{\equal{\@ttb@contstype}{\@ttb@type}}{% -\global\advance#2 by 1\relax -}{% -}% -\fi -\@ifundefined{@toc@\romannumeral#2}{% -\flf@ta=\expandafter{#1}% -\expandafter\xdef\csname @toc@\romannumeral#2\endcsname{\the\flf@ta}}{% -\flf@ta=\expandafter{#1}% -\flf@tb=\expandafter\expandafter\expandafter{\csname @toc@\romannumeral#2\endcsname}% -\expandafter\xdef\csname @toc@\romannumeral#2\endcsname{\the\flf@tb\the\flf@ta}}% -\if@minitoc + \expandafter\@checkcontentsline#1\end \if@contsline - \@ifundefined{\@ttb@contstype}{\@ttb@level=6}{% - \@ttb@level=\csname @ttb@\@ttb@contstype @level\endcsname}% - \relax - \ifnum\@ttb@level=\@ttb@minitoclevel - \global\advance\c@maxminitoc by 1\relax - \expandafter - \gdef\csname @minitoc@\romannumeral\c@maxminitoc\endcsname{}% - \else - \ifnum\@ttb@level>\@ttb@minitoclevel - \flf@ta=\expandafter{#1}\relax - \flf@tb=\expandafter\expandafter\expandafter - {\csname @minitoc@\romannumeral\c@maxminitoc\endcsname}\relax + \expandafter\@gettype#1\end + \ifthenelse{\equal{\@ttb@contstype}{\@ttb@type}}% + {% + \global\advance#2 by 1\relax + }% + {}% + \fi + \@ifundefined{@toc@\romannumeral#2}% + {% + \flf@ta=\expandafter{#1}% + \expandafter\xdef\csname @toc@\romannumeral#2\endcsname{\the\flf@ta}% + }% + {% + \flf@ta=\expandafter{#1}% + \flf@tb=\expandafter\expandafter\expandafter + {\csname @toc@\romannumeral#2\endcsname}% + \expandafter\xdef\csname @toc@\romannumeral#2\endcsname{% + \the\flf@tb\the\flf@ta}% + }% + \if@minitoc + \if@contsline + \@ifundefined{\@ttb@contstype}% + {\@ttb@level=6}% + {% + \@ttb@level=\csname @ttb@\@ttb@contstype @level\endcsname + }% + \relax + \ifnum\@ttb@level=\@ttb@minitoclevel + \global\advance\c@maxminitoc by 1\relax \expandafter - \xdef\csname @minitoc@\romannumeral\c@maxminitoc\endcsname{% - \the\flf@tb\the\flf@ta} + \gdef\csname @minitoc@\romannumeral\c@maxminitoc\endcsname{}% + \else + \ifnum\@ttb@level>\@ttb@minitoclevel + \flf@ta=\expandafter{#1}\relax + \flf@tb=\expandafter\expandafter\expandafter + {\csname @minitoc@\romannumeral\c@maxminitoc\endcsname}\relax + \expandafter + \xdef\csname @minitoc@\romannumeral\c@maxminitoc\endcsname{% + \the\flf@tb\the\flf@ta} + \fi \fi \fi \fi -\fi } \def\@ttb@part@level{-1} \def\@ttb@chapter@level{0} @@ -4227,124 +7533,174 @@ ttb file may not be up-to-date}}{% \def\@ttb@paragraph@level{4} \def\@ttb@subparagraph@level{5} \long\def\@checkcontentsline#1#2\end{% -\ifx#1\contentsline - \@contslinetrue -\else - \@contslinefalse -\fi} + \ifx#1\contentsline + \@contslinetrue + \else + \@contslinefalse + \fi +} \def\@gettype\contentsline#1#2\end{% -\def\@ttb@contstype{#1}} + \def\@ttb@contstype{#1}% +} \newif\ifaligntoc \aligntocfalse - \let\@ttb@old@tableofcontents\tableofcontents \renewcommand{\tableofcontents}{% -\@storetoctrue -\@ttb@old@tableofcontents -\ifaligntoc - \@printalignedtoc -\else - \@printtoc -\fi -\@storetocfalse -\global\c@minitoc=0\relax} + \@storetoctrue + \@ttb@old@tableofcontents + \ifaligntoc + \@printalignedtoc + \else + \@printtoc + \fi + \@storetocfalse + \global\c@minitoc=0\relax +} \newlength\beforeminitocskip \setlength{\beforeminitocskip}{0pt} \newlength\afterminitocskip \setlength{\afterminitocskip}{\baselineskip} \newcommand*{\dominitoc}[1]{% -\if@minitoc \@dominitoc{#1}\fi} + \if@minitoc + \@dominitoc{#1}% + \fi +} \newcommand*{\@dominitoc}[1]{\@@dominitoc{#1}} -\newcommand{\minitocstyle}[1]{\normalfont\normalsize\normalcolor -#1} +\newcommand{\minitocstyle}[1]{% + \normalfont\normalsize\normalcolor + #1% +} \newcommand*{\@@dominitoc}[1]{% -{\minitocstyle{% -\vskip\beforeminitocskip -\csname @minitoc@\romannumeral#1\endcsname}} -\vskip\afterminitocskip} + {% + \minitocstyle + {% + \vskip\beforeminitocskip + \csname @minitoc@\romannumeral#1\endcsname + }% + }% + \vskip\afterminitocskip +} \newcommand*{\appenddfminitoc}{% -\renewcommand{\beforeminitocskip}{\baselineskip}% -\@ifstar\@sappendminitocdf\@appendminitocdf} + \renewcommand{\beforeminitocskip}{\baselineskip}% + \@ifstar\@sappendminitocdf\@appendminitocdf +} \newcommand*{\@sappendminitocdf}[1]{% -\renewcommand{\@dominitoc}[1]{% -\@sappenddynamic{#1}{\@@dominitoc{##1}}}} + \renewcommand{\@dominitoc}[1]{% + \@sappenddynamic{#1}{\@@dominitoc{##1}}% + }% +} \newcommand*{\@appendminitocdf}[1]{% -\renewcommand{\@dominitoc}[1]{% -\@appenddynamic{#1}{\@@dominitoc{##1}}}} + \renewcommand{\@dominitoc}[1]{% + \@appenddynamic{#1}{\@@dominitoc{##1}}% + }% +} \newcommand*{\@printtoc}{% -\@colN=0\relax -\csname @toc@\romannumeral\@colN\endcsname -\whiledo{\@colN<\c@maxtocunits}{% -\advance\@colN by 1\relax -\csname @toc@\romannumeral\@colN\endcsname}} + \@colN=0\relax + \csname @toc@\romannumeral\@colN\endcsname + \whiledo{\@colN<\c@maxtocunits}% + {% + \advance\@colN by 1\relax + \csname @toc@\romannumeral\@colN\endcsname + }% +} \newcommand{\@printalignedtoc}{% -\@ff@tmpN=0\relax -\@ifundefined{@toc@\romannumeral\@ff@tmpN}{% -}{% -\csname @toc@\romannumeral\@ff@tmpN\endcsname -\par\noindent\hrulefill -}% -\whiledo{\@ff@tmpN<\c@maxtocunits}{% -\advance\@ff@tmpN by 1\relax -\ifnum\@ff@tmpN>\c@maxthumbtabs -\csname @toc@\romannumeral\@ff@tmpN\endcsname -\else -\@dynamicframeid{thumbtabindex\number\@ff@tmpN}% -\expandafter\expandafter\expandafter -\@ff@getstaticpos\csname @df@dim@\romannumeral\ff@id\endcsname -\vbox to \@ff@tmp@y{% -\noindent\parbox{\linewidth}{% -\csname @toc@\romannumeral\@ff@tmpN\endcsname}% -\vfill -\par\noindent\hrulefill -}% -\fi}} + \@ff@tmpN=0\relax + \@ifundefined{@toc@\romannumeral\@ff@tmpN}% + {}% + {% + \csname @toc@\romannumeral\@ff@tmpN\endcsname + \par\noindent\hrulefill + }% + \whiledo{\@ff@tmpN<\c@maxtocunits}% + {% + \advance\@ff@tmpN by 1\relax + \ifnum\@ff@tmpN>\c@maxthumbtabs + \csname @toc@\romannumeral\@ff@tmpN\endcsname + \else + \@dynamicframeid{thumbtabindex\number\@ff@tmpN}% + \expandafter\expandafter\expandafter + \@ff@getstaticpos\csname @df@dim@\romannumeral\ff@id\endcsname + \vbox to \@ff@tmp@y + {% + \noindent\parbox{\linewidth}% + {% + \csname @toc@\romannumeral\@ff@tmpN\endcsname + }% + \vfill + \par\noindent\hrulefill + }% + \fi + }% +} \newcounter{minitoc} \newif\if@minitoc \@minitocfalse \newcommand*{\enableminitoc}[1][\@ttb@type]{% -\@minitoctrue -\setcounter{minitoc}{0}% -\@ifundefined{#1}{% -\PackageError{flowfram}{Sectioning type `#1' not defined}{}}{% -\renewcommand{\@ttb@minitoctype}{#1}% -\ifthenelse{\equal{#1}{chapter}}{\@makeminitocchapter}{% -\ifthenelse{\equal{#1}{part}}{\@makeminitocpart}{% -\@makeminitocsection{#1}}}}% + \@minitoctrue + \setcounter{minitoc}{0}% + \@ifundefined{#1}% + {% + \PackageError{flowfram}{Sectioning type `#1' not defined}{}% + }% + {% + \renewcommand{\@ttb@minitoctype}{#1}% + \ifthenelse{\equal{#1}{chapter}}% + {% + \@makeminitocchapter + }% + {% + \ifthenelse{\equal{#1}{part}}% + {\@makeminitocpart}% + {% + \@makeminitocsection{#1}% + }% + }% + }% } \@onlypreamble{\enableminitoc} -\newcommand{\@makeminitocchapter}{ -\let\@mtoc@old@chapter\@chapter -\def\@chapter[##1]##2{% -\@mtoc@old@chapter[##1]{##2}% -\stepcounter{minitoc}% -\dominitoc{\c@minitoc}% -\@afterheading -}} -\newcommand{\@makeminitocpart}{ -\@ifundefined{@endpart}{% -\let\@mtoc@old@part\@part -\def\@part[##1]##2{% -\@mtoc@old@part[##1]{##2}% -\stepcounter{minitoc}% -\dominitoc{\c@minitoc}% -\@afterheading -}}{% -\let\@mtoc@old@endpart\@endpart -\def\@endpart{% -\stepcounter{minitoc}% -\dominitoc{\c@minitoc}% -\@mtoc@old@endpart -}}} +\newcommand{\@makeminitocchapter}{% + \let\@mtoc@old@chapter\@chapter + \def\@chapter[##1]##2{% + \@mtoc@old@chapter[##1]{##2}% + \stepcounter{minitoc}% + \dominitoc{\c@minitoc}% + \@afterheading + }% +} +\newcommand{\@makeminitocpart}{% + \@ifundefined{@endpart}% + {% + \let\@mtoc@old@part\@part + \def\@part[##1]##2{% + \@mtoc@old@part[##1]{##2}% + \stepcounter{minitoc}% + \dominitoc{\c@minitoc}% + \@afterheading + }% + }% + {% + \let\@mtoc@old@endpart\@endpart + \def\@endpart{% + \stepcounter{minitoc}% + \dominitoc{\c@minitoc}% + \@mtoc@old@endpart + }% + }% +} \newcommand{\@makeminitocsection}[1]{% -\let\@mtoc@old@sect=\@sect -\def\@sect##1##2##3##4##5##6[##7]##8{% -\@mtoc@old@sect{##1}{##2}{##3}{##4}{##5}{##6}[##7]{##8}% -\ifthenelse{\equal{##1}{#1}}{% -\stepcounter{minitoc}% -\dominitoc{\c@minitoc}\@afterheading}{}% -}} + \let\@mtoc@old@sect=\@sect + \def\@sect##1##2##3##4##5##6[##7]##8{% + \@mtoc@old@sect{##1}{##2}{##3}{##4}{##5}{##6}[##7]{##8}% + \ifthenelse{\equal{##1}{#1}}% + {% + \stepcounter{minitoc}% + \dominitoc{\c@minitoc}% + \@afterheading + }% + {}% + }% +} \endinput %% %% End of file `flowfram.sty'. diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index cb26eab323e..318fdc1592f 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -171,7 +171,6 @@ chomp ($Build = `cd $Master/../Build/source && pwd`); 'booktabs-fr', "&MAKEnosymlinks", 'boondox', "&MAKEcopy", 'borceux', "&MAKEborceux", - 'nrclc', "die 'skipping, requires compilation'", 'bridge', "die 'skipping, latex 2.09'", 'bsheaders', "die 'skipping, license unstated, ca.2005, await request'", 'burmese', "&MAKEflatten", -- cgit v1.2.3