Newsgroups: comp.text.tex
From: piet@cs.ruu.nl (Piet van Oostrum)
Subject: New fancyheadings (was Re: Page Number on the Top of the page in LaTeX/book.sty)
In-Reply-To: "George D. Greenwade" <bed_gdg@SHSU.edu>
Date: Mon, 18 Jan 1993 11:39:08 GMT
Reply-To: piet@cs.ruu.nl (Piet van Oostrum)
Organization: Dept of Computer Science, Utrecht University, The Netherlands

Here is the newest version of fancyheadings:

--------------------------- fancyheadings.doc ---------------------------
Here is a documentstylestyle option that allows you to customize your
page headers and footers in an easy way. It combines features that were
separately available in other pagestyles, without introducing much
complexity. You can define:
    - three-part headers and footers
    - rules in header and footer
    - headers and footers wider than \textwidth
    - multiline headers and footers
    - separate headers and footers for even and odd pages
    - separate headers and footers for chapter pages

To use this pagestyle, you must include the ``fancyheadings'' style
option in your \documentstyle, and issue the \pagestyle{fancy} command.
The \pagestyle{fancy} command should be issued after any changes made to
\textwidth.

The page layout will be as follows:

		LHEAD          CHEAD          RHEAD
		----------------------------------- (rule)

			     page body


		----------------------------------- (rule)
		LFOOT	       CFOOT	      RFOOT

The L-fields will be leftadjusted, the C-fields centered and the
R-fields rightadjusted.
Each of the six fields and the two rules can be defined separately.

Simple use:

The header and footer fields can be defined by commands \lhead{LHEAD}
and so on for the other fields. If the field depends on something in the
document (e.g. section titles) you must in general use the \markboth and
\markright commands, otherwise a title may end on the wrong page. You
can do this e.g. by redefining the commands \chaptermark, \sectionmark
and so on (see example below). The defaults for these marks are as in
the standard pagestyles. The marks can be put into a header or footer
field by referencing \leftmark and \rightmark.

Rules in header and footer

The thickness of the rules below the header and above the footer can be
changed by redefining the length parameters \headrulewidth (default
0.4pt) and \footrulewidth (default 0). These may be redefined by the
\setlength command. A thickness of 0pt makes the rule invisible.
If you want to make more complicated changes, you have to redefine the
commands \headrule and/or \footrule.

E.g. If you want a dotted line rather than a ruler you can give the
command:
\renewcommand{\headrule}{\vbox to 0pt{\hbox to\headwidth{\dotfill}\vss}}

Headers and footers wider than \textwidth

The headers and footers are set in a box of width \headwidth. The
default for this is the value of \textwidth. You can make it wider (or
smaller) by redefining \headwidth with the \setlength or \addtolength
command. The headers and footers will stick out the page on the same
side as the marginal notes. For example to include the marginal notes,
add both \marginparsep and \marginparwidth to \headwidth (see also the
example below).

Multiline headers and footers

Each of the six fields is set in an appropriate parbox, so you can put a
multiline part in it with the \\ command. It is also possible to put
extra space in it with the \vspace command. Note that if you do this you
will probably have to increase the \headheight or \footskip lengths.

Separate headers and footers for even and odd pages

If you want the headers and footers to be different on even- and
odd-numbered pages in the ``twoside'' style, the field-defining macros
can be given an optional argument, to be used on the even-numbered
pages, like \lhead[EVEN-LHEAD]{ODD-LHEAD}.

Separate headers and footers for chapter pages

LaTeX gives a \thispagestyle{plain} command for the first page of the
document, the first page of each chapter and a couple of other pages. It
might be incompatible with your pagestyle. In this case you can use a
slightly different version of the pagestyle, called \pagestyle{fancyplain}. 
This pagestyle redefines the pagestyle ``plain'' to also use pagestyle
``fancy'' with the following modifications:
    - the thicknesses of the rules is defined by \plainheadrulewidth and
      \plainfootrulewidth (both default 0).
    - the 6 fields may be defined separately for the plain pages by
      giving them the value \fancyplain{PLAIN-VALUE}{NORMAL-VALUE}. This
      construct may be used in both the optional argument and the normal
      argument. Thus \lhead[\fancyplain{F1}{F2}]{\fancyplain{F3}{F4}}
      specifies the LHEAD value in a two-sided document:
	F1 on an even-numbered ``plain'' page
	F2 on an even-numbered normal page
	F3 on an odd-numbered ``plain'' page
	F4 on an odd-numbered normal page.

Defaults:

\headrulewidth 	      0.4pt
\footrulewidth		0pt
\plainheadrulewidth	0pt
\plainfootrulewidth	0pt

\lhead[\fancyplain{}{\sl\rightmark}]{\fancyplain{}{\sl\leftmark}}
%  i.e. empty on ``plain'' pages \rightmark on even, \leftmark on odd pages
\chead{}
\rhead[\fancyplain{}{\sl\leftmark}]{\fancyplain{}{\sl\rightmark}}
%  i.e. empty on ``plain'' pages \leftmark on even, \rightmark on odd pages
\lfoot{}
\cfoot{\rm\thepage} % page number
\rfoot{}

Examples:

To put two lines containing the section title and the subsection title
in the righthandside corner, use:

\documentstyle[fancyheadings]{article}
\pagestyle{fancy}
\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
\renewcommand{\subsectionmark}[1]{\markright{#1}}
\rfoot{\leftmark\\\rightmark}

The following definitions give an approximation of the style used in the
LaTeX book:

\documentstyle[fancyheadings]{book}
\pagestyle{fancyplain}
\addtolength{\headwidth}{\marginparsep}
\addtolength{\headwidth}{\marginparwidth}
\renewcommand{\chaptermark}[1]{\markboth{#1}{#1}} % remember chapter title
\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
                                                % section number and title
\lhead[\fancyplain{}{\bf\thepage}]{\fancyplain{}{\bf\rightmark}}
\rhead[\fancyplain{}{\bf\leftmark}]{\fancyplain{}{\bf\thepage}}
\cfoot{}

Using section titles etc. in the headers and/or footers:

You can't just change the header and/or footer fields in the middle of some
text (e.g. after a section header). This is because TeX may have processed
a bit more text before deciding to make up the page. It may have passed a
section beginning, causing the wrong title on the page.  TeX has a
mechanism called 'marks' to solve this problem.  There is in LaTeX a
\leftmark and a \rightmark. Usually \leftmark is a chapter title and
\rightmark is a section title. To set the marks there are two commands:
\markboth{L}{R} sets the \leftmark to L and the rightmark to R, and
\rightmark{R} sets only the rightmark to R.
The default definitions of \section etc. do this already for you.

An example follows:

	left page						right page
	---------						----------

2	     CHAPTER 1. Introduction | 1.2 Some section                        3
------------------------------------ | -----------------------------------------
                                     |
Text                                 | more text
Text                                 | more text
Text                                 | more text
                                     |
                                     |
                                     |

This can be easily done with fancyheadings as follows:

\pagestyle{fancy}
\setlength{\headrulewidth}{1pt}
\lhead[\rm\thepage]{\sl\rightmark}
\rhead[\sl\leftmark]{\rm\thepage}

This specifies that on even pages (the [] parts) the leftheadpart is page
number and rightheadpart is \leftmark, which is the chapter title (because that
is given as the left argument of \markboth (see page 162 of the LaTeX book)

On odd pages (the parts between {}) the leftheadpart is \rightmark (which
is the last section title because that is given as argument to \markright
(see the same page), and the rightheadpart is the page no.

Now suppose you don't want the section number and you want the section
title in upper case:
You add the following to your preamble:

\renewcommand{\sectionmark}[1]{\markright{\uppercase{#1}}}

Or if you don't want the chapter number but only the chapter title (not in
uppercase):

\renewcommand{\chaptermark}[1]{\markboth{#1}{ }}

Note: the parameter in both cases is the (section|chapter) title.

KNOWN PROBLEMS:

Sometimes you will get a warning message from LaTeX concerning ``overfull
vbox during output''. In this case you have to increase the \headheight or
\footskip lengths or both (with \addtolength or \setlength).

If you want to use fancyheadings with the letter style, you must put the
following command in the beginning of your document:
\mark{{}{}}
--------------------------- fancyheadings.sty ---------------------------
% fancyheadings.sty version 1.1
% Fancy headers and footers.
% Piet van Oostrum, Dept of Computer Science, University of Utrecht
% Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands
% Telephone: +31-30-531806. piet@cs.ruu.nl (mcvax!hp4nl!ruuinf!piet)
% Sep 23, 1992.

\def\lhead{\@ifnextchar[{\@xlhead}{\@ylhead}}
\def\@xlhead[#1]#2{\gdef\@elhead{#1}\gdef\@olhead{#2}}
\def\@ylhead#1{\gdef\@elhead{#1}\gdef\@olhead{#1}}

\def\chead{\@ifnextchar[{\@xchead}{\@ychead}}
\def\@xchead[#1]#2{\gdef\@echead{#1}\gdef\@ochead{#2}}
\def\@ychead#1{\gdef\@echead{#1}\gdef\@ochead{#1}}

\def\rhead{\@ifnextchar[{\@xrhead}{\@yrhead}}
\def\@xrhead[#1]#2{\gdef\@erhead{#1}\gdef\@orhead{#2}}
\def\@yrhead#1{\gdef\@erhead{#1}\gdef\@orhead{#1}}

\def\lfoot{\@ifnextchar[{\@xlfoot}{\@ylfoot}}
\def\@xlfoot[#1]#2{\gdef\@elfoot{#1}\gdef\@olfoot{#2}}
\def\@ylfoot#1{\gdef\@elfoot{#1}\gdef\@olfoot{#1}}

\def\cfoot{\@ifnextchar[{\@xcfoot}{\@ycfoot}}
\def\@xcfoot[#1]#2{\gdef\@ecfoot{#1}\gdef\@ocfoot{#2}}
\def\@ycfoot#1{\gdef\@ecfoot{#1}\gdef\@ocfoot{#1}}

\def\rfoot{\@ifnextchar[{\@xrfoot}{\@yrfoot}}
\def\@xrfoot[#1]#2{\gdef\@erfoot{#1}\gdef\@orfoot{#2}}
\def\@yrfoot#1{\gdef\@erfoot{#1}\gdef\@orfoot{#1}}

\newdimen\headrulewidth
\newdimen\footrulewidth
\newdimen\plainheadrulewidth
\newdimen\plainfootrulewidth
\newdimen\headwidth
\newif\if@fancyplain \@fancyplainfalse
\def\fancyplain#1#2{\if@fancyplain#1\else#2\fi}

% Initialization of the head and foot text.

\headrulewidth 0.4pt
\footrulewidth\z@
\plainheadrulewidth\z@
\plainfootrulewidth\z@

\lhead[\fancyplain{}{\sl\rightmark}]{\fancyplain{}{\sl\leftmark}}
%  i.e. empty on ``plain'' pages \rightmark on even, \leftmark on odd pages
\chead{}
\rhead[\fancyplain{}{\sl\leftmark}]{\fancyplain{}{\sl\rightmark}}
%  i.e. empty on ``plain'' pages \leftmark on even, \rightmark on odd pages
\lfoot{}
\cfoot{\rm\thepage} % page number
\rfoot{}

% Put together a header or footer given the left, center and
% right text, fillers at left and right and a rule.
% The \lap commands put the text into an hbox of zero size,
% so overlapping text does not generate an errormessage.

\def\@fancyhead#1#2#3#4#5{#1\hbox to\headwidth{\vbox{\hbox
{\rlap{\parbox[b]{\headwidth}{\raggedright#2\strut}}\hfill
\parbox[b]{\headwidth}{\centering#3\strut}\hfill
\llap{\parbox[b]{\headwidth}{\raggedleft#4\strut}}}\headrule}}#5}


\def\@fancyfoot#1#2#3#4#5{#1\hbox to\headwidth{\vbox{\footrule
\hbox{\rlap{\parbox[t]{\headwidth}{\raggedright#2\strut}}\hfill
\parbox[t]{\headwidth}{\centering#3\strut}\hfill
\llap{\parbox[t]{\headwidth}{\raggedleft#4\strut}}}}}#5}

\def\headrule{{\if@fancyplain\headrulewidth\plainheadrulewidth\fi
\hrule\@height\headrulewidth\@width\headwidth \vskip-\headrulewidth}}

\def\footrule{{\if@fancyplain\footrulewidth\plainfootrulewidth\fi
\vskip-0.3\normalbaselineskip\vskip-\footrulewidth
\hrule\@width\headwidth\@height\footrulewidth\vskip0.3\normalbaselineskip}}

\def\ps@fancy{
\let\@mkboth\markboth
\@ifundefined{chapter}{\def\sectionmark##1{\markboth
{\uppercase{\ifnum \c@secnumdepth>\z@
 \thesection\hskip 1em\relax \fi ##1}}{}}
\def\subsectionmark##1{\markright {\ifnum \c@secnumdepth >\@ne
 \thesubsection\hskip 1em\relax \fi ##1}}}
{\def\chaptermark##1{\markboth {\uppercase{\ifnum \c@secnumdepth>\m@ne
 \@chapapp\ \thechapter. \ \fi ##1}}{}}
\def\sectionmark##1{\markright{\uppercase{\ifnum \c@secnumdepth >\z@
 \thesection. \ \fi ##1}}}}
\ps@@fancy
\headwidth\textwidth}
\def\ps@fancyplain{\ps@fancy \let\ps@plain\ps@plain@fancy}
\def\ps@plain@fancy{\@fancyplaintrue\ps@@fancy}
\def\ps@@fancy{
\def\@oddhead{\@fancyhead\relax\@olhead\@ochead\@orhead\hss}
\def\@oddfoot{\@fancyfoot\relax\@olfoot\@ocfoot\@orfoot\hss}
\def\@evenhead{\@fancyhead\hss\@elhead\@echead\@erhead\relax}
\def\@evenfoot{\@fancyfoot\hss\@elfoot\@ecfoot\@erfoot\relax}
}
-- 
Piet* van Oostrum, Dept of Computer Science, Utrecht University,
Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands.
Telephone: +31 30 531806   Uucp:   uunet!mcsun!ruuinf!piet
Telefax:   +31 30 513791   Internet:  piet@cs.ruu.nl   (*`Pete')
