0% found this document useful (0 votes)
103 views76 pages

Guia para Ffuserguide

This document is the user manual for the flowfram package. It provides an overview of the package functionality including different frame types, package options, and handling of floats. Key features covered are the draft mode for displaying frame boundaries, predefined layouts for columns and backgrounds, and global settings for macros and lengths.

Uploaded by

avilapaska
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
103 views76 pages

Guia para Ffuserguide

This document is the user manual for the flowfram package. It provides an overview of the package functionality including different frame types, package options, and handling of floats. Key features covered are the draft mode for displaying frame boundaries, predefined layouts for columns and backgrounds, and global settings for macros and lengths.

Uploaded by

avilapaska
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 76

Creating Flow Frames for Posters, Brochures or Magazines

using flowfram.sty version 1.17


Nicola L. C. Talbot
2014-09-30

Dr Nicola Talbot
Dickimaw Books
http://www.dickimaw-books.com/

.
.
.
.
.
.

1
1
2
2
3
3
4

.
.
.
.
.
.
.
.
.

5
5
6
7
10
10
12
13
13
15

Modifying Frame Attributes


3.1 Non-Rectangular Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Switching Frames On and Off On-The-Fly . . . . . . . . . . . . . . . . . . . . . . . . .

17
23
25

Locations and Dimensions


4.1 Determining the Location of the Typeblock . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Determining the Dimensions and Locations of Frames . . . . . . . . . . . . . . . . . .
4.3 Relative Locations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31
31
32
33

Predefined Layouts
5.1 Column Styles . . . . . . . . . . . . . . .
5.2 Column Styles with an Additional Frame
5.3 Right to Left Columns . . . . . . . . . .
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 . .

37
37
38
42
43
43
44
45
45

Introduction
1.1 Package Options . .
1.2 Floats . . . . . . . .
1.3 Draft Option . . . . .
1.4 Chapters . . . . . . .
1.5 Frame Stacking Order
1.6 HTML . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

Defining New Frames


2.1 Flow Frames . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Prematurely Ending a Flow Frame . . . . . . . .
2.2 Static Frames . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Important Notes . . . . . . . . . . . . . . . . .
2.3 Dynamic Frames . . . . . . . . . . . . . . . . . . . . .
2.3.1 Putting Chapter Titles in a Dynamic Frame . . .
2.3.2 Putting Headers and Footers in a Dynamic Frame
2.3.3 Continued Text . . . . . . . . . . . . . . . . . .
2.3.4 Important Notes . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

Contents

ii

Thumbtabs and Minitocs


6.1 Thumbtabs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2 Minitocs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49
49
51

Global Settings
7.1 Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Lengths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3 Counters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53
53
53
55

Troubleshooting
8.1 General Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2 Unexpected Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3 Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57
57
59
61

Glossary

63

Index

65

This document is the user manual for the flowfram package. Advanced users wanting further details of the
package should read the documented code flowfram.pdf. Sample files are provided in the directory
hTEXMFi/doc/latex/flowfram/samples/ where hTEXMFi indicates the root TEX installation
directory for this package. (This document is located in hTEXMFi/doc/latex/flowfram/.)
The flowfram package is a LATEX 2 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. Theres an optional helper application called
flowframtk1 if you prefer to use a graphical user interface to set up the document layout.
The flowfram package tries to make TEX do something it wasnt originally designed to do. It
modifies the output routine and may not always perform as desired. Extra care must be taken if a
paragraph spans frames of unequal width due to the asynchronous nature of TEXs output routine.
(See section 8.2.)
The flowfram package provides three types of frame: flow frames, static frames and dynamic frames
with dimensions and positions specified by the user2 . 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 chapter 3. 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.
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 longtable).
You should load flowfram after hyperref and any colour package (e.g. color).

1.1

1. Introduction
1.1
1.2
1.3
1.4
1.5
1.6

Package Options . .
Floats . . . . . . . .
Draft Option . . . . .
Chapters . . . . . . .
Frame Stacking Order
HTML . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

1
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

1
2
2
3
3
4

This chapter provides a brief overview of the package, the package


options and the various frame types.

Package Options

pages Determines whether the page list refers to the page number as given by the page counter (pages=relative)
or the absolute page number (pages=absolute). The default is relative to ensure backward compatibility, but if you have a document where the page counter is reset its best to use pages=absolute.
draft Switch on draft mode (see section 1.3).
final Switch off draft mode (default).
thumbtabs Controls thumbtab contents. See section 6.1 for details.
1 http://www.dickimaw-books.com/apps/flowframtk/
2 Can

I have arbitrary shaped frames? See section 3.1

LR When using the column style layouts described in section 5.1, define the flow frames from left to

right. (Default.)
RL When using the column style layouts described in section 5.1, define the flow frames from right to

left.
rotate May have the value true (rotate text in thumbtabs) or false (stack text in thumbtabs). (Default is
true.)
color May have the value true (allow frames to have colour settings) or false (disable colour in frame
settings). The default is true.
verbose May have the value true or false. (Default is false.) Provided to assist debugging.

1.2

Floats

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 table3 .
Floats (such as figures and tables) can only go in flow frames. However, 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.

1.3

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: [hTi:hidni;hidli], where hTi is a single letter denoting
the frame type, hidni is the identification number (IDN) for the frame and hidli is the identification label
(IDL) for that frame. Values of hTi are: F (flow frame), S (static frame) or D (dynamic frame). Markers
of the form: [M:hidni] indicate that the bounding box is the area taken up by the margin for flow frame
with IDN hidni. 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:
3 This

is because of the arbitrary layout of the flow frames.

\showtypeblocktrue Display the bounding box for the typeblock.

\showtypeblockfalse Do not display the bounding box for the typeblock.


\showmarginstrue Display the bounding box for the margins.
\showmarginsfalse Do not display the bounding box for the margins.
\showframebboxtrue Display the bounding box for the frames.
\showframebboxfalse Do not display the bounding box for the frames.
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 color=false and rotate=false 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.)

1.4

Chapters

If the \chapter command has been defined, the flowfram package will modify its definition so that it
sets the page style to \chapterfirstpagestyle for the first page of each chapter. This command
defaults to 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 \chapterfirstpagestyle to the name of the relevant
page style. A hook
\ffprechapterhook
is used at the start of \chapter definition before \clearpage or \cleardoublepage is called.
Chapter titles can be placed in a dynamic frame (as in this document). See subsection 2.3.1 for further
details.

1.5

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. Each flow frame defined for that page in ascending order of IDN.

3. Each dynamic frame defined for that page in ascending order of IDN.
4. Bounding boxes if the draft package option has been used.
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.4

1.6

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 the
HTML version of this document, ffuserguide.html.

4 Can

I have arbitrary shaped frames? See section 3.1.

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[hpage listi]{hwidthi}{hheighti}{hxi}{hyi}[hlabeli]
where hwidthi is the width of the frame, hheighti is the height of the frame, (hxi,hyi) is the position of the
bottom left hand corner of the frame relative to the bottom left hand corner of the typeblock1 . The first
optional argument, hpage listi, 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 commaseparated list of either individual page numbers or page ranges. If hpage listi 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 integer value of the page counter2 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 pages=absolute 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 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 hlabeli.
You can retrieve the IDL for a given flow frame from its IDN using:

2. Defining New Frames


2.1
2.2
2.3

Flow Frames . . . . . . . . . . . . . . . . . . . .
2.1.1 Prematurely Ending a Flow Frame . . . . .
Static Frames . . . . . . . . . . . . . . . . . . . .
2.2.1 Important Notes . . . . . . . . . . . . . .
Dynamic Frames . . . . . . . . . . . . . . . . . .
2.3.1 Putting Chapter Titles in a Dynamic Frame
2.3.2 Putting Headers and Footers in a Dynamic
Frame . . . . . . . . . . . . . . . . . . . .
2.3.3 Continued Text . . . . . . . . . . . . . . .
2.3.4 Important Notes . . . . . . . . . . . . . .

5
6
7
10
10
12

13
13
15

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

\getflowlabel{hidni}
Conversely, you can retrieve the IDN for a given flow frame from its IDL using:
\getflowid{hcmdi}{hidli}
where hcmdi is a control sequence which will be used to store the frames IDN. For example:
The label for the first flow frame is \getflowlabel{1}.
1 See

query 10 on page 59 if you want to convert from absolute page co-ordinates to co-ordinates relative to the typeblock
cant I use the page number format? See query 3 on page 57.

2 Why

The flow frame labelled main has IDN \getflowid{\myid}{main}\myid.


produces: The label for the first flow frame is main. The flow frame labelled main has IDN 1. (See
also section 7.3.)
Note that \getflowlabel doesnt 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*[hpage listi]{hwidthi}{hheighti}{hxi}{hyi}[hlabeli]
will place a plain border around the flow frame. (See chapter 3 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 this document, I have used the command
\newflowframe{0.6\textwidth}{\textheight}{0pt}{0pt}[main]
to define the main flow frame3 (i.e. this one).

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 TEXs 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 a paragraph does span two flow frames of unequal width without using \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 flowframtk or jpgfdraw) you can adjust the tolerance to suppress these
warnings. The default tolerance is 2pt. To change this, set the length register \fftolerance to the
required tolerance. For example, to suppress warnings where the difference in width is less than 3pt, do
\setlength{\fftolerance}{3pt}
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.
3 the

position for the even pages is set using \setflowframe defined in chapter 3

2.2

Static Frames

A static frame is a rectangular area in which text neither flows into nor flows out of.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 section 3.1 for further details.
A new static frame is defined using the command:

\newstaticframe[hpage listi]{hwidthi}{hheighti}{hxi}{hyi}[hlabeli]
where, as with \newflowframe, hwidthi is the width of the frame, hheighti is the height of the frame,
(hxi,hyi) 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, hpage listi, indicates the page list for which this static
frame should appear, and the final optional argument, hlabeli 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{hidni}
Conversely, you can retrieve the IDN for a given static frame from its IDL using:
\getstaticid{hcmdi}{hidli}
where hcmdi is a control sequence which will be used to store the frames IDN. For example:
The label for the first static frame is \getstaticlabel{1}.
The static frame labelled backleft has IDN
\getstaticid{\myid}{backleft}\myid.
produces: The label for the first static frame is backleft. The static frame labelled backleft has IDN 1.
Note that \getstaticlabel doesnt 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
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.

\newstaticframe*[hpage listi]{hwidthi}{hheighti}{hxi}{hyi}[hlabeli]
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}{hIDNi}
hcontentsi
\end{staticcontents}

where hIDNi is the unique IDN associated with that static frame and hcontentsi is the contents of the static
frame, or you can use the command:
\setstaticcontents{hIDNi}{hcontentsi}
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*}{hIDLi}
hcontentsi
\end{staticcontents*}
or the equivalent:
\setstaticcontents*{hIDLi}{hcontentsi}
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[hcontinuation texti]{hidi}
If staticcontents* or \setstaticcontents* are being used, hidi refers to the IDL of the next static
frame, otherwise hidi 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. (Lets
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. (Lets
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. (Lets
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. (Lets
assume this frame is somewhere on the
right half of the same page.)
\end{staticcontents*}
where
\ffcontinuedtextlayout{htexti}
governs how the continuation text should be displayed. The font used to display the continuation text is
given by
\ffcontinuedtextfont{htexti}
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. (Lets
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. (Lets


assume this frame is somewhere on the
right half of the same page.)
\end{staticcontents*}

2.2.1

Important Notes

When you set the contents of a static frame, the contents are immediately typeset and stored in a
box until it is time to put the contents on the page. This means that if you use any information that
varies throughout the document (such as the page number) the value that is current when you set
the static frames contents will be the value used.
However, if \label is used inside a static frame, the label information will be written to the
auxiliary file each time the static frame is displayed until the contents of that frame have been
changed. This means that you may end up with multiply defined labels.

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.5 )
As from version 1.03 it is now possible to have dynamic frames with non-rectangular contents, see
section 3.1 for further details.
To create a new dynamic frame, use the command:
\newdynamicframe[hpage listi]{hwidthi}{hheighti}{hxi}{hyi}[hlabeli]
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 hlabeli.
You can retrieve the IDL for a given dynamic frame from its IDN using:
\getdynamiclabel{hidni}
Conversely, you can retrieve the IDN for a given dynamic frame from its IDL using:
5 which

means that you can have verbatim text in the body of the staticcontents environment but not in the body of the dynamic-

contents environment (see page 12)

10

\getdynamicid{hcmdi}{hidli}
where hcmdi is a control sequence which will be used to store the frames IDN.
For example:
The label for the first dynamic frame is \getdynamiclabel{1}.
The dynamic frame labelled chaphead has IDN
\getdynamicid{\myid}{chaphead}\myid.

produces: The label for the first dynamic frame is chaphead. The dynamic frame labelled chaphead
has IDN 1.
Note that \getdynamiclabel doesnt 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*[hpage listi]{hwidthi}{hheighti}{hxi}{hyi}[hlabeli]
which will place a plain border around the dynamic frame. For example, in this document I have used the
command
\newdynamicframe{0.38\textwidth}{\textheight}{0.62\textwidth}{0pt}[chaphead]
which has created the 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 chapter 3.)
The contents of a dynamic frame are set using the command:
\setdynamiccontents{hidi}{hcontentsi}
where hidi is the unique IDN associated with that dynamic frame, and hcontentsi is the contents of the
dynamic frame. Alternatively, if you have assigned an IDL, hlabeli, to the dynamic frame, you can use
the starred version:
\setdynamiccontents*{hlabeli}{hcontentsi}
As with most LATEX commands, you cant use verbatim text in hcontentsi.
As from version 1.09, the contents can also be set using the dynamiccontents environment:
\begin{dynamiccontents}{hidi}
hcontentsi
\end{dynamiccontents}

11

or the dynamiccontents* environment:


\begin{dynamiccontents*}{label}
hcontentsi
\end{dynamiccontents*}

Note that you cant use verbatim text within the dynamiccontents or dynamiccontents* environments.
You can additionally append text to a dynamic frame using either:
\appenddynamiccontents{hidi}{hcontentsi}
or:
\appenddynamiccontents*{hlabeli}{hcontentsi}

2.3.1

Putting Chapter Titles in a Dynamic Frame

If \chapter is defined, you can make the chapter titles appear in a dynamic frame using the command
\dfchaphead{hIDNi}
where hIDNi 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 this document, I used the command:
\dfchaphead*{chaphead}
If you use \dfchaphead, you can adjust the format of the chapter headings by redefining
\DFchapterstyle{htitlei}
for the numbered chapters and
\DFschapterstyle{htitlei}
for the unnumbered chapters. For example, this document redefined those commands as follows:
\renewcommand{\DFchapterstyle}[1]{%
{\raggedright\sffamily\bfseries\Huge
\color{blue}\thechapter. #1\par

12

}%
}
\renewcommand{\DFschapterstyle}[1]{%
{\raggedright\sffamily\bfseries\Huge
\color{blue} #1\par
}%
}

There is no facility for placing other sectional types in a dynamic frame.

2.3.2

Putting Headers and Footers in a Dynamic Frame

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 in
chapter 3).

2.3.3

Continued Text

In the body of dynamiccontents or dynamiccontents*, you can move onto another dynamic frame using:
\continueonframe[hcontinuation texti]{id}
If this command occurs within dynamiccontents*, hidi 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. (Lets
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. (Lets
assume this frame is somewhere on the

13

right half of the same page.)


\end{dynamiccontents*}
is equivalent to:
\begin{dynamiccontents*}{frame1}
Some text in the first frame. (Lets
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. (Lets
assume this frame is somewhere on the
right half of the same page.)
\end{dynamiccontents*}

where
\ffcontinuedtextlayout{htexti}
governs how the continuation text should be displayed. The font used to display the continuation text is
given by
\ffcontinuedtextfont{htexti}
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. (Lets
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. (Lets
assume this frame is somewhere on the
right half of the same page.)

14

\end{dynamiccontents*}

2.3.4

Important Notes

Verbatim text cant be used in a dynamic frame. This includes the body of the dynamiccontents and
dynamiccontents* environments.

\continueonframe cant be used in the argument of any of the commands that set the contents
of a dynamic frame, such as \setdynamiccontents.
Dynamic frames are painted on the page after all the static and flow frames. If the location of a
dynamic frame overlaps the location of any static or flow frames, the contents of the dynamic frame
will obscure the contents of the overlapping frames.

15

16

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{hidn listi}{hkey-val listi}
or the starred version:
\setflowframe*{hlabel listi}{hkey-val listi}
or the attributes for all flow frames can be set using:

3. Modifying Frame
Attributes
3.1
3.2

Non-Rectangular Frames . . . . . . . . . . . . . .
Switching Frames On and Off On-The-Fly . . . . .

23
25

This chapter describes how to modify frame attributes, such as the


size and location.

\setallflowframes{hkey-val listi}
Static frame attributes are modified using either the command:
\setstaticframe{hidn listi}{hkey-val listi}
or the starred version:
\setstaticframe*{hlabel listi}{hkey-val listi}
or the attributes for all static frames can be set using:
\setallstaticframes{hkey-val listi}
Dynamic frame attributes are modified using either the command:
\setdynamicframe{hidn listi}{hkey-val listi}
or the starred version:
\setdynamicframe*{hlabel listi}{hkey-val listi}
or the attributes for all dynamic frames can be set using:
\setalldynamicframes{hkey-val listi}
In each of the above, hidn listi can either be one of the keywords: all, odd or even (indicating all

17

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, hlabel listi should be a comma-separated list of IDLs. Note that you cant use
the above keywords or have ranges in hlabel listi.
The hkey-val listi argument must be a comma-separated list of hkeyi=hvaluei pairs, indicating which
attributes to modify. Make sure you group hvaluei if it contains one or more commas or equal signs.
The available values are as follows:
width=hlengthi The width of the frame.
height=hlengthi The height of the frame.

x=hlengthi The x-coordinate of the frame for all pages on which it is defined.
y=hlengthi The y-coordinate of the frame for all pages on which it is defined.
evenx=hlengthi 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 this document, I have 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{hIDNi}
(for flow frames)
\sfswapoddeven{hIDNi}
(for static frames) or
\dfswapoddeven{hIDNi}
(for dynamic frames). These commands all have starred versions which take the frames IDL instead
of its IDN.

18

eveny=hlengthi 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=hlengthi The x-coordinate of the frame for all odd pages on which it is defined, if the document is
two-sided.
oddy=hlengthi The y-coordinate of the frame for all odd pages on which it is defined, if the document is
two-sided.
valign=hposi Change the vertical alignment of material inside a static or dynamic frame. The value hposi
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=htexti 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 chapter 5.
border=hstylei 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:

19

\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=hoffseti 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:

20

\setstaticframe{1}{border=thickgreenyellowbox,offset=-11pt}
bordercolor=hcolouri 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=hcolouri 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=hcolouri 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=hpage listi 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 onuseful 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}}
Recall that the numbers in the list either refer to the integer value of the page counter (when used
with the package option pages=relative) or the absolute page number (when used with the package
option pages=absolute).
As from version 1.14, there is also a quick way of setting the page list that doesnt have the overhead
of parsing the hkeyi=hvaluei format of commands such as \setflowframe:
\flowsetpagelist{hidni}{hpage listi}
\dynamicsetpagelist{hidni}{hpage listi}
\staticsetpagelist{hidni}{hpage listi}
Note that these commands dont have starred variants. The first argument must be a single
IDN.
See also section 3.2.

21

excludepages=hlisti (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 pages key. For this key, hlisti may
only contain comma-separated numbers. Ranges are not permitted. For example:
\setdynamicframe{1}{excludepages={7}}
\setdynamicframe{1}{pages={1-10}}
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 doesnt have the overhead of parsing
the hkeyi=hvaluei format of commands such as \setflowframe:

3
\flowsetexclusion{hidni}{hlisti}
\dynamicsetexclusion{hidni}{hlisti}
\staticsetexclusion{hidni}{hlisti}
or you can add to an exclusion list using:
\flowaddexclusion{hidni}{hlisti}
\dynamicaddexclusion{hidni}{hlisti}
\staticaddexclusion{hidni}{hlisti}
Note that these commands dont have starred variants. The first argument must be a single
IDN.
See also section 3.2.
hide=hbooleani If this value is set, the static or dynamic frame will be hidden regardless of the pages or
excludedpages settings. (New to version 1.16.)
hidethis=hbooleani Similar to hide, but is always reset back to false by the output routine, so it only
affects the current page. (New to version 1.16.)
margin=hsidei 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=hbooleani 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.

22

For example, to prevent the chapter heading reappearing on every page, I have used 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=hcmdi 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=hni Rotate the contents of the frame by hni degrees (new to version 1.02). Note that the bounding
boxes will not appear rotated.
shape=hshape commandi Define a shape for the contents of a static frame or dynamic frame (new to
version 1.03). If hshape commandi is \relax, no paragraph shape will be applied. See section 3.1
for further details.

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 frames shape setting. You
may use either TEXs \parshape command, or the \shapepar/\Shapepar commands defined in
Donald Arseneaus shapepar package (if using \shapepar or \Shapepar, remember to include the
shapepar package.)
The \shapepar or \Shapepar commands provide greater flexibility in the type of shape that can
be used. However, be aware of the advice given in the shapepar documentation.

23

This is an example of a
static frame with a nonrectangular shape. This
zigzag shape was specified
using the shape key setting
in \setstaticframe.
The \parshape command was used to set the
shape.
Using the shape key rather
than explicitly using
\parshape within the
staticcontents
environment means that I can
have paragraph breaks,
sectioning commands, and
even some mathematics

E = mc2

(3.1)

whilst retaining the shape.

\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/\Shapepar With \shapepar or \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. In
general, \Shapepar is better suited for use as a frame shape than \shapepar. See the shapepar
documentation for more details of these commands.
To restore a frame to its default rectangular setting use shape=\relax.
For those unfamiliar with TEXs \parshape command, the syntax is as follows:
\parshape=n i1 l1 i2 l2 . . . in ln
where n is the number of (i j l j ) pairs and i j specifies the left indentation for the jth line and l j specifies
the length of the jth line.
The static frame on the top left was assigned a zigzag shape using:
\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 and \Shapepar is more complicated, see the shapepar documentation
for more details. In general:
\shapepar{hshape specsi}

24

The shapepar package has four predefined shapes: \squareshape, \diamondshape, \heartshape
and \nutshape.
The static frame on the bottom left was assigned a heart shape using the command:
\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.

3.2

Switching Frames On and Off On-The-Fly

Modifying the page list (or the page exclusion list) within the 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. If you want to use these commands, its
best to use the package option pages=absolute.
The commands described in this section update the page lists (and possibly the exclusion list) 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:
\dynamicswitchonnextodd{1}
\mainmatter
\chapter{Introduction}
This will set the dynamic frame whose IDN is 1 to be visible for the first page of chapter 1. However, if
you do
\mainmatter
\dynamicswitchonnextodd{1}
\chapter{Introduction}
This will have a different effect as \mainmatter issues a \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 wont 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 IDLs and the unstarred version uses IDNs.

This is an example of a
static frame with a nonrectangular shape. This
zigzag shape was specified
using the shape key setting
in \setstaticframe.
The \parshape command was used to set the
shape.
Using the shape key rather
than explicitly using
\parshape within the
staticcontents
environment means that I can
have paragraph breaks,
sectioning commands, and
even some mathematics
E = mc2

(3.1)

whilst retaining the shape.

This example has a


more complicated shape that can not
be generated using TEXs \parshape
command, so \shapepar was used instead. Note that this document must include
the shapepar package in this instance,
whereas no extra packages are required
to use \parshape. No mathematics
or sectioning commands are allowed here. The shape will
expand as more text
is added to
it.

25

\flowswitchonnext{hIDN listi}
\flowswitchonnext*{hIDL listi}
Switch on the listed flow frames from the following page onwards.
\flowswitchoffnext{hIDN listi}
\flowswitchoffnext*{hIDL listi}
Switch off the listed flow frames from the following page onwards.

\flowswitchonnextodd{hIDN listi}
\flowswitchonnextodd*{hIDL listi}
Switch on the listed flow frames from the next odd page onwards.
\flowswitchoffnextodd{hIDN listi}
\flowswitchoffnextodd*{hIDL listi}
Switch off the listed flow frames from the next odd page onwards.
\flowswitchonnextonly{hIDN listi}
\flowswitchonnextonly*{hIDL listi}
Switch on the listed flow frames just for the following page.
\flowswitchoffnextonly{hIDN listi}
\flowswitchoffnextonly*{hIDL listi}
Switch off the listed flow frames just for the following page.
\flowswitchonnextoddonly{hIDN listi}
\flowswitchonnextoddonly*{hIDL listi}
Switch on the listed flow frames just for the next odd page.
\flowswitchoffnextoddonly{hIDN listi}
\flowswitchoffnextoddonly*{hIDL listi}

26

Switch off the listed flow frames just for the next odd page.
\dynamicswitchonnext{hIDN listi}
\dynamicswitchonnext*{hIDL listi}
Switch on the listed dynamic frames from the following page onwards.
\dynamicswitchoffnext{hIDN listi}
\dynamicswitchoffnext*{hIDL listi}

Switch off the listed dynamic frames from the following page onwards.
\dynamicswitchonnextodd{hIDN listi}
\dynamicswitchonnextodd*{hIDL listi}
Switch on the listed dynamic frames from the next odd page onwards.
\dynamicswitchoffnextodd{hIDN listi}
\dynamicswitchoffnextodd*{hIDL listi}
Switch off the listed dynamic frames from the next odd page onwards.
\dynamicswitchonnextonly{hIDN listi}
\dynamicswitchonnextonly*{hIDL listi}
Switch on the listed dynamic frames just for the following page.
\dynamicswitchoffnextonly{hIDN listi}
\dynamicswitchoffnextonly*{hIDL listi}
Switch off the listed dynamic frames just for the following page.
\dynamicswitchonnextoddonly{hIDN listi}
\dynamicswitchonnextoddonly*{hIDL listi}
Switch on the listed dynamic frames just for the next odd page.

27

\dynamicswitchoffnextoddonly{hIDN listi}
\dynamicswitchoffnextoddonly*{hIDL listi}
Switch off the listed dynamic frames just for the next odd page.
\staticswitchonnext{hIDN listi}
\staticswitchonnext*{hIDL listi}
Switch on the listed static frames from the following page onwards.

\staticswitchoffnext{hIDN listi}
\staticswitchoffnext*{hIDL listi}
Switch off the listed static frames from the following page onwards.
\staticswitchonnextodd{hIDN listi}
\staticswitchonnextodd*{hIDL listi}
Switch on the listed static frames from the next odd page onwards.
\staticswitchoffnextodd{hIDN listi}
\staticswitchoffnextodd*{hIDL listi}
Switch off the listed static frames from the next odd page onwards.
\staticswitchonnextonly{hIDN listi}
\staticswitchonnextonly*{hIDL listi}
Switch on the listed static frames just for the following page.
\staticswitchoffnextonly{hIDN listi}
\staticswitchoffnextonly*{hIDL listi}
Switch off the listed static frames just for the following page.
\staticswitchonnextoddonly{hIDN listi}
\staticswitchonnextoddonly*{hIDL listi}

28

Switch on the listed static frames just for the next odd page.
\staticswitchoffnextoddonly{hIDN listi}
\staticswitchoffnextoddonly*{hIDL listi}
Switch off the listed static frames just for the next odd page.
The flowfram package comes with a sample file sample-pages.tex that uses some of these commands.

29

30

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.

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:

4. Locations and
Dimensions
4.1
4.2
4.3

Determining the Location of the Typeblock . . . .


Determining the Dimensions and Locations of
Frames . . . . . . . . . . . . . . . . . . . . . . . .
Relative Locations . . . . . . . . . . . . . . . . .

31
32
33

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

\computeleftedgeodd{hlengthi}
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 hlengthi.

\computeleftedgeeven{hlengthi}
As above, but for even pages.
\computetopedge{hlengthi}
This computes the top edge of the page, relative to the bottom of the typeblock, and stores the result in
hlengthi.
\computebottomedge{hlengthi}
This computes the bottom edge of the page, relative to the bottom of the typeblock, and stores the result
in hlengthi.
\computerightedgeodd{hlengthi}
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 hlengthi.
\computerightedgeeven{hlengthi}

31

As above, but for even pages.


Note that in all cases hlengthi 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}

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:
\getstaticbounds{hIDNi}
\getstaticbounds*{hIDLi}
\getflowbounds{hIDNi}
\getflowbounds*{hIDLi}
\getdynamicbounds{hIDNi}
\getdynamicbounds*{hIDLi}
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.

32

4.3

Relative Locations

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


\relativeframelocation{htype1i}{hidn1i}{htype2i}{hidn2i}
where htype1i and hidn1i indicate the type and IDN of the first frame, and htype2i and hidn2i indicate the
type and IDN of the second frame. There is also a starred version:
\relativeframelocation*{htype1i}{hidl1i}{htype2i}{hidlli}
where hidl1i and hidl2i indicate the IDL of the first and second frames, respectively. Both the above
commands will print one of the following:
\FFaboveleft if the first frame is above left of the second frame.

\FFaboveright if the first frame is above right of the second frame.


\FFabove if the first frame is above the second frame.
\FFbelowleft if the first frame is below left of the second frame.
\FFbelowright if the first frame is below right of the second frame.
\FFbelow if the first frame is below the second frame.
\FFleft if the first frame is to the left of the second frame.
\FFright if the first frame is to the right of the second frame.
\FFoverlap if both frames overlap.
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.

33

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, this document defined a flow frame labelled main (this one) 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{hidn1i}{hidn2i}
This is equivalent to:
\relativeframelocation{dynamic}{hidn1i}{dynamic}{hidn2i}
\relstaticloc{hidn1i}{hidn2i}
This is equivalent to:
\relativeframelocation{static}{hidn1i}{static}{hidn2i}
\relflowloc{hidn1i}{hidn2i}
This is equivalent to:
\relativeframelocation{flow}{hidn1i}{flow}{hidn2i}
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

34

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.

35

36

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

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

5. Predefined Layouts
5.1
5.2
5.3
5.4

Column Styles . . . . . . . . . . . . . . .
Column Styles with an Additional Frame
Right to Left Columns . . . . . . . . . .
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 . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

37
38
42
43
43
44
45
45

This chapter describes commands that create frames arranged in a


predefined layout.

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[hpagesi]{hni}
This creates hni column flow frames each separated by a distance of \columnsep.
\onecolumninarea[hpagesi]{hwidthi}{hheighti}{hxi}{hyi}
This creates a single flow frame to fill the given area, adjusting the height so that it is an integer multiple
of \baselineskip.
\twocolumninarea[hpagesi]{hwidthi}{hheighti}{hxi}{hyi}
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[hpagesi]{hni}{hwidthi}{hheighti}{hxi}{hyi}
This is a more general form of \twocolumninarea making hni flow frames instead of two.

37

5.2

Column Styles with an Additional Frame

As well as the column-style flow frames defined above, it is also possible to define hni columns with an
additional frame spanning either above or below them. There will be a vertical gap of approximately1
\vcolumnsep between the columns and the extra frame. In each of the following definitions, the
argument hpagesi is the page list for which the frames are defined, hni is the number of columns required,
htypei 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 hwidthi, hheighti (the width and
height of the area) and hxi, hyi (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 hHi.
\onecolumntopinarea[hpagesi]{htypei}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This creates one flow frame with a htypei frame above it, filling the area specified.
\twocolumntopinarea[hpagesi]{htypei}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This creates two column-style flow frames with a htypei frame above them, filling the area specified.

5
\Ncolumntopinarea[hpagesi]{htypei}{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This creates hni column-style flow frames with a htypei frame above them, filling the area specified.
\onecolumnbottominarea[hpagesi]{htypei}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This creates one flow frame with a htypei frame underneath it, filling the area specified.
\twocolumnbottominarea[hpagesi]{htypei}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This creates two column-style flow frames with a htypei frame below them, filling the area specified.
\Ncolumnbottominarea[hpagesi]{htypei}{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This creates hni column-style flow frames with a htypei frame below them, filling the area specified.
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.

38

The following commands are special cases of the above:


\onecolumnStopinarea[hpagesi]{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\onecolumntopinarea[hpagesi]{static}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\onecolumnDtopinarea[hpagesi]{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\onecolumntopinarea[hpagesi]{dynamic}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\onecolumntop[hpagesi]{htypei}{hHi}
As \onecolumntopinarea where the area is the entire typeblock.
\onecolumnStop[hpagesi]{hHi}
This is equivalent to: \onecolumntop[hpagesi]{static}{hHi}

\onecolumnDtop[hpagesi]{hHi}
This is equivalent to: \onecolumntop[hpagesi]{dynamic}{hHi}
\twocolumnStopinarea[hpagesi]{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\twocolumntopinarea[hpagesi]{static}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\twocolumnDtopinarea[hpagesi]{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\twocolumntopinarea[hpagesi]{dynamic}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\twocolumntop[hpagesi]{htypei}{hHi}
As \twocolumntopinarea where the area is the entire typeblock.

39

\twocolumnStop[hpagesi]{hHi}
This is equivalent to: \twocolumntop[hpagesi]{static}{hHi}
\twocolumnDtop[hpagesi]{hHi}
This is equivalent to: \twocolumntop[hpagesi]{dynamic}{hHi}
\NcolumnStopinarea[hpagesi]{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\Ncolumntopinarea[hpagesi]{static}{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\NcolumnDtopinarea[hpagesi]{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\Ncolumntopinarea[hpagesi]{dynamic}{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\Ncolumntop[hpagesi]{htypei}{hni}{hHi}

5
As \Ncolumntopinarea where the area is the entire typeblock.
\NcolumnStop[hpagesi]{hni}{hHi}
This is equivalent to: \Ncolumntop[hpagesi]{static}{hni}{hHi}
\NcolumnDtop[hpagesi]{hni}{hHi}
This is equivalent to: \Ncolumntop[hpagesi]{dynamic}{hni}{hHi}
\onecolumnSbottominarea[hpagesi]{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\onecolumnbottominarea[hpagesi]{static}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\onecolumnDbottominarea[hpagesi]{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:

40

\onecolumnbottominarea[hpagesi]{dynamic}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\onecolumnbottom[hpagesi]{htypei}{hHi}
As \onecolumnbottominarea where the area is the entire typeblock.
\onecolumnSbottom[hpagesi]{hHi}
This is equivalent to: \onecolumnbottom[hpagesi]{static}{hHi}
\onecolumnDbottom[hpagesi]{hHi}
This is equivalent to: \onecolumnbottom[hpagesi]{dynamic}{hHi}
\twocolumnSbottominarea[hpagesi]{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\twocolumnbottominarea[hpagesi]{static}{hHi}{hwidthi}{hheighti}{hxi}{hyi}

\twocolumnDbottominarea[hpagesi]{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\twocolumnbottominarea[hpagesi]{dynamic}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\twocolumnbottom[hpagesi]{htypei}{hHi}
As \twocolumnbottominarea where the area is the entire typeblock.
\twocolumnSbottom[hpagesi]{hHi}
This is equivalent to: \twocolumnbottom[hpagesi]{static}{hHi}
\twocolumnDbottom[hpagesi]{hHi}
This is equivalent to: \twocolumnbottom[hpagesi]{dynamic}{hHi}
\NcolumnSbottominarea[hpagesi]{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}

41

This is equivalent to:


\Ncolumnbottominarea[hpagesi]{static}{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\NcolumnDbottominarea[hpagesi]{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
This is equivalent to:
\Ncolumnbottominarea[hpagesi]{dynamic}{hni}{hHi}{hwidthi}{hheighti}{hxi}{hyi}
\Ncolumnbottom[hpagesi]{htypei}{hni}{hHi}
As \Ncolumnbottominarea where the area is the entire typeblock.
\NcolumnSbottom[hpagesi]{hni}{hHi}
This is equivalent to: \Ncolumnbottom[hpagesi]{static}{hni}{hHi}
\NcolumnDbottom[hpagesi]{hni}{hHi}

This is equivalent to: \Ncolumnbottom[hpagesi]{dynamic}{hni}{hHi}

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

42

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, hpagesi is the page list for which those
static frames are defined (all is the default). For the vertical strips: hxoffseti is the amount by which the
frames should be shifted horizontally (0pt by default), hW1i is the width of the first frame, with colour
specified by hC1i and IDL hL1i, and so on up to hWni the width of the hnith frame with colour specified
by hCni and IDL hLni. For the vertical strips: hyoffseti is the amount by which the frames should be
shifted vertically (0pt by default), hH1i is the height of the first frame, with colour specified by hC1i and
IDL hL1i, and so on up to hHni the height of the hnith frame with colour specified by hCni and IDL hLni.
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}.

5.4.1

Vertical stripe effects


5

\vtwotone[hpagesi][hxoffseti]{hW1i}{hC1i}{hL1i}{hW2i}{hC2i}{hL2i}
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 this document.)
\vNtone[hpagesi][hxoffseti]{hni}{hW1i}{hC1i}{hL1i}. . . {hWni}{hCni}{hLni}
This is similar to \vtwotone but with hni static frames instead of two.
\vtwotonebottom[hpagesi][hxoffseti]{hHi}{hW1i}{hC1i}{hL1i}{hW2i}{hC2i}{hL2i}
This is similar to \vtwotone but the static frames are only hHi high, instead of the entire height of the
page. The frames are aligned along the bottom edge of the page.
\vtwotonetop[hpagesi][hxoffseti]{hHi}{hW1i}{hC1i}{hL1i}{hW2i}{hC2i}
{hL2i}
This is similar to \vtwotone but the static frames are only hHi high, instead of the entire height of the

43

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 this document. Two \vtwotonetop commands were used, one for
the even pages, and the other for the odd pages.)
\vNtonebottom[hpagesi][hxoffseti]{hHi}{hni}{hW1i}{hC1i}{hL1i}. . . {hWni}{hCni}{hLni}
This is a general version of \vtwotonebottom for hni frames instead of two.
\vNtonetop[hpagesi][hxoffseti]{hHi}{hni}{hW1i}{hC1i}{hL1i}. . . {hWni}{hCni}{hLni}
This is a general version of \vtwotonetop for hni frames instead of two.

5.4.2

Horizontal stripe effect

\htwotone[hpagesi][hyoffseti]{hH1i}{hC1i}{hL1i}{hH2i}{hC2i}{hL2i}
This defines two static frames to create a two tone horizontal strip effect.
\hNtone[hpagesi][hyoffseti]{hni}{hH1i}{hC1i}{hL1i}. . . {hHni}{hCni}{hLni}

This is similar to \htwotone but with hni static frames instead of two.
\htwotoneleft[hpagesi][hyoffseti]{hWi}{hH1i}{hC1i}{hL1i}{hH2i}{hC2i}{hL2i}
This is similar to \htwotone but the static frames are only hWi wide, instead of the entire width of the
page. The frames are aligned along the left edge of the page.
\htwotoneright[hpagesi][hyoffseti]{hWi}{hH1i}{hC1i}{hL1i}{hH2i}{hC2i}{hL2i}
This is similar to \htwotone but the static frames are only hWi wide, instead of the entire width of the
page. The frames are aligned along the right edge of the page.
\hNtoneleft[hpagesi][hyoffseti]{hWi}{hni}{hH1i}{hC1i}{hL1i}. . . {hHni}{hCni}{hLni}
This is a general version of \htwotoneleft for hni frames instead of two.
\hNtoneright[hpagesi][hyoffseti]{hWi}{hni}{hH1i}{hC1i}{hL1i}. . . {hHni}{hCni}{hLni}

44

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

5.4.3

Background Frame

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


\makebackgroundframe[hpagesi][hIDLi]
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.

5.4.4

Vertical and Horizontal Rules

You can create vertical or horizontal rules between two frames using the commands:
\insertvrule[hy topi][hy bottomi]{hT1i}{hIDN1i}{hT2i}{hIDN2i}
This creates a new static frame which fits between hT1i frame with IDN hIDN1i and hT2i frame with IDN
hIDN2i, 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 hy topi (default 0pt) extends the rule by that much
above the highest point, and the second optional argument hy bottomi (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[hx lefti][hx righti]{hT1i}{hIDN1i}{hT2i}{hIDN2i}
This creates a new static frame which fits between hT1i frame with IDN hIDN1i and hT2i frame with
IDN hIDN2i, 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 hx lefti (default 0pt) extends the rule by

45

that much before the leftmost point, and the second optional argument hx righti (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, hT1i
and hT2i 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}

46

\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}

47

48

6.1

Thumbtabs

On the right hand side of this page, 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 the package option thumbtabs. This is a key=value
option, where the value may be one of title (show the title but not the numberdefault), number (show the
number but not the title), both (show the number and the title) and none (dont show the number or title).
If you want thumbtabs in your document, you need to use the command

6. Thumbtabs and
Minitocs
6.1
6.2

Thumbtabs . . . . . . . . . . . . . . . . . . . . .
Minitocs . . . . . . . . . . . . . . . . . . . . . . .

49
51

This chapter describes how to create thumbtabs and minitocs, such


as those used in this document.

\makethumbtabs[hy offseti]{hheighti}[hsection typei]


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 hy offseti. Each thumbtab will be hheighti high,
and will correspond to the sectioning type hsection typei. If hsection typei 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 thumbtabs1 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.
1 but

only do this if there is enough room on the page!

49

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{hni}{hkey value listi}
where hni 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 hni to indicate that the new attributes should apply to
all thumbtabs.
To just change the settings for the thumbtab index, use

\setthumbtabindex{hni}{hkey value listi}


The hkey value listi for both these commands is the same as that for \setdynamicframe. Again hni
may either be the thumbtab index or the keyword all.
By default, the thumbtabs have a grey background. In this document, I have 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}}

50

to change the thumbtab background colour to shades of blue.


I have 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 \hypersetup2 to change the colour of the hyperlink text, since the hyperlink
overrides the text colour.

6.2

Minitocs

In this document, after each chapter heading, there is a mini table of contents for that chapter. To enable
minitocs, use the command
\enableminitoc[hsection typei]
The default hsection typei is the same as that used by the thumbtabs.
If you want the minitocs to appear in a dynamic frame, you can use
\appenddfminitoc{hIDNi}
where hIDNi 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 this document I have used the command:

\appenddfminitoc*{chaphead}
in the preamble, which has appended the minitocs to the dynamic frame with IDL chaphead.
The style of the minitoc text is given by the command
\minitocstyle{hcontentsi}
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
2 defined

by the hyperref package

51

and the gap after the minitoc is given by the length


\afterminitocskip
These lengths may be changed using \setlength.

52

7.1

Macros

The following macros can be changed using \renewcommand:


\setffdraftcolor
This sets the colour of the bounding box when it is displayed in draft mode. The default value is:
\color[gray]{0.8}. For example, if you want a darker grey, do:
\renewcommand{\setffdraftcolor}{\color[gray]{0.3}}

7. Global Settings
7.1
7.2
7.3

Macros . . . . . . . . . . . . . . . . . . . . . . .
Lengths . . . . . . . . . . . . . . . . . . . . . . .
Counters . . . . . . . . . . . . . . . . . . . . . . .

53
53
55

This section describes style macros, lengths and counters used by


the flowfram package.

\setffdrafttypeblockcolor
This sets the colour of the bounding box of the typeblock when it is displayed in draft mode. The
default value is: \color[gray]{0.9}. For example, if you want a medium grey, do:
\renewcommand{\setffdrafttypeblockcolor}{\color[gray]{0.5}}
\fflabelfont
This sets the font size for the bounding box markers in draft mode. The default value is: \small\sffamily.
For example, if you want a larger font, do:
\renewcommand{\fflabelfont}{\large\sffamily}
\ffruledeclarations
This sets the declarations that affect the rules created using \insertvrule and \inserthrule.
The default definition does nothing. See subsection 5.4.4 for further details.
\ffcontinuedtextfont{htexti}
This sets htexti in the continuation font. The default definition does \emph{\small htexti}. See
section 2.2 and section 2.3 for further details.

7.2

Lengths

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


\fflabelsep
This is the distance from the right hand side of the bounding box at which to place the bounding
box marker. The default value is: 1pt

53

\flowframesep
This is the gap between the text of the frame and its border, for the standard border types.
\flowframerule
This is the width of the frames border, if using a border given by a frame making command that
uses \fboxsep to set its border width (e.g. \fbox).
\sdfparindent
This is the paragraph indentation within static or dynamic frames. The default value is 0pt.
\vcolumnsep
This is the approximate vertical distance between the top frame and the column frames when using
\Ncolumntop etc. (The height of the flow frame may be adjusted to make it an integer multiple
of \baselineskip.)
\columnsep
This is the horizontal distance between the column frames when using \Ncolumn or \Ncolumntop
etc
\ffcolumnseprule
This is the width of vertical rules created using \insertvrule or the height of horizontal rules
created using \inserthrule.
\beforeminitocskip

This is the vertical distance before the minitoc.


\afterminitocskip
This is the vertical distance after the minitoc.
\fftolerance
The output routine will issue a warning when a paragraph spans two flow frames of unequal width,
unless the difference in width is less than the value of \fftolerance.

54

7.3

Counters

The following are counters that can be accessed via \value{hcounter namei} or via \thehcounter
namei. 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{hlabeli}
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{hlabeli}. Note that this will always refer to the
current flow frame even when used in the contents of a static or dynamic frame.
Dont 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{hlabeli}
and reference it elsewhere in the document using \ref{hlabeli}. For example, if you are using a
column layout, you might want to do something like:
This text is about hippos\labelflow{hippos}.

7
% Somewhere else in the document
See column\ref{hippos} on page\pageref{hippos}
for information on hippos.
Dont 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.

55

maxdynamic The total number of dynamic frames that have been defined so far.
maxthumbtabs The total number of thumbtabs.
absolutepage The absolute page number.

56

8. Troubleshooting

For an up-to-date list of frequently asked questions, see http://www.dickimaw-books.com/


faqs/flowframfaq.html. If you have a query that is not addressed here, please try there first.
If that doesnt answer your query, try posting a message to TEX on StackExchange (http://tex.
8.1 General Queries . . . . . . . . . . . . . .
stackexchange.com/), the LATEX Community Forum (http://latex-community.org/forum/)
8.2 Unexpected Output . . . . . . . . . . . .
or the comp.text.tex newsgroup. I generally answer questions in those places much quicker than
8.3 Error Messages . . . . . . . . . . . . . .
queries that are emailed to me, which tend to get lost in my inbox.
Bugs can be reported using the form at http://www.dickimaw-books.com/bug-report.
This chapter should be consulted if you experience
html
using the flowfram package.

8.1

. . . . .
. . . . .
. . . . .

57
59
61

any problems

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. Can I use the formatted page number in page lists?
No.
3. 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:
(a) 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 hasnt yet.
So it is looking for a flow frame defined on page 15, not on page A.
(b) 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. Can I have an arbitrarily shaped frame?

You can assign certain irregular shapes to static or dynamic frames, using the shape key (see section 3.1). 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.

57

5. Why has the text from my flow frame appeared in a static frame or dynamic frame?
Assuming you havent inadvertently set that text as the contents of the static or dynamic frame,
the frames are most likely overlapping (see section 1.5). In an attempt to clarify whats going on,
suppose you have defined a static frame, a dynamic frame and two flow frames. The following is
an approximate1 analogy: TEX has a sheet of paper on the table, and has pencilled2 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 its 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
its 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 its also possible that the overlap is caused by an overfull hbox thats 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.
6. Why do I get lots of overfull hbox messages?
Probably because you have narrow frames. Its better to use ragged right formatting when the
frames are narrow.
7. 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.

1 The

pedantic may point out that TEX may make several attempts to fill in the flow frames depending on penalties and so on.
it hasnt drawn anything really, but it has in its minds eye.

2 actually

58

8. 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.
9. 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).
10. How do I compute the distance from the edge of the page instead of the typeblock?
See section 4.1.
11. Is there a GUI I can use to make it easier to create the frames?
Yes, flowframtk which can be downloaded from: http://www.dickimaw-books.com/
apps/flowframtk/

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
subsection 2.1.1).
2. 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 chapter 3).
3. 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)

59

to:
% Optionally choose a default paper size other than U.S. letter.
(a4)
4. I dont have any output.
All your flow frames are empty. TEX doesnt 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 wont 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 its enough to convince TEX that the document contains some text.
5. The last page hasnt appeared.
See the previous answer.
6. 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}
7. 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.
8. 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.

60

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 offset3 .
2. Missing number, treated as zero
LATEX is expecting a number. There are a number of possible causes:
(a) 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 \sethtypeiframe commands, or when setting
the contents of static frames or dynamic frames.
(b) When specifying page lists, you have mixed keywords with page ranges. For example: 1,even
is invalid.
3. Flow frame IDL hlabeli 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.
4. Cant 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}{hoptionsi}, then you will get this error, because
mylabel refers to a static frame not a flow frame.)
5. Key clear is boolean
The clear key can only have the values true or false.
6. Key clear not available
The clear key is only available for static or dynamic frames.

7. Key style not available


The style key is only available for dynamic frames.
3 offset

can also have the value compute

61

8. Key margin not available


The margin key is only available for flow frames.
9. Key shape not available
The shape key is only available for static or dynamic frames.
10. Dynamic frame style hstylei not defined
The specified style hstylei 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.
11. 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.
12. 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.
13. 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.
14. No room for a new \skip
You have exceeded TEXs 256 register limit. Use the etex package.
15. \verb illegal in command argument
As a general rule, you cant use verbatim text in a command argument. This rule applies to all the
commands defined by the flowfram package. See also below.
16. 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 page 12.)

62

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.

Glossary

dynamic frame
Frames in which text is fixed in place, but the contents are re-typeset each time the frame is displayed.
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.
frame making command
A LATEX command which places some kind of border around its argument. For example: \fbox.
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.
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.
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.
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. 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 pages=absolute.

63

page range
Page ranges can be closed, e.g. 5-10, or open, e.g. <7 or >9.
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.
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.

64

A
absolutepage counter, 56

\afterminitocskip, 52, 54
\appenddfminitoc, 51
\appenddynamiccontents, 12
\appenddynamiccontents*, 12
B
\baselineskip, 37, 38, 54
\beforeminitocskip, 51, 54
bounding box, 24, 20, 21, 23, 53, 57, 63
C
\caption, 2
\chapter, 3, 12, 24, 49
\chapterfirstpagestyle, 3
\cleardoublepage, 3, 6, 25
\clearpage, 3, 6
color option, 2
false, 2, 3
true, 2
color package, 1
\columnsep, 37, 54
\columnseprule, 45
\computebottomedge, 31
\computeleftedgeeven, 31
\computeleftedgeodd, 31
\computerightedgeeven, 31
\computerightedgeodd, 31
\computetopedge, 31
\continueonframe, 8, 9, 1315, 34
D
\dfchaphead, 12

\DFchapterstyle, 12
\DFschapterstyle, 12
\dfswapoddeven, 18
\diamondshape, 25
\disablethumbtabs, 49
displayedframe counter, 55
document environment, 1, 5, 25, 63
\doublebox, 19, 20
draft option, 14
\dynamicaddexclusion, 22
dynamiccontents environment, 1013, 15, 62
dynamiccontents* environment, 12, 13, 15
\dynamicsetexclusion, 22
\dynamicsetpagelist, 21
\dynamicswitchoffnext, 27
\dynamicswitchoffnext*, 27
\dynamicswitchoffnextodd, 27
\dynamicswitchoffnextodd*, 27
\dynamicswitchoffnextoddonly, 28
\dynamicswitchoffnextoddonly*, 28
\dynamicswitchoffnextonly, 27
\dynamicswitchoffnextonly*, 27
\dynamicswitchonnext, 27
\dynamicswitchonnext*, 27
\dynamicswitchonnextodd, 27
\dynamicswitchonnextodd*, 27
\dynamicswitchonnextoddonly, 27
\dynamicswitchonnextoddonly*, 27
\dynamicswitchonnextonly, 27
\dynamicswitchonnextonly*, 27

Index
A
B
C
D
E
F
G
H
I
L
M
N
O
P
R
S
T
V

E
\enableminitoc, 51
\enablethumbtabs, 49
etex package, 62
\evensidemargin, 1

65

Index

A
B
C
D
E
F
G
H
I
L
M
N
O
P
R
S
T
V

66

fancybox package, 19

\fbox, 19, 20, 54, 63


\fboxsep, 54
\FFabove, 33
\FFaboveleft, 33
\FFaboveright, 33
\ffareaheight, 32
\ffareawidth, 32
\ffareax, 32
\ffareay, 32
\FFbelow, 33
\FFbelowleft, 33
\FFbelowright, 33
\ffcolumnseprule, 45, 46, 54
\ffcontinuedtextfont, 9, 14, 53
\ffcontinuedtextlayout, 9, 14
\ffhrule, 46
\fflabelfont, 53
\fflabelsep, 53
\FFleft, 33
\FFoverlap, 33
\ffprechapterhook, 3
\FFright, 33
\ffruledeclarations, 46, 53
\ffswapoddeven, 18
\fftolerance, 6, 54
\ffvadjustfalse, 37
\ffvrule, 45
figure environment, 2
figure* environment, 2
final option, 1
\flowaddexclusion, 22
\flowframerule, 20, 54
\flowframesep, 20, 54
\flowframeshowlayout, 3

\flowsetexclusion, 22
\flowsetpagelist, 21
\flowswitchoffnext, 26
\flowswitchoffnext*, 26
\flowswitchoffnextodd, 26
\flowswitchoffnextodd*, 26
\flowswitchoffnextoddonly, 26
\flowswitchoffnextoddonly*, 26
\flowswitchoffnextonly, 26
\flowswitchoffnextonly*, 26
\flowswitchonnext, 26
\flowswitchonnext*, 26
\flowswitchonnextodd, 26
\flowswitchonnextodd*, 26
\flowswitchonnextoddonly, 26
\flowswitchonnextoddonly*, 26
\flowswitchonnextonly, 26
\flowswitchonnextonly*, 26
frame, 17, 9, 11, 15, 1719, 21, 23, 24, 3134, 37,
38, 45, 46, 50, 54, 55, 5759, 61, 63
dynamic, 14, 1013, 15, 1719, 23, 27, 28,
34, 51, 56, 58, 60, 61, 63
flow, 1, 2, 46, 1719, 22, 23, 26, 27, 34, 37,
38, 42, 46, 54, 55, 5763
static, 14, 7, 8, 10, 1719, 2325, 28, 29, 43
46, 55, 58, 60, 61, 64
frame making command, 1921, 54, 63
frame settings
angle, 23
backcolor, 21
border, 19
bordercolor, 21
clear, 22, 23, 58, 64
evenx, 18
eveny, 19
excludedpages, 22
excludepages, 22

height, 18
hide, 22
hidethis, 22
label, 19
margin, 22
oddx, 19
oddy, 19
offset, 20
pages, 21, 22
shape, 2325, 57
style, 23
textcolor, 21
valign, 19, 59
width, 18
x, 18
y, 18
\framebreak, 6, 59
G
\getdynamicbounds, 32
\getdynamicbounds*, 32
\getdynamicid, 11
\getdynamiclabel, 10, 11
\getflowbounds, 32
\getflowbounds*, 32
\getflowid, 5, 6
\getflowlabel, 5, 6
\getstaticbounds, 32
\getstaticbounds*, 32
\getstaticid, 7
\getstaticlabel, 7
ghostscript, 59
H
\heartshape, 25
\hNtone, 44

\hNtoneleft, 44
\hNtoneright, 44
\hsize, 6, 59
html package, 4
\htwotone, 44
\htwotoneleft, 44
\htwotoneright, 44, 45
hyperref package, 1, 49, 51
\hypersetup, 51
I
identification label, see IDL
identification number, see IDN
IDL, 2, 58, 1013, 18, 19, 25, 3234, 43, 46, 51,
61, 63
IDN, 28, 1013, 18, 19, 21, 22, 25, 3234, 45, 46,
50, 51, 55, 60, 61, 63
\inserthrule, 45, 46, 53, 54
\insertvrule, 45, 46, 53, 54
\item, 62
L

Index
A
B
C
D
E
F
G
H
I
L
M
N
O
P
R
S

\label, 2, 10, 23, 55, 58


\labelflow, 55
\labelflowid, 55
\lefttorightcolumnsfalse, 42
\lefttorightcolumnstrue, 42
longtable package, 1
LR option, 2

T
V

M
\mainmatter, 25
\makebackgroundframe, 45
\makedfheaderfooter, 13
\makethumbtabs, 49

67

Index
A
B

maxdynamic counter, 56
maxflow counter, 55
maxstatic counter, 55
maxthumbtabs counter, 50, 56

\minitocstyle, 51

E
F
G
H
I
L
M
N
O
P
R
S
T
V

\Ncolumn, 37, 42, 54


\Ncolumnbottom, 42
\Ncolumnbottominarea, 38, 42
\NcolumnDbottom, 42
\NcolumnDbottominarea, 42
\NcolumnDtop, 40
\NcolumnDtopinarea, 40
\Ncolumninarea, 37
\NcolumnSbottom, 42
\NcolumnSbottominarea, 41
\NcolumnStop, 40
\NcolumnStopinarea, 40
\Ncolumntop, 40, 54
\Ncolumntopinarea, 38, 40
\newdynamicframe, 10
\newdynamicframe*, 11
\newflowframe, 5, 7, 10
\newflowframe*, 6
\newpage, 6
\newstaticframe, 7, 10
\newstaticframe*, 8
norotate option, 50
\nutshape, 25
O
\oddsidemargin, 1
\onecolumn, 37, 59
\onecolumnbottom, 41
\onecolumnbottominarea, 38, 40, 41

68

\onecolumnDbottom, 41
\onecolumnDbottominarea, 40
\onecolumnDtop, 39
\onecolumnDtopinarea, 39
\onecolumninarea, 37
\onecolumnSbottom, 41
\onecolumnSbottominarea, 40
\onecolumnStop, 39
\onecolumnStopinarea, 39
\onecolumntop, 39
\onecolumntopinarea, 38, 39
\Ovalbox, 19, 20
\ovalbox, 19, 20
P
page list, 1, 5, 7, 25, 37, 38, 43, 57, 63
page range, 5, 21, 64
\pagebreak, 6
pages option, 1
absolute, 1, 5, 21, 25, 63
relative, 1, 21
\par, 24
\parshape, 2325, 60
\part, 24
R
\ref, 55
\relativeframelocation, 33, 34
\relativeframelocation*, 33
\relax, 23, 24
\reldynamicloc, 34
\relflowloc, 34
\relstaticloc, 34
\renewcommand, 53
RL option, 2, 42
rotate option, 2

false, 2, 3
true, 2

S
\sdfparindent, 54, 60
\setalldynamicframes, 17
\setallflowframes, 17
\setallstaticframes, 17
\setdynamiccontents, 11, 15, 22
\setdynamiccontents*, 11
\setdynamicframe, 11, 13, 17, 50, 59
\setdynamicframe*, 17
\setffdraftcolor, 53
\setffdrafttypeblockcolor, 53
\setflowframe, 6, 17, 21, 22
\setflowframe*, 17, 61
\setlength, 52, 53
\setstaticcontents, 8, 22, 64
\setstaticcontents*, 8
\setstaticframe, 17, 24, 25, 59
\setstaticframe*, 17
\setthumbtab, 50
\setthumbtabindex, 50
\sfswapoddeven, 18
\shadowbox, 19, 20
\Shapepar, 23, 24
shapepar package, 2325
\shapepar, 2325
\showframebboxfalse, 3
\showframebboxtrue, 3
\showmarginsfalse, 3
\showmarginstrue, 3
\showtypeblockfalse, 3
\showtypeblocktrue, 3
\simpar, 24
\squareshape, 25

\staticaddexclusion, 22
staticcontents environment, 8, 10, 22, 24, 25
staticcontents* environment, 8
staticfigure environment, 2, 62
\staticsetexclusion, 22
\staticsetpagelist, 21
\staticswitchoffnext, 28
\staticswitchoffnext*, 28
\staticswitchoffnextodd, 28
\staticswitchoffnextodd*, 28
\staticswitchoffnextoddonly, 29
\staticswitchoffnextoddonly*, 29
\staticswitchoffnextonly, 28
\staticswitchoffnextonly*, 28
\staticswitchonnext, 28
\staticswitchonnext*, 28
\staticswitchonnextodd, 28
\staticswitchonnextodd*, 28
\staticswitchonnextoddonly, 28
\staticswitchonnextoddonly*, 28
\staticswitchonnextonly, 28
\staticswitchonnextonly*, 28
statictable environment, 2, 62
T

Index
A
B
C
D
E
F
G
H
I
L
M
N
O
P
R
S
T
V

table environment, 2
table* environment, 2

\tableofcontents, 49
\textheight, 64
\textwidth, 64
theindex environment, 59
thisframe counter, 55
\thumbtabformat, 50
\thumbtabindex, 49
\thumbtabindexformat, 50
thumbtabs option, 1, 49

69

Index

both, 49
none, 49
number, 49
title, 49

A
B
C

\thumbtabwidth, 49
tikz package, 19, 46
\tocandthumbtabindex, 49, 50
\twocolumn, 37, 42, 59
\twocolumnbottom, 41
\twocolumnbottominarea, 38, 41
\twocolumnDbottom, 41
\twocolumnDbottominarea, 41
\twocolumnDtop, 40
\twocolumnDtopinarea, 39
\twocolumninarea, 37
\twocolumnSbottom, 41
\twocolumnSbottominarea, 41
\twocolumnStop, 40
\twocolumnStopinarea, 39
\twocolumntop, 39, 40
\twocolumntopinarea, 38, 39
typeblock, 13, 5, 7, 31, 3743, 49, 53, 5759, 64

D
E
F
G
H
I
L
M
N
O
P

T
V

70

\value, 55
\vcolumnsep, 38, 54
verbatim text, 1012, 15, 62
verbose option, 2
false, 2
true, 2
\vNtone, 43
\vNtonebottom, 44
\vNtonetop, 44
\vtwotone, 43
\vtwotonebottom, 43, 44
\vtwotonetop, 43, 44

You might also like