diff options
Diffstat (limited to 'macros/latex/contrib/ncctools/source/nccfancyhdr.dtx')
-rw-r--r-- | macros/latex/contrib/ncctools/source/nccfancyhdr.dtx | 1056 |
1 files changed, 1056 insertions, 0 deletions
diff --git a/macros/latex/contrib/ncctools/source/nccfancyhdr.dtx b/macros/latex/contrib/ncctools/source/nccfancyhdr.dtx new file mode 100644 index 0000000000..877e367184 --- /dev/null +++ b/macros/latex/contrib/ncctools/source/nccfancyhdr.dtx @@ -0,0 +1,1056 @@ +% \iffalse +%% +%% File: nccfancyhdr.dtx Copyright (C) 2002--2004 by Alexander I. Rozhenko +%% +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{nccfancyhdr} +%<package> [2004/12/07 v1.1 Improved Fancy Header Package (NCC)] +% +% \changes{v1.00}{2002/02/01}{This version was uploaded to CTAN} +% \changes{v1.01}{2002/02/07}{|\fancycenter| command added} +% \changes{v1.01}{2002/02/07}{Header and footer struts are moved out of par-boxes} +% \changes{v1.1}{2004/12/07}{The |\newpagestyle| command added} +% \changes{v1.1}{2004/12/07}{The |\headrule| and |\footrule| commands added} +% \changes{v1.1}{2004/12/07}{Add optional \meta{stretch} parameter in |\fancycenter|} +% \changes{v1.1}{2004/12/07}{Remove |\fancycentersep| and |\fancycenterstretch| macros} +% \changes{v1.1}{2004/12/07}{Add conditional testing of floats within |testfloats| option} +% \changes{v1.1}{2004/12/07}{Documentation was prepared} +% +%<*driver> +\let\makeindex\relax +\documentclass{ltxdoc} +\usepackage{nccboxes} +\usepackage[headings]{nccfancyhdr} +\newpagestyle{lheadings}[headings]{% + \fancyhead[ce]{\nouppercase{\fancycenter{\thepage}{}{\slshape\leftmark}}}% + \fancyhead[co]{\nouppercase{\fancycenter{\slshape\rightmark}{}{\thepage}}}% +} +\pagestyle{lheadings} +\addtolength{\headwidth}{\marginparsep} +\addtolength{\headwidth}{0.6\marginparwidth} +\renewcommand{\headrulewidth}{0.6pt} +\makeatletter +\renewcommand{\headrule}{% + \setlength\@tempdima{\headrulewidth}% + \hrule\@height\@tempdima\@width\headwidth + \vskip 2\@tempdima + \hrule\@height\@tempdima\@width\headwidth + \vskip -4\@tempdima +} +\makeatother +\GetFileInfo{nccfancyhdr.sty} +\begin{document} +\title{The \textsf{nccfancyhdr} package\thanks{This file + has version number \fileversion, last + revised \filedate.}} +\author{Alexander I. Rozhenko\\rozhenko@oapmg.sscc.ru} +\date{\filedate} +\maketitle +\DocInput{nccfancyhdr.dtx} +\end{document} +%</driver> +% \fi +% This package is originated on the |fancyhdr| package by Piet van Oostrum. +% It provides almost the same functionality but implements it in more safe +% and simple way. +% The most important reason for re-implementation the |fancyhdr| was that +% |fancy| page style breaks conventions on page styles definition: +% avoiding global definitions in page styling commands. If this contract is +% broken, a page style cannot be used locally as a parameter of the +% |\thispagestyle| command. Other reasons for such re-implementation were +% the following: some commands in |fancyhdr| do more than it is +% necessary (e.g.\ the |fancy| page style redefines section marks), +% incorrect vertical alignment in headers leads to raising headers a bit +% (this produces a page overfull if header height is exactly the same as +% a height of text in it), some features introduced in the |fancyhdr| +% are unsafe (a special cycle |\@forc| is introduced with the |\def| +% command), and the implementation of commands is frequently too +% complicated. All these disadvantages of |fancyhdr| set off me to +% prepare a new version of |fancyhdr| packaged named as the |nccfancyhdr|. +% +% \tableofcontents +% +% \section{Using the Package} +% +% \thispagestyle{plain} +% The package supports three-part headers and footers separated +% from the text area with optional decorative lines. Using fancy headers +% and footers you can easy customize page layout. +% +% The first and the most useful benefit of fancy page styles is +% the possibility of decoration of headers and footers with a rule. +% If you want to add +% a rule to some of standard page styles (|empty|, |plain|, |myheadings|, +% and |headings|), put their names in the list of +% options of the |\usepackage| command: +% \begin{quote} +% |\usepackage|\oarg{style-list}|{nccfancyhdr}| +% \end{quote} +% For example, the command +% \begin{quote} +% |\usepackage[plain,headings]{nccfancyhdr}| +% \end{quote} +% loads the |nccfancyhdr| package and redefines the |plain| and |headings| +% styles on the base of |fancy| page style. It also sets the last style +% in the list (e.g.\ |headings| style) as a default page style. +% +% \section{Rule Control} +% +% \DescribeMacro{\headrulewidth} +% \DescribeMacro{\footrulewidth} +% The widths of decorative rules for header and footer are coded in the\linebreak +% |\headrulewidth| and |\footrulewidth| commands respectively +% (these commands were ported from the |fancyhdr| package). +% The default values for these commands are |0.4pt| (standard head rule width) +% and |0pt| (no foot rule). +% To change defaults, you should redefine corresponding commands. +% For example, to set a head rule of |0.6pt| width in this document, +% we use the following command: +% \begin{quote} +% |\renewcommand{\headrulewidth}{0.6pt}| +% \end{quote} +% +% \DescribeMacro{\headstrutheight} +% \DescribeMacro{\footstrutheight} +% A distance between rules and headers/footers is controlled with the\linebreak +% |\headstrutheight| and |\footstrutheight| commands. +% Here is a distinction with the |fancyhdr| package. The |fancyhdr| allows +% control the distance between the decoration rule and the page foot only +% in the |\footruleskip| command. Moreover, we use another technique to provide +% separation between header/footer and its rule: we insert special struts +% in headers and footers whose height and depth are calculated using the +% values of the mentioned commands. The defaults for both |\headstrutheight| +% and |\footstrutheight| are |0.3\normalbaselineskip|. You can redefine +% them in just the same manner as rule width commands above. +% +% \DescribeMacro{\headrule} +% \DescribeMacro{\footrule} +% The decorative rules in the header and footer are prepared with the\linebreak +% |\headrule| and |\footrule| commands. These commands work in vertical +% mode. They put an |\hrule| and do a negative |\vskip| to compensate +% the rule height (see the implementation section for more details). +% You can redefine these rules to produce custom decoration lines. For example, +% the double line in the header of this document is produced with the following +% code: +% \begin{quote} +% |\makeatletter|\\ +% |\renewcommand{\headrule}{%|\\ +% | \setlength\@tempdima{\headrulewidth}%|\\ +% | \hrule\@height\@tempdima\@width\headwidth|\\ +% | \vskip 2\@tempdima|\\ +% | \hrule\@height\@tempdima\@width\headwidth|\\ +% | \vskip -4\@tempdima|\\ +% |}|\\ +% |\makeatother| +% \end{quote} +% +% \DescribeMacro{\headwidth} +% \DescribeMacro{\normalheaders} +% \DescribeMacro{\extendedheaders} +% The width of header and footer (and, of course, the widths of their rules) +% is controlled with the |\headwidth| register. It is usually equal to the +% |\textwidth| but can exceed it. In the last case, the headers and footers are +% expanded on the marginal area. To simplify control of the |\headwidth|, +% two service commands are introduced in the package. The |\normalheaders| +% command sets the |\headwidth| to the |\textwidth|. The +% |\extendedheaders| enlarges the headers and footers on the whole marginal area: +% in two-column mode, header and footer are expanded to both margins and, in +% one-column mode, header and footer are expanded to the +% outer margin, but, if reverse margin mode is on, they are expanded to +% the inner margin. In this document, the |\headwidth| is expanded to marginal +% area as follows: +% \begin{quote} +% |\addtolength{\headwidth}{\marginparsep}|\\ +% |\addtolength{\headwidth}{0.6\marginparwidth}| +% \end{quote} +% +% \section{Page Style Customization} +% +% To customize a page style of your document, you can do the following: +% set the |\pagestyle{fancy}| in the preamble of the document +% and specify values of header and footer marks with the following +% commands:\vspace{-\baselineskip} +% \begin{center}\catcode`|=12 +% \small +% \renewcommand\cboxstyle{\footnotesize} +% \begin{tabular}{|l|c|l|}\hline +% \hfill\cbox{Command}\hfill\mbox{} & +% \hfill\cbox{Default optional\\parameter}\hfill\mbox{} & +% \hfill\cbox{Meaning}\hfill\mbox{}\\\hline +% \Strut/.8/ +% \verb+\fancyhf+\oarg{pos-list}\marg{mark} & +% \verb+[lh,ch,rh,lf,cf,rf]+ & +% Set a mark for header/footer \\ +% \verb+\fancyhead+\oarg{pos-list}\marg{mark} & +% \verb+[l,c,r]+ & +% Set a mark for header \\ +% \verb+\fancyfoot+\oarg{pos-list}\marg{mark} & +% \verb+[l,c,r]+ & +% Set a mark for footer \\ +% \verb+\lhead+\oarg{even-mark}\marg{odd-mark} & +% \oarg{odd-mark} & +% Set the left mark of header\\ +% \verb+\chead+\oarg{even-mark}\marg{odd-mark} & +% \oarg{odd-mark} & +% Set the center mark of header\\ +% \verb+\rhead+\oarg{even-mark}\marg{odd-mark} & +% \oarg{odd-mark} & +% Set the right mark of header\\ +% \verb+\lfoot+\oarg{even-mark}\marg{odd-mark} & +% \oarg{odd-mark} & +% Set the left mark of footer\\ +% \verb+\cfoot+\oarg{even-mark}\marg{odd-mark} & +% \oarg{odd-mark} & +% Set the center mark of footer\\ +% \verb+\rfoot+\oarg{even-mark}\marg{odd-mark} & +% \oarg{odd-mark} & +% Set the right mark of footer\\\hline +% \end{tabular} +% \end{center} +% +% All these commands are ported from the |fancyhdr| package. +% +% \DescribeMacro{\fancyhf} +% The |\fancyhf| command allows specify any mark of header or footer. +% The \meta{pos-list} argument specifies marks to set. +% A~mark position selector in the \meta{pos-list} argument consists +% of up to three letters: header/footer selector (|h| or |f|), +% horizontal position selector (|l| or |c| or |r|), odd/even page +% selector (|o|~or~|e|). The odd/even page selector is optional. +% If it is omitted, the command is applied to the corresponding mark +% on both odd and even pages. For example, |\fancyhf[hco]{mark}| +% sets the center mark of a header for odd pages. +% +% \textit{Note\/}: the even page selector has a sense for two-side mode only. +% In one-side documents (e.g.\ reports), even page marks are ignored. +% +% \DescribeMacro{\fancyhead} +% \DescribeMacro{\fancyfoot} +% The |\fancyhead| and |\fancyfoot| commands allows specify any +% mark of header and footer respectively. +% A~mark position selector in the \meta{pos-list} argument consists +% of up to two letters: horizontal position selector (|l| or |c| or |r|) +% and odd/even page selector (|o|~or~|e|). The odd/even page selector +% is also optional. For example, |\fancyhead[l]{mark}| +% sets the left mark of a header for both odd and even pages. +% +% \textit{Note\/}: The command |\fancyhf{}| clears all marks of headers and footers. +% The |\fancyhead{}| and |\fancyfoot{}| commands clear all marks in headers +% and footers respectively. +% +% \DescribeMacro{\lhead} +% \DescribeMacro{\chead} +% \DescribeMacro{\rhead} +% \DescribeMacro{\lfoot} +% \DescribeMacro{\cfoot} +% \DescribeMacro{\rfoot} +% We also implement the old-style macros |\lhead|, |\chead|, |\rhead|, +% |\lfoot|, |\cfoot|, and |\rfoot|. Their meaning is clear enough. +% For example, the command |\rhead[even-mark]{odd-mark}| is equivalent +% to the following commands: +% \begin{quote} +% |\fancyhead[le]{even-mark}|\\ +% |\fancyhead[lo]{odd-mark}| +% \end{quote} +% If an optional parameter of these commands is omitted, the same mark +% is set for both odd and even pages. For example, the command +% |\cfoot{mark}| is equivalent to the |\fancyfoot[c]{mark}|. +% +% \DescribeMacro{\nouppercase} +% You can use the |\nouppercase|\marg{text} command within a mark +% commands to ignore the |\uppercase| and |\MakeUppercase| commands +% in its parameter. For example, the +% |\rhead{\nouppercase{\rightmark}}| command ignores conversion the contents +% of |\rightmark| to uppercase. +% +% \section{Fancy Centering} +% +% The marks in a fancy header and footer are prepared using |\parbox| +% command. So, you can use multiline marks. In the header, they are +% aligned to the bottom line, but, in the footer, they are aligned to +% the top line. The maximum width of every mark is equal to the +% |\headwidth|. This can lead to overlapping of neighbour marks. +% +% \DescribeMacro{\fancycenter} +% If you want to prepare marks in more traditional way in a line +% not exceeding the |\headwidth|, you can use +% the following command in any mark command: +% \begin{quote} +% |\fancycenter|\oarg{distance}\oarg{stretch}\\ +% | |\marg{left-mark}\marg{center-mark}\marg{right-mark} +% \end{quote} +% This command works like +% \begin{center} +% |\hbox to\linewidth{|\marg{left-mark}|\hfil|\marg{center-mark}|\hfil|\marg{right-mark}|}| +% \end{center} +% but does this work more carefully trying to exactly center the central part of +% the text if possible. The solution for exact centering +% is applied if the width of \meta{center-mark} is less than +% \begin{quote} +% |\linewidth - 2*(|\meta{stretch}|*|\meta{distance}| +|\\ +% | max(width(|\meta{left-mark}|), width(|\meta{right-mark}|)))|. +% \end{quote} +% Otherwise the \meta{center-mark} will slightly migrate to a shorter item +% (\meta{left-mark} or \meta{right-mark}), but at least \meta{distance} +% space between all parts of line is provided. +% The default values of \meta{distance} and \meta{stretch} +% are |1em| and |3|. +% +% If the \meta{center-mark} is empty, the |\fancycenter| is equivalent to +% the following command: +% \begin{center} +% |\hbox to\linewidth {|\marg{left-mark}|\hfil |\marg{right-mark}|}| +% \end{center} +% +% \textit{Note\/}: The usage of |\fancycenter| command is not limited with the +% argument of header/footer marks only. You can use it anywhere in your document. +% +% \section{Prepare Custom Page Styles} +% +% \DescribeMacro{\newpagestyle} +% In the |nccfancyhdr| package, we recommend to set fancy marks within +% definition of a custom page style. In this case, +% you can easy select a custom style with the +% |\pagestyle| or |\thispagestyle| command. To support this, the +% |\newpagestyle| command is introduced: +% \begin{quote} +% |\newpagestyle|\marg{style-name}\oarg{base-style}\marg{definitions} +% \end{quote} +% It is allowed in the preamble only. The \meta{base-style} is a style +% the new style will be based on. If the optional parameter is omitted, the +% |fancy| style is used as the base style. +% The |fancy| style works as the |empty| style, but support decorative +% rules and extended headers/footers and allows fancy marks. +% A desired page style works as follows: +% at the first, the base style is applied; after that, the \meta{definitions} +% customize the base style. +% +% \textit{Note\/}: You can use any existing \meta{base-style} in the +% definition of a new style, but, if you apply fancy mark commands in the +% \meta{definitions} parameter, the base style should be based on the +% |fancy| style. +% +% For example, all pages of this document except the first one were prepared +% with the custom page style as follows: +% \begin{quote} +% |\usepackage[headings]{nccfancyhdr}|\\ +% |\newpagestyle{lheadings}[headings]{%|\\ +% | \fancyhead[ce]{\nouppercase{%|\\ +% | \fancycenter{\thepage}{}{\slshape\leftmark}}}%|\\ +% | \fancyhead[co]{\nouppercase{%|\\ +% | \fancycenter{\slshape\rightmark}{}{\thepage}}}%|\\ +% |}|\\ +% |\pagestyle{lheadings}| +% \end{quote} +% As you can see from here, the fancy versions of |headings| and +% |myheadings| styles use the center mark only and prepare it +% with the help of the |\fancycenter| command. +% +% \section{How to Change a Page Style in Floatpages?} +% +% A floatpage is a page consisting of floats only. You cannot +% directly change a page style for such a page, because it is prepared +% in whole in the \LaTeX\ Output Routine. +% We recommend to change a page style for floatpages with the help of the +% |afterpage| package. Just add a command |\usepackage{afterpage}| +% in the preamble and put the command: +% \begin{quote} +% |\afterpage{\thispagestyle|\marg{special-style}|}| +% \end{quote} +% anywhere in the page going before the floatpage. +% The \meta{special-style} is a style you want to apply for +% floatpages. +% +% \DescribeMacro{\iffloatpage} +% \DescribeMacro{\iftopfloat} +% \DescribeMacro{\ifbotfloat} +% Another way for change a page style on pages with floats +% consists in using the following conditional commands within marks of +% a page style: +% \begin{quote} +% |\iffloatpage|\marg{true-clause}\marg{false-clause}\\ +% |\iftopfloat|\marg{true-clause}\marg{false-clause}\\ +% |\ifbotfloat|\marg{true-clause}\marg{false-clause} +% \end{quote} +% These commands were ported from the |fancyhdr| package. +% The |\iffloatpage| command executes the \meta{true-clause} if +% this is a floatpage. Otherwise, it executes the \meta{false-clause}. +% Analogously, the |\iftopfloat| and |\ifbotfloat| test the +% lists of top floats and bottom floats of the page to be nonempty. +% +% Whereas these commands are rare used, they are defined if the +% package is loaded with the |testfloats| option. +% +% \section{Package Options} +% +% In conclusion, we enumerate all package options available: +% \begin{center}\catcode`|=12 +% \small\tabcolsep=10pt +% \renewcommand\cboxstyle{\footnotesize} +% \begin{tabular}{|l|l|}\hline +% \hfill\cbox{Option}\hfill\mbox{} & +% \hfill\cbox{Meaning}\hfill\mbox{}\\\hline +% \Strut/.8/ +% \texttt{empty} & redefine the \texttt{empty} page style to be fancy-based style \\ +% \texttt{plain} & redefine the \texttt{plain} page style to be fancy-based style \\ +% \texttt{headings} & redefine the \texttt{headings} page style to be fancy-based style \\ +% \texttt{myheadings} & redefine the \texttt{myheadings} page style to be fancy-based style \\ +% \texttt{testfloats} & define \verb+\iffloatpage+, \verb+\iftopfloat+, +% and \verb+\ifbotfloat+ commands\\ +% \hline +% \end{tabular} +% \end{center} +% The options are executed in the order they are specified in the list of options. +% Every page +% style redefinition option sets a redefined style to be the current page style. +% Therefore, after loading of this package, the style redefined in the last order +% will be the current page style. +% \StopEventually{} +% +% \section{The Implementation} +% +% \begin{macro}{\newpagestyle} +% We start with the |\newpagestyle| command. It was introduced in +% the version~1.1 of the package. It is available in the preamble only. +% \begin{macrocode} +%<*package> +\newcommand*{\newpagestyle}[1]{% + \@ifnextchar[{\NCC@newpagestyle{#1}}{\NCC@newpagestyle{#1}[fancy]}% +} +\long\def\NCC@newpagestyle#1[#2]#3{% + \@ifundefined{ps@#2}{% + \PackageError{nccfancyhdr} + {\string\newpagestyle: Unknown base page style `#2'}{}% + }{}% + \edef\@tempa{\noexpand\newcommand \expandafter\noexpand + \csname ps@#1\endcsname}% + \expandafter\@tempa\expandafter{\csname ps@#2\endcsname #3}% +} +\@onlypreamble\newpagestyle +\@onlypreamble\NCC@newpagestyle +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fancyhf} +% \begin{macro}{\fancyhead} +% \begin{macro}{\fancyfoot} +% Now we define the new-style fancy marking commands. They are based +% on the |\NCC@fancyhf| command. +% \begin{macrocode} +\newcommand*{\fancyhf}[1][lh,ch,rh,lf,cf,rf]{\NCC@fancyhf{}{#1}} +\newcommand*{\fancyhead}[1][l,c,r]{\NCC@fancyhf h{#1}} +\newcommand*{\fancyfoot}[1][l,c,r]{\NCC@fancyhf f{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lhead} +% \begin{macro}{\chead} +% \begin{macro}{\rhead} +% \begin{macro}{\lfoot} +% \begin{macro}{\cfoot} +% \begin{macro}{\rfoot} +% The old-style fancy-marking commands are based on the |\NCC@fancy| +% command. +% \begin{macrocode} +\newcommand{\lhead}{\@dblarg{\NCC@fancy{lh}}} +\newcommand{\chead}{\@dblarg{\NCC@fancy{ch}}} +\newcommand{\rhead}{\@dblarg{\NCC@fancy{rh}}} +\newcommand{\lfoot}{\@dblarg{\NCC@fancy{lf}}} +\newcommand{\cfoot}{\@dblarg{\NCC@fancy{cf}}} +\newcommand{\rfoot}{\@dblarg{\NCC@fancy{rf}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\NCC@fancy} +% The |\NCC@fancy|\marg{selector}\oarg{even-mark}\marg{odd-mark} +% command sets a pair of marks. A \meta{selector} consists of two +% letters: (lcr) and (hf). We need not test the \meta{selector} on +% correctness because this command is applied internally. +% \begin{macrocode} +\def\NCC@fancy#1[#2]#3{ + \expandafter\def\csname NCC@f@e#1\endcsname{#2}% + \expandafter\def\csname NCC@f@o#1\endcsname{#3}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@fancyhf} +% The |\NCC@fancyhf|\marg{hf}\marg{pos-list}\marg{mark} command +% parses the \meta{pos-list} by selectors and executes the +% |\NCC@fancydef| for every selector. The \meta{hf} argument +% contains the common part of all selectors added at their +% beginning. +% \begin{macrocode} +\def\NCC@fancyhf#1#2#3{% + \@for\@tempa:=#2\do + {\edef\@tempa{\noexpand\NCC@fancydef{#1\@tempa}}\@tempa{#3}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@fancydef} +% The |\NCC@fancydef|\marg{selector}\marg{mark} command analyzes +% the \meta{selector} and defines corresponding fancy mark. +% It uses the |\NCC@fancyclass| command that prevents using many letters +% of the same class in the \meta{selector}. For example, it will be an +% error if more that one `l' or `c' or `r' letter appears in the +% selector. +% \begin{macrocode} +\def\NCC@fancydef#1#2{% +% \end{macrocode} +% The |\NCC@hf|, |\NCC@lcr|, and |\NCC@oe| will contain a letter +% of the corresponding class found in selector. Before the cycle, +% they are set to |\relax|. +% \begin{macrocode} + \let\NCC@hf\relax \let\NCC@lcr\relax \let\NCC@oe\relax + \@tfor \@nextchar:=#1\do +% \end{macrocode} +% Prepare in |\@tempa| a next letter in uppercase. +% \begin{macrocode} + {\edef\@tempa{\noexpand\uppercase{\noexpand\def% + \noexpand\@tempa{\@nextchar}}}\@tempa +% \end{macrocode} +% Test the letter and specify corresponding class. +% \begin{macrocode} + \if\@tempa H\NCC@fancyclass\NCC@hf{h}{#1}\else + \if\@tempa F\NCC@fancyclass\NCC@hf{f}{#1}\else + \if\@tempa L\NCC@fancyclass\NCC@lcr{l}{#1}\else + \if\@tempa C\NCC@fancyclass\NCC@lcr{c}{#1}\else + \if\@tempa R\NCC@fancyclass\NCC@lcr{r}{#1}\else + \if\@tempa O\NCC@fancyclass\NCC@oe{o}{#1}\else + \if\@tempa E\NCC@fancyclass\NCC@oe{e}{#1}\else + \NCC@fancyerror{Illegal char `\@nextchar' in argument `#1'}% + \fi + \fi + \fi + \fi + \fi + \fi + \fi + }% +% \end{macrocode} +% After cycle, we test that the |\NCC@hf| and |\NCC@lcr| classes +% are specified. The |\NCC@oe| class is optional. So, we do not test it. +% Finally, we define appropriate mark commands. +% \begin{macrocode} + \ifx\NCC@hf\relax \NCC@fancyerror{No `h' or `f' specified}\else + \ifx\NCC@lcr\relax \NCC@fancyerror{No `l' or `c' or `r' specified}\else + \ifx\NCC@oe\relax + \expandafter\def\csname NCC@f@o\NCC@lcr\NCC@hf\endcsname{#2}% + \expandafter\def\csname NCC@f@e\NCC@lcr\NCC@hf\endcsname{#2}% + \else + \expandafter\def\csname NCC@f@\NCC@oe\NCC@lcr\NCC@hf\endcsname{#2}% + \fi + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@fancyclass} +% The |\NCC@fancyclass|\marg{command}\marg{letter}\marg{selector} +% command tests the\linebreak \meta{command} to be |\relax| and defines +% it with the \meta{letter} argument. If the command is already defined, +% the error message is generated. +% \begin{macrocode} +\def\NCC@fancyclass#1#2#3{% + \ifx#1\relax + \def#1{#2}% + \else + \NCC@fancyerror{Misusing the char `\@nextchar' in argument `#3'}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@fancyerror} +% A handler of errors in fancy mark definitions. +% \begin{macrocode} +\def\NCC@fancyerror#1{% + \PackageError{nccfancyhdr}% + {Fancy mark definitions:\MessageBreak#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\headwidth} +% \begin{macro}{\extendedheaders} +% \begin{macro}{\normalheaders} +% Now we allocate the |\headwidth| register and define +% its control commands. +% \begin{macrocode} +\newdimen\headwidth +\newcommand{\extendedheaders}{ + \@tempdima\marginparwidth \advance\@tempdima\marginparsep + \@tempdimb\textwidth \advance\@tempdimb\@tempdima + \if@twocolumn \advance\@tempdimb\@tempdima \fi + \global\headwidth\@tempdimb +} +\newcommand{\normalheaders}{\global\headwidth\textwidth} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\headrulewidth} +% \begin{macro}{\footrulewidth} +% \begin{macro}{\headstrutheight} +% \begin{macro}{\footstrutheight} +% Now we specify parameters of decoration rules: widths and struts. +% \begin{macrocode} +\newcommand{\headrulewidth}{.4\p@} +\newcommand{\footrulewidth}{\z@} +\newcommand{\headstrutheight}{.3\normalbaselineskip} +\newcommand{\footstrutheight}{.3\normalbaselineskip} +% \end{macrocode} +% \textit{Note\/}: Really, the head strut height is zero but its depth is equal +% to the value of |\headstrutheight|. Moreover, the foot strut height +% is a sum of |0.55\normalbaseskip| and the value of |\footstrutheight|. +% But we prefer the universal notations for command names instead of strict one, +% because users do not interested in implementation details. +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\headrule} +% The default implementation of the |\headrule|. It works in vertical mode. +% At first it draws a rule and then it inserts a negative skip for compensation. +% \begin{macrocode} +\newcommand{\headrule}{% + \setlength\@tempdima{\headrulewidth}% + \hrule\@height\@tempdima\@width\headwidth + \vskip-\@tempdima +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footrule} +% The |\footrule| works in reverse order: at first it inserts a negative skip +% and after that it draws a rule. +% \begin{macrocode} +\newcommand{\footrule}{% + \setlength\@tempdima{\footrulewidth}% Can use calc here + \vskip -\@tempdima + \hrule \@height\@tempdima \@width\headwidth +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@fancyreset} +% The |\NCC@fancyreset| command is used at the beginning +% of fancy headers and footers. It resets font, removes +% baseline stretch and locally defines the |\nouppercase| command. +% In comparison with the |fancyhdr| package, we do not +% call the |\restorecr| command because it is obsolete now. +% We also redefine the |\uppercase| and |\MakeUppercase| +% commands in more appropriate way than in |fancyhdr|. +% \begin{macrocode} +\def\NCC@fancyreset{\let\baselinestretch\@empty + \long\def\nouppercase##1{% + \begingroup + \long\def\uppercase####1{####1}% + \long\def\MakeUppercase####1{####1}% + ##1% + \endgroup + }% + \reset@font +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@fancyhead} +% The |\NCC@fancyhead|\marg{left-mark}\marg{center-mark}\marg{right-mark} +% command prepares the fancy header. It differs from the implementation in +% the |fancyhdr| at the following issue: the vertical box in this command +% (|\@tempboxa|) is prepared as |\vtop| box, but in the |fancyhdr| package +% it is prepared as |\vbox| box. As a consequence, in the |fancyhdr| version, +% the base line of the vertical box goes at the rule and the header slightly +% moves up. +% \begin{macrocode} +\def\NCC@fancyhead#1#2#3{% + \hb@xt@\headwidth{\NCC@fancyreset + \setbox\@tempboxa\vtop{% + \hbox{% +% \end{macrocode} +% Prepare the left mark: +% \begin{macrocode} + \rlap{\parbox[b]\headwidth{\raggedright#1}}% +% \end{macrocode} +% Insert the strut: +% \begin{macrocode} + \setlength\@tempdima{\headstrutheight}% + \vrule\@width\z@\@height\z@\@depth\@tempdima +% \end{macrocode} +% Prepare the center mark: +% \begin{macrocode} + \parbox[b]\headwidth{\centering#2}% +% \end{macrocode} +% Prepare the right mark: +% \begin{macrocode} + \llap{\parbox[b]\headwidth{\raggedleft#3}}% + }% +% \end{macrocode} +% Draw decoration rule: +% \begin{macrocode} + \headrule + }% +% \end{macrocode} +% Compare the height of |\@tempboxa| with the |\headheaght| +% and correct the last one if vertical overfull appears: +% \begin{macrocode} + \NCC@fancytest\headheight +% \end{macrocode} +% Put the fancy header: +% \begin{macrocode} + \box\@tempboxa + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@fancyfoot} +% The |\NCC@fancyfoot|\marg{left-mark}\marg{center-mark}\marg{right-mark} +% command prepares the fancy footer. Its implementation is similar to +% the |\NCC@fancyhead|. +% \begin{macrocode} +\def\NCC@fancyfoot#1#2#3{% + \hb@xt@\headwidth{\NCC@fancyreset + \setbox\@tempboxa\vbox{% + \footrule + \hbox{% + \rlap{\parbox[t]\headwidth{\raggedright#1}}% + \@tempdima .55\normalbaselineskip + \addtolength\@tempdima{\footstrutheight}% + \vrule\@width\z@\@height\@tempdima\@depth\z@ + \parbox[t]\headwidth{\centering#2}% + \llap{\parbox[t]\headwidth{\raggedleft#3}}% + }% + }% + \NCC@fancytest\footskip + \box\@tempboxa + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@fancytest} +% The |\NCC@fancytest|\marg{register} command compares +% a value of the \meta{register} with the height of |\@tempboxa| +% and modifies the \meta{register} value if necessary. +% \begin{macrocode} +\def\NCC@fancytest#1{% + \ifdim\ht\@tempboxa>#1% + \PackageWarning{nccfancyhdr}% + {\string#1 is too small (\the#1):\MessageBreak + Make it at least \the\ht\@tempboxa.\MessageBreak + We now enlarge it for the rest of the document.\MessageBreak + This may cause the page layout to be inconsistent, however}% + \@tempdima#1\global\setlength{#1}{\ht\@tempboxa}% + \ht\@tempboxa\@tempdima + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NCC@ihss} +% \begin{macro}{\NCC@ohss} +% The |\NCC@ihss| and |\NCC@ohss| hooks insert the |\hss| command +% at the outer and/or inner sides of header/footer to provide the proper +% enlargement it on margins. +% \begin{macrocode} +\def\NCC@ihss{\if@twocolumn\hss\else\if@reversemargin\hss\fi\fi} +\def\NCC@ohss{\if@twocolumn\hss\else\if@reversemargin\else\hss\fi\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\fancycenter} +% |\fancycenter|\oarg{dist}\oarg{stretch}\marg{left-mark}\marg{center-mark}\marg{right-mark} +% \begin{macrocode} +\newcommand*{\fancycenter}[1][1em]{% + \@ifnextchar[{\NCC@fancycenter{#1}}{\NCC@fancycenter{#1}[3]}% +} +\def\NCC@fancycenter#1[#2]#3#4#5{% +% \end{macrocode} +% At first, we execute the case when the \meta{center-mark} is empty: +% \begin{macrocode} + \def\@tempa{#4}\ifx\@tempa\@empty + \hb@xt@\linewidth{\color@begingroup{#3}\hfil {#5}\color@endgroup}% + \else +% \end{macrocode} +% All that we need to do is to calculate skips inserted before and after +% \meta{center-mark}. We will calculate them in the |\@tempskipa| +% and |\@tempskipb|. At first: +% \begin{quote} +% |\@tempdima:=|\meta{dist};\\ +% |\@tempdimb:=|\meta{dist}|*|\meta{stretch};\\ +% |\@tempdimc:=|\meta{dist}|*|\meta{stretch}|-|\meta{dist};\\ +% |\@tempskipa:=\@tempskipb:=\@tempdimb + 1fil - \@tempdimc|; +% \end{quote} +% \begin{macrocode} + \setlength\@tempdima{#1}% + \setlength{\@tempdimb}{#2\@tempdima}% + \@tempdimc \@tempdimb \advance\@tempdimc -\@tempdima + \setlength\@tempskipa{\@tempdimb \@plus 1fil \@minus \@tempdimc}% + \@tempskipb\@tempskipa +% \end{macrocode} +% At this point, the |\@tempskipa| and |\@tempskipb| registers +% have the natural size \meta{dist}|*|\meta{stretch}, +% unlimited stretchability, and the minimum size \meta{dist}. +% Now we decrease the minimum size of |\@tempskipa| to zero if +% the \meta{left-mark} is empty: +% \begin{macrocode} + \def\@tempa{#3}\ifx\@tempa\@empty + \addtolength\@tempskipa{\z@ \@minus \@tempdima}% + \fi +% \end{macrocode} +% Do the same things with the |\@tempskipb| register if the +% \meta{right-mark} is empty: +% \begin{macrocode} + \def\@tempa{#5}\ifx\@tempa\@empty % empty right + \addtolength\@tempskipb{\z@ \@minus \@tempdima}% + \fi +% \end{macrocode} +% Finally, we correct the left and right glues taking into +% account the difference between lengthes of \meta{left-mark} +% and \meta{right-mark}. We calculate what mark is shorter +% and increase the natural size of corresponding register +% on the difference between their lengthes. +% \begin{macrocode} + \settowidth{\@tempdimb}{#3}% + \settowidth{\@tempdimc}{#5}% + \ifdim\@tempdimb>\@tempdimc + \advance\@tempdimb -\@tempdimc + \addtolength\@tempskipb{\@tempdimb \@minus \@tempdimb}% + \else + \advance\@tempdimc -\@tempdimb + \addtolength\@tempskipa{\@tempdimc \@minus \@tempdimc}% + \fi +% \end{macrocode} +% The |\@tempskipa| and |\@tempskipb| are calculated. Put the box. +% \begin{macrocode} + \hb@xt@\linewidth{\color@begingroup{#3}\hskip \@tempskipa + {#4}\hskip \@tempskipb {#5}\color@endgroup}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% The rest of the package consists of games with styles and options. +% +% \begin{macro}{\ps@fancy} +% We start from declaring the |fancy| page style. It extends the +% |empty| page style. So, we simply call the empty style and then +% redefine |\@oddhead|, |\@evenhead|, |\@oddfoot|, and |\@evenfoot| +% to be fancy one. The |\NCC@ihss| and |\NCC@ohss| hooks provide +% proper enlargement of headers/footers on margins. The |\fancyhf{}| +% command at the end of macro clears all marks. +% \begin{macrocode} +\def\ps@fancy{\ps@empty + \def\@oddhead{% + \NCC@ihss \NCC@fancyhead\NCC@f@olh\NCC@f@och\NCC@f@orh \NCC@ohss}% + \def\@evenhead{% + \NCC@ohss \NCC@fancyhead\NCC@f@elh\NCC@f@ech\NCC@f@erh \NCC@ihss}% + \def\@oddfoot{% + \NCC@ihss \NCC@fancyfoot\NCC@f@olf\NCC@f@ocf\NCC@f@orf \NCC@ohss}% + \def\@evenfoot{% + \NCC@ohss \NCC@fancyfoot\NCC@f@elf\NCC@f@ecf\NCC@f@erf \NCC@ihss}% + \fancyhf{}% +} +% \end{macrocode} +% \end{macro} +% +% Standard styles are redefined optionally. +% +% \begin{macro}{\ps@empty} +% When we redefine the |empty| style, we must take into account +% that it can be also redefined (as in |amsart| and |amsbook| classes). +% So, we save its previous meaning in the |\NCC@psempty| macro and base the +% |empty| style on the saved style. +% \begin{macrocode} +\DeclareOption{empty}{% + \let\NCC@psempty\ps@empty + \def\ps@empty{\NCC@psempty + \def\@oddhead{% + \NCC@ihss \NCC@fancyhead\NCC@f@olh\NCC@f@och\NCC@f@orh \NCC@ohss}% + \def\@evenhead{% + \NCC@ohss \NCC@fancyhead\NCC@f@elh\NCC@f@ech\NCC@f@erh \NCC@ihss}% + \def\@oddfoot{% + \NCC@ihss \NCC@fancyfoot\NCC@f@olf\NCC@f@ocf\NCC@f@orf \NCC@ohss}% + \def\@evenfoot{% + \NCC@ohss \NCC@fancyfoot\NCC@f@elf\NCC@f@ecf\NCC@f@erf \NCC@ihss}% + \fancyhf{}% + }% + \pagestyle{empty}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@plain} +% The redefinition of the |plain| style is quite simple: +% \begin{macrocode} +\DeclareOption{plain}{% + \def\ps@plain{\ps@fancy \let\@mkboth\@gobbletwo + \fancyfoot[c]{\thepage}% + }% + \pagestyle{plain}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@myheadings} +% The redefinition of the |myheadings| style is conditional. +% We test the |\chapter| command on existence and redefine the +% style in a bit different ways. +% \begin{macrocode} +\DeclareOption{myheadings}{% + \@ifundefined{chapter}{% + \def\ps@myheadings{\ps@fancy \let\@mkboth\@gobbletwo + \fancyhead[ce]{\fancycenter{\thepage}{}{\slshape\leftmark}}% + \fancyhead[co]{\fancycenter{\slshape\rightmark}{}{\thepage}}% + \let\sectionmark\@gobble + \let\subsectionmark\@gobble + }% + }{\def\ps@myheadings{\ps@fancy \let\@mkboth\@gobbletwo + \fancyhead[ce]{\fancycenter{\thepage}{}{\slshape\leftmark}}% + \fancyhead[co]{\fancycenter{\slshape\rightmark}{}{\thepage}}% + \let\chaptermark\@gobble + \let\sectionmark\@gobble + }% + }% + \pagestyle{myheadings}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@headings} +% The redefinition of the |headings| style also differs for +% book-like and article-like classes. It also differs for +% one-side and two-side modes. +% \begin{macrocode} +\DeclareOption{headings}{% + \@ifundefined{chapter}{% + \if@twoside +% \end{macrocode} +% An article in two-side mode: +% \begin{macrocode} + \def\ps@headings{\ps@fancy \let\@mkboth\markboth + \fancyhead[ce]{\fancycenter{\thepage}{}{\slshape\leftmark}}% + \fancyhead[co]{\fancycenter{\slshape\rightmark}{}{\thepage}}% + \def\sectionmark##1{% + \markboth{\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ \thesection\quad \fi##1}}{}}% + \def\subsectionmark##1{% + \markright{% + \ifnum \c@secnumdepth >\@ne \thesubsection\quad \fi##1}}% + }% + \else +% \end{macrocode} +% An article in one-side mode: +% \begin{macrocode} + \def\ps@headings{\ps@fancy \let\@mkboth\markboth + \fancyhead[ce]{\fancycenter{\thepage}{}{\slshape\leftmark}}% + \fancyhead[co]{\fancycenter{\slshape\rightmark}{}{\thepage}}% + \def\sectionmark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ \thesection\quad \fi##1}}}% + \let\subsectionmark\@gobble % Not needed but inserted for safety + }% + \fi + }{\if@twoside +% \end{macrocode} +% A book in two-side mode: +% \begin{macrocode} + \def\ps@headings{\ps@fancy \let\@mkboth\markboth + \fancyhead[ce]{\fancycenter{\thepage}{}{\slshape\leftmark}}% + \fancyhead[co]{\fancycenter{\slshape\rightmark}{}{\thepage}}% + \def\chaptermark##1{% + \markboth{\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne \if@mainmatter + \@chapapp\ \thechapter. \ \fi\fi##1}}{}}% + \def\sectionmark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ \thesection. \ \fi##1}}}% + }% + \else +% \end{macrocode} +% A book in one-side mode: +% \begin{macrocode} + \def\ps@headings{\ps@fancy \let\@mkboth\markboth + \fancyhead[ce]{\fancycenter{\thepage}{}{\slshape\leftmark}}% + \fancyhead[co]{\fancycenter{\slshape\rightmark}{}{\thepage}}% + \def\chaptermark##1{% + \markright{\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne \if@mainmatter + \@chapapp\ \thechapter. \ \fi\fi##1}}}% + \let\sectionmark\@gobble % Not needed but inserted for safety + }% + \fi + }% + \pagestyle{headings}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\iffloatpage} +% \begin{macro}{\iftopfloat} +% \begin{macro}{\ifbotfloat} +% These macros are defined in the |testfloats| option. +% They were ported from the |fancyhdr| and modified a bit +% in more \LaTeX\ way. It is no warrantee that these macros +% will proper work in all cases. They must be used inside +% fancy mark commands. +% \begin{macrocode} +\DeclareOption{testfloats}{% + \let\NCC@fancymakecol\@makecol + \let\NCC@fancytoplist\@empty + \let\NCC@fancybotlist\@empty + \def\@makecol{% + \let\NCC@fancytoplist\@toplist + \let\NCC@fancybotlist\@botlist + \NCC@fancymakecol + }% + \newcommand\iftopfloat{% + \ifx\NCC@fancytoplist\@empty + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi + }% + \newcommand\ifbotfloat{% + \ifx\NCC@fancybotlist\@empty + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi + }% + \newcommand\iffloatpage{% + \if@fcolmade + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + }% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Finally, we process the options in the order they are specified +% in the options list and set the defaults. +% \begin{macrocode} +\ProcessOptions* +\normalheaders +\fancyhf{} +%</package> +% \end{macrocode} +\endinput |