% \iffalse
% File sectsty.dtx
% Copyright Rowland McDonnell 1996, 1998, and 2002
% email rowland.mcdonnell@physics.org
% Some bits copyright the LaTeX3 team 1998.
%
% To install the sectsty package, run LaTeX on sectsty.ins.  To 
% typeset the documentation, run LaTeX on sectsty.dtx.
%
% Documentation and source file for the sectsty package. The package 
% consists of two files:
% 
% sectsty.ins
% sectsty.dtx
%
% This program - the two files sectsty.dtx and sectsty.ins - may be
% distributed and/or modified under the conditions of the LaTeX Project
% Public License, either version 1.2 of this license or (at your option)
% any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.2 or later is part of all distributions of LaTeX 
% version 1999/12/01 or later.
%
% Don't give this file to anyone unless you also give them an unmodified
% versions of sectsty.ins.
% 
% Don't modify this file unless you change its name and change all the
% various identification strings it contains to indicate that: it's
% derived from my sectsty package, it's now your responsibility, and
% it's no longer part of the sectsty package.
% 
% Remove \OnlyDescription to get the code typeset.  The code is not 
% well documented.
%
% Note to me: comment out \OnlyDescription to get the checksum right, 
% and then uncomment it because I don't want the code typeset by 
% default (this package is meant for non-hackers).
%
%\fi
%\iffalse
%<*driver>
\documentclass[a4paper,11pt]{ltxdoc}
\usepackage{varioref}
\def\MacroFont{\fontencoding\encodingdefault
               \fontfamily\ttdefault
               \fontseries\mddefault
               \fontshape\updefault
               \normalsize}%
\OnlyDescription
\begin{document}
 \DocInput{sectsty.dtx}
\end{document}
%</driver>
%\fi
%\iffalse
%<*package>
%\fi
%%
%% \CheckSum{1463}
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%
%\iffalse
% The instances of ^^A are `real' comment characters to suppress the 
% end-of-line space in the middle of the command definitions.
%\fi
%
% \makeatletter
%\newcommand{\ttlb}{{\ttfamily\def\@tempcmda{OT1}^^A
%\ifx\f@encoding\@tempcmda\char"7B\else\{\fi}}
%
%\newcommand{\ttrb}{{\ttfamily\def\@tempcmda{OT1}^^A
%\ifx\f@encoding\@tempcmda\char"7D\else\}\fi}}
%
%\newcommand{\ttbs}{{\ttfamily\def\@tempcmda{OT1}^^A
%\ifx\f@encoding\@tempcmda\char`\\\else\textbackslash\fi}}
%^^A  \char`\\ was \char"5C
%
%\newcommand*{\comname}[2][VF500F2E]{{\ttfamily\ttbs #2^^A
%\def\@tempcmda{VF500F2E}\def\@tempcmdb{#1}^^A
%\ifx\@tempcmda\@tempcmdb\else\comarg{#1}\fi}}
%
%\newcommand*{\itinangle}[1]{$\langle$^^A
%{\mdseries\rmfamily\itshape#1}\/$\rangle$}
%
%\newcommand*{\comarg}[1]{{\ttfamily\ttlb^^A
%\itinangle{#1}\ttrb}}
%
%\newcommand*{\comoptarg}[1]{{\ttfamily[$\langle$^^A
%{\rmfamily\itshape#1}\/$\rangle$]}}
% \makeatother
% 
% \author{Rowland McDonnell\\ \texttt{rowland.mcdonnell@physics.org}}
% \title{The \packname{sectsty} package v2.0.2}
% \date{25th February 2002}
% 
% \newcommand*{\packname}[1]{{\sffamily #1}}
% \newcommand*{\classname}[1]{{\ttfamily #1}}
% \newcommand*{\filename}[1]{{\ttfamily #1}}
% 
% \maketitle
% 
% \tableofcontents
%
% \section{Introduction}
% 
% The \packname{secsty} package provides a set of commands for changing 
% the fount\footnote{I am one of the few remaining English speaking 
% people on the planet to use this spelling to refer to a set of type in 
% one size and style.} used for the various sectional headings in the 
% standard \LaTeXe\ document classes: \classname{article}, 
% \classname{book}, and \classname{report}.  This package also works 
% with the KOMA-Script classes \classname{scrartcl}, 
% \classname{scrbook}, and \classname{scrreprt}.
% 
% When I refer to sectional headings in this document, I mean the stuff 
% that is printed in the body of a document to indicate the start of 
% a part, chapter, section, and so on.  Appendix headings are treated 
% as chapter headings.
% 
% I'd appreciate any bug reports, comments, or suggestions emailed to 
% the address above.  I'm especially interested in any problems you 
% might have had understanding the documentation; and, of course, 
% anything else you'd like to tell me about this package.  I'm 
% certainly interested in any problems you might have had in using 
% \packname{sectsty} with other packages, although I can't promise to 
% be able to do anything useful about such problems.
%
% The \packname{titlesec} package offers a different 
% approach to changing the appearance of sectional headings.   The 
% \packname{fncychap} package has a set of alternative `canned' chapter 
% headings.  Both are available from CTAN.
% 
% Donald Arseneau won't let me say what bits of \packname{sectsty} he 
% wrote, but I'd like to thank him anyway: I couldn't have managed 
% without his help.  Thanks are also due to the various people who sent 
% me bug reports -- I've not kept track so rather than mention some of 
% you and miss others out, I'll just say thanks and leave it at that.  
% You know who you are and I appreciate your help.
% 
% \section{Basic use of \packname{sectsty}}
% 
% Make sure you include the package in your document by saying in your 
% document preamble:
%\begin{verbatim} 
%    \usepackage{sectsty}
%\end{verbatim}
% You will then have some new commands available.  For example:
%\begin{verbatim} 
%    \allsectionsfont{\sffamily}
%\end{verbatim}
% will give you sanserif for all sectional headings.
% 
% \packname{Sectsty} doesn't make any changes to the fount used until 
% you tell it what to do. The idea is that you supply some standard 
% \LaTeX\ fount selection commands which change the default selection. 
% The standard classes use Computer Modern Bold Extended by default for 
% sectional headings, and your commands change this. This means the 
% example above gives you Computer Modern Sanserif Bold Extended by 
% default.
% 
% You might want to change all headings so that they used medium 
% italic.  Since the default headings use bold extended, you need to 
% switch to the medium weight as well as switching to italic using the 
% standard \LaTeX\ fount selection commands, like this:
%\begin{verbatim}
%    \allsectionsfont{\mdseries\itshape}
%\end{verbatim}
% You can change the style of the different sectional headings separately.
% If you want \comname{section}s to be set in bold Adobe Times, you might 
% use standard \LaTeX\ fount selection commands like this:
%\begin{verbatim}
%    \sectionfont{\fontfamily{ptm}\selectfont}
%\end{verbatim}
% 
% Similar commands exist to change the style of the rest of \LaTeX's 
% standard headings independently: \comname{chapterfont}\comarg{commands} 
% will change chapter headings, and so on.  The full list of commands is 
% given in section~\vref{sec:command_list}.
% 
% If you don't understand the fount selection commands above, you might 
% like to look at the file \filename{fntguide.tex} that comes with the 
% standard \LaTeX\ distribution.
% 
% \section{Raggedright, raggedleft, and centred headings}
% 
% The arguments to \packname{sectsty}'s sectional heading style changing 
% commands can contain any \LaTeX\ commands you like.  For example, you 
% might say:
%\begin{verbatim}
%    \allsectionsfont{\sffamily\raggedright}
%\end{verbatim}
% and all sectional headings would be typeset raggedright in bold 
% extended sanserif. Not all \LaTeX\ commands will work properly when 
% used this like, although these three commands all have the expected 
% effect when used in one of \packname{sectsty}'s 
% \comname{\itinangle{section}font} commands:
% \begin{center}
% \begin{tabular}{ll}
% \comname{centering}   & Headings centred on the page \\
% \comname{raggedright} & Headings set flush left with a ragged right 
%                         margin \\
% \comname{raggedleft}  & Headings set flush right with a ragged left 
%                         margin \\
% \end{tabular}
% \end{center}
% It's a bad idea to use any of these commands to change paragraph or 
% subparagraph sectional headings: these two sections begin with `run-in' 
% headings that are on the same line as the start of the section's text, 
% and don't like being messed around like this. You can change the 
% indentation before these two sectional headings like this:
%\begin{verbatim}
%    \subparagraphfont{\hspace*{5em}}
%\end{verbatim}
% This adds an extra 5\,em space before each subparagraph heading.
% 
% As a further example, you might want chapter headings set flush with 
% the right margin.  This will do the job:
%\begin{verbatim}
%    \chapterfont{\raggedleft}
%\end{verbatim}
% 
% If you want to play around with this sort of thing, it might be useful 
% to know what sort of positioning you get by default with the standard 
% classes: all sectional headings except chapter and part are fully 
% justified (text set flush with the left and right margins), and 
% chapter headings are raggedright. Part headings vary: they are 
% raggedright in the article class, and centred in the book and report 
% classes.
% 
% \subsection{A complication affecting multiple line headings}
% 
% The standard \comname{section}, \comname{subsection}, and 
% \comname{subsubsection} commands ensure that, if you've got a 
% multiple line heading, lines beyond the first are typeset with a small 
% amount of indentation.  This is called hanging indentation, and is 
% entirely appropriate with the standard formatting.  However, two 
% problems arise from this: firstly, this hanging indentation usually 
% looks pretty stupid if you've decided to have centred headings; and 
% secondly, due to a bug in \LaTeX, the hanging indentation is 
% suppressed if you use |\\| in a heading that's typeset raggedright or 
% centred.
% 
% The first problem can be dealt with: if you use the 
% \comname{nohang} command in the appropriate 
% \comname{\itinangle{section}font} command, the hanging indentation will 
% be suppressed. For example:
%\begin{verbatim}
%    \sectionfont{\nohang\centering}
%\end{verbatim}
% will ensure that any multiple line section headings come out centred 
% as expected.
% 
% The second problem -- the suppression of hanging indentation when you 
% use |\\| in a raggedright or centred heading -- remains unsolved. I'm 
% told that it's caused by the definition of \comname{@centercr}. This 
% is part of the \LaTeX\ kernel and beyond my abilities to patch up. 
% This problem has been reported as a \LaTeX\ bug, so it might well be 
% sorted out in a future \LaTeX\ release.
% 
% Donald Arseneau's \packname{ulem} package makes its own arrangements 
% in this area, so sectional headings that are underlined using 
% \packname{sectsty} and \packname{ulem} have correct hanging 
% indentation even if you do use |\\| to end a line early.
%
% \section{The KOMA-script classes}
% 
% If you just want to change the fount used for all sectional headings, 
% you shouldn't use \packname{sectsty} with any of the KOMA-script 
% classes. Instead, you should redefine the \comname{sectfont} command 
% provided by the KOMA-script classes. This is akin to using 
% \packname{sectsty}'s \comname{allsectionsfont} command.
% 
% For example, the default definition is:
%\begin{verbatim}
%  \newcommand*\sectfont{\sffamily\bfseries}
%\end{verbatim}
% you might want to change from this bold sanserif to medium italic 
% roman.  To do this, you could add the following line to your document 
% preamble:
%\begin{verbatim}
%  \renewcommand*\sectfont{\rmfamily\mdseries\itshape}
%\end{verbatim}
% If you'd like different sectional headings to be printed with 
% different styles of type to each other, or if you'd like to underline 
% sectional headings or play other games that you can't do with the 
% KOMA-script \comname{sectfont} command, then \packname{sectsty} might 
% be of use with the KOMA-script classes.
% 
% You should note that the modifications applied by \packname{sectsty} 
% commands happen immediately after the \comname{sectfont} command is 
% executed.
% 
% The documentation for this package is written with the standard 
% \LaTeX\ classes in mind, so might not tie up exactly to the 
% KOMA-script classes. Despite that, and despite differences in 
% behaviour when things go wrong, \packname{sectsty} should work as 
% expected with the KOMA-script classes.
% 
%
%\section{All the commands}\label{sec:command_list}
% 
% The full list of commands is:
% \begin{description}
% \item[\comname{allsectionsfont}\comarg{commands}] Changes the style of 
% all sectional headings by executing \comarg{commands} before 
% printing each heading.
% 
% \item[\comname{partfont}\comarg{commands}] Changes the style of 
% `part' headings only by executing \comarg{commands} before 
% printing each heading; this affects both the title of the part and the 
% part number.
% 
% \item[\comname{chapterfont}\comarg{commands}] Changes the style of 
% `chapter' headings only by executing \comarg{commands} before 
% printing each heading; this affects both the title of the chapter and 
% the chapter number.
% 
% \item[\comname{sectionfont}\comarg{commands}] Changes the style of  
% `section' headings only by executing \comarg{commands} before 
% printing each heading.
% 
% \item[\comname{subsectionfont}\comarg{commands}]Changes the style of 
% `subsection' headings only by executing \comarg{commands} before 
% printing each heading.
% 
% \item[\comname{subsubsectionfont}\comarg{commands}]Changes the style 
% of  `subsubsection' headings only by executing \comarg{commands} before 
% printing each heading.
% 
% \item[\comname{paragraphfont}\comarg{commands}]Changes the style of 
% `paragraph' headings only by executing \comarg{commands} before 
% printing each heading; you should not use text positioning commands 
% for this heading.
% 
% \item[\comname{subparagraphfont}\comarg{commands}]Changes the style of the 
% `subparagraph' heading only by executing \comarg{commands} before 
% printing each heading; you should not use text positioning 
% commands for this heading.
% 
% \item[\comname{minisecfont}\comarg{commands}]]Changes the style of the 
% `minisec' heading only by executing \comarg{commands} before 
% printing each heading.  This command always works, but since these 
% headings only exist in the KOMA-script classes, it's useless with the 
% standard \LaTeX\ classes.
% \end{description}
% 
% There are also these commands:
% \begin{description}
% \item[\comname{partnumberfont}\comarg{commands}]Changes the style of 
% `part' heading numbers only; this does not affect the title of the 
% part heading.
% 
% \item[\comname{parttitlefont}\comarg{commands}]Changes the style of 
% `part' heading titles only; this does not affect the number of the 
% part heading.
% 
% \item[\comname{chapternumberfont}\comarg{commands}]Changes the style 
% of `chapter' heading numbers only; this does not affect the 
% title of the chapter heading.
% 
% \item[\comname{chaptertitlefont}\comarg{commands}]Changes the style of 
% `chapter' heading titles only; this does not affect the number 
% of the chapter heading.
% \end{description}
%
% And finally, an anomalous helper command:
% \begin{description}
% \item[\comname{nohang}]For use in multiple-line headings: this 
% command stops lines beyond the first having hanging indentation, 
% which looks pretty daft with centred headings.
% \end{description}
%
% \section{Some notes}
%
% The way \packname{sectsty} works is by re-defining all the commands 
% that produce the sectional headings.  The change arranges things so 
% that the fount selection commands you specify are executed immediately 
% before the sectional heading is printed.  You can change sizes, for 
% example, with the normal \LaTeX\ size changing commands.
% 
% You can include almost any \LaTeX\ commands in the argument to one of 
% \packname{sectsty's} commands.  Whether any particular command will 
% work properly or have the effect you want is a different matter.  If 
% you come across anything interesting you can do with this package that 
% I've not mentioned and you think someone else might be interested in, 
% you could let me know and I'll put it in the documentation.
% 
% If you use long section names you might like to make all sectional 
% headings \comname{raggedright}:
%\begin{verbatim}
%    \allsectionsfont{\raggedright}
%\end{verbatim}
% This means that \LaTeX\ won't try and justify sectional headings and 
% should manage to avoid a hyphentated sectional heading which tends to 
% look pretty bad.
%
% If you use \packname{sectsty} and get a complaint that you are using
% an old version of \LaTeX, there's probably no need to worry.
% \packname{Sectsty} will probably work correctly with any version of
% \LaTeXe\ after June 1996; because the earliest version I've tested
% \packname{sectsty} with is the June 1998 release of \LaTeX, that's the
% version I've specified as being needed. \packname{Sectsty} is not
% meant to work with \LaTeX~2.09; it's a good idea to get \LaTeXe\ if at
% all possible.
%
% \section{Underlining}
% 
% Some people have to underline sectional headings because of 
% regulations governing thesis submission and things like that. If 
% you're not forced to use underlining, it's probably best to avoid it: 
% underlining is usually considered bad typographical practice 
% (well-placed horizontal rules are a different matter). On top of that, 
% underlining sectional headings with \packname{sectsty} is not as 
% trivial a job as I'd like -- you've either got to get another package 
% or accept quite a lot of limitations.
% 
% To underline a sectional heading with \packname{sectsty}, you need to 
% put the \comname{underline} command as the last command in a 
% \comname{\itinangle{section}font} command.  For example:
%\begin{verbatim}
%   \usepackage{sectsty}
%   \allsectionsfont{\sffamily\underline}
%\end{verbatim}
% will give you underlined sanserif headings.
% 
% There are two main problems with this way of doing things: firstly, 
% the standard \LaTeX\ \comname{underline} command produces a one line 
% box in LR mode that can't be split across lines. This means that long 
% headings can't be split into two or more lines and will always result 
% in overfull \comname{hbox}es. Secondly, the underline rule is placed 
% underneath the lowest extent of the text and affects vertical spacing. 
% This is particularly ugly in the case of \comname{paragraph} and 
% \comname{subparagraph} headings which are on the same line as the 
% first line of text of the section.
% 
% Both these problems can be avoided by using the \packname{ulem} 
% package (see section~\vref{ulemsource} for how to get it):
%\begin{verbatim}
%   \documentclass{article}
%   \usepackage{sectsty}
%   \usepackage[normalem]{ulem}
%   \allsectionsfont{\sffamily\underline}
%\end{verbatim}
% Don't forget that the \comname{underline} command must always be the 
% last item in the \comname{\itinangle{section}font} command. This 
% example uses the familiar \comname{underline} command as before, but 
% because \packname{ulem} has been loaded, \packname{sectsty} 
% automatically redefines \comname{underline} inside sectional headings 
% to use \packname{ulem}'s underline code. The \comname{underline} 
% command has its normal meaning outside sectional headings, so you won't 
% get any nasty surprises.
% 
% I prefer the results you get using the \packname{ulem} package, but 
% you might prefer the appearance of underlined sectional headings 
% produced without \packname{ulem}'s help. If so, and you're not using 
% \comname{paragraph} or \comname{subparagraph} sections, or section 
% headings that need to be split over two lines, there's no need to use 
% \packname{ulem}.
% 
% \packname{Sectsty} always plays some dirty tricks which involve 
% re-defining the \comname{underline} command inside sectional headings 
% only. These tricks work differently if \packname{ulem} has been 
% loaded, but it doesn't matter whether you load \packname{ulem} before 
% or after \packname{sectsty}.
% 
% Despite these fun and games, the \comname{underline} command always 
% has its usual definition outside sectional headings and will work 
% normally in the rest of your document.
%
% \subsection{A detailed look at underlining}
% 
% It is possible to underline sectional headings in other ways.  This 
% section explains how, and also explains a little more about 
% underlining sectional headings with \packname{sectsty}.
% 
% The \packname{secsty} package lets you use two different commands to 
% underline sectional headings: \comname{underline} and 
% \comname{ulemheading}. Both commands suffer from the same restriction 
% in use: they must always be the last command in the argument to the
% \comname{\itinangle{section}font} command.  Both commands can be used 
% whether or not you've loaded \packname{ulem}: they are defined 
% differently depending on whether or not the \packname{ulem} package 
% has been loaded.  The decision on which definition to use is made at 
% the \comname{begin\ttlb document\ttrb} command, so you can load 
% \packname{ulem} before or after \packname{sectsty}.
% 
% If you want to use underlined headings, I strongly suggest you get the 
% \packname{ulem} package as well.  Without the \packname{ulem} package, 
% you get identical results (with a few problems) in sectional headings 
% using both \comname{underline} and \comname{ulemheading}.
%
% \packname{Sectsty} re-defines the \comname{underline} command inside 
% sectional headings.  This re-definition is what allows underlining to 
% work correctly in all of the standard sectional headings, and allows 
% the same command to behave differently if you've use the 
% \packname{ulem} package.  \TeX's usual grouping rules mean that the 
% \comname{underline} command is restored to its usual meaning at the 
% end of each sectional heading: the re-definition used by 
% \packname{sectsty} should have no effect on the rest of your document.
%
% Assuming for the moment that you're not using \packname{ulem}, you can 
% get a straightforward single underline using the normal \LaTeX\ 
% underline command like this:
%\begin{verbatim}
%   \allsectionsfont{\underline}
%\end{verbatim}
% This has a few problems. Most noticeably, it won't allow sectional 
% headings to break at the end of the line, so long headings will extend 
% beyond the right hand edge of the text. This is because the standard 
% \LaTeX\ \comname{underline} command puts its argument into a box made 
% in LR mode, so headings underlined this way will be one line headings 
% no matter what you do.
% 
% Another problem is that the underline rule used sits below the lowest 
% possible extent of the text it's underlining, and so increases the 
% space between the underlined heading and the text below. This is 
% especially noticeable if you're using \comname{paragraph} or 
% \comname{subparagraph} headings. And remember that the 
% \comname{underline} command must be the last in this list, like this:
%\begin{verbatim}
%   \allsectionsfont{\sffamily\underline}
%\end{verbatim}
% If you put \comname{sffamily} (or anything else) after 
% \comname{underline}, it won't work properly.
% 
% \subsubsection{Underlining with the \packname{ulem} package}
% 
% The \packname{ulem} package has some nice commands for improved 
% underlining in normal text. The main advantages are that the underline 
% rule is positioned better (so it doesn't mess up the line spacing), 
% and it allows long underlined headings to break normally at the end of 
% the line. All you need to do is load \packname{ulem}, and 
% \packname{sectsty} will do the rest. Try the following example as it 
% is here:
%\begin{verbatim}
%   \documentclass{article}
%   \usepackage{sectsty}
%   \usepackage[normalem]{ulem}
%   \allsectionsfont{\sffamily\raggedright\underline}
%   \begin{document}
%   \section{A very long sectional heading title that will 
%            have to be split over two lines}
%   \end{document}
%\end{verbatim}
% You'll notice that the long section heading was split over two 
% lines.  Now try this:
%\begin{verbatim}
%   \documentclass{article}
%   \usepackage{sectsty}
%   \allsectionsfont{\sffamily\raggedright\underline}
%   \begin{document}
%   \section{A very long sectional heading title that will 
%            have to be split over two lines}
%   \end{document}
%\end{verbatim}
% You'll notice that the underlining rule is positioned differently, and 
% the heading could not be split over two lines.
% 
% If you want to use in sectional headings some of the other types of 
% underlining allowed by the \packname{ulem} package, you can use the 
% \comname{ulemheading} command, as in this example to give double 
% underlining and raggedright sectional headings:
%\begin{verbatim}
%   \usepackage{sectsty,ulem}
%   \allsectionsfont{\raggedright\ulemheading{\uuline}}
%\end{verbatim}
% The \comname{ulemheading} command is meant to be used only inside 
% sectional headings like this. It takes two arguments: the first 
% argument is the \packname{ulem} package command to generate a 
% particular style of underlining; the second argument is the text to be 
% underlined, and is provided by the command that generates the 
% sectional heading. All you have to do is provide the first argument 
% and ensure that you put the \comname{ulemheading} at the end of the 
% \comname{\itinangle{section}font} command's argument, as in this 
% example to give you wavy underlined sans-serif headings:
%\begin{verbatim}
%   \usepackage{sectsty,ulem}
%   \allsectionsfont{\sffamily\ulemheading{\uwave}}
%\end{verbatim}
% The full list of modifications allowed by the \comname{ulemheading} 
% command is:
% \begin{center}
% \begin{tabular}{ll}
%   \ttbs ulemheading\ttlb\ttbs uline\ttrb  & single underline  \\
%   \ttbs ulemheading\ttlb\ttbs uuline\ttrb & double underline  \\
%   \ttbs ulemheading\ttlb\ttbs uwave\ttrb  & wavy underline    \\
%   \ttbs ulemheading\ttlb\ttbs sout\ttrb   & strike out with \texttt{-} \\
%   \ttbs ulemheading\ttlb\ttbs xout\ttrb   & cross out with \texttt{/}  \\
% \end{tabular}
% \end{center}
% It's possible to define more by following the directions in the 
% \packname{ulem} package.
% 
% If you typeset a document that uses \comname{ulemheading} on a system 
% where the \packname{ulem} package is unavailable, the document will be 
% processed but the output will be different. If you've not loaded the 
% \packname{ulem} package, \comname{ulemheading} will produce 
% underlining exactly the same as if you'd used the \comname{underline} 
% command: \comname{ulemheading} is defined to ignore the first argument 
% and pass the heading text to the normal underlining code. This means 
% you can produce a document using \packname{ulem}'s fancy underlining, 
% and process it on a \LaTeX\ system without \packname{ulem} by making a 
% single modification: commenting out the \comname{usepackage\ttlb 
% ulem\ttrb} command. The results will of course be different, but the 
% document will typeset.
% 
% \subsubsection{More notes on \packname{ulem} and 
% underlining}\label{ulemsource}
% 
% The \packname{ulem} package is available via anonymous ftp from the 
% Comprehensive \TeX\ Archive Network (CTAN). 
% You can find a list of CTAN sites and a Web interface to CTAN at 
% \texttt{http://www.tug.org/ctan.html}. The following ftp urls work now 
% (August 1998):
% \begin{center}
%{\footnotesize\begin{tabular}{@{}l@{}}
% \ttfamily
% ftp://ftp.dante.de/tex-archive/macros/latex/contrib/other/misc/ulem.sty\\
% \ttfamily
% ftp://ftp.tex.ac.uk/tex-archive/macros/latex/contrib/other/misc/ulem.sty\\
% \ttfamily
% ftp://ctan.tug.org/tex-archive/macros/latex/contrib/other/misc/ulem.sty\\
%\end{tabular}}
% \end{center}
% The \packname{ulem} package was written by Donald Arseneau, who 
% contributed some code and lots of useful advice to \packname{sectsty}.
% 
% It doesn't matter if you load \packname{ulem} before or after 
% \packname{sectsty}, because \packname{sectsty} waits until the 
% \comname{begin\ttlb document\ttrb} command before checking to see if 
% \packname{ulem} has been loaded.
% 
% \packname{Sectsty} uses a cunning trick to re-define the 
% \comname{underline} command inside sectional headings only; 
% \comname{underline} will work normally outside sectional headings.  
% The trick is cunning because the re-definition is different if the 
% \packname{ulem} package is in use in that document: the commands that 
% make this trick work wait until the \comname{begin\ttlb document\ttrb} 
% command has been executed, so it doesn't matter if you load 
% \packname{ulem} before or after \packname{sectsty}.
%
% The \comname{underline} and \comname{ulemheading} commands produce 
% identical results if the \packname{ulem} package is not loaded; they 
% will both use \LaTeX's normal underlining mechanism.  If you do load 
% \packname{ulem}, \comname{underline} will produce nicer results, and 
% \comname{ulemheading} will allow you to use any of \packname{ulem}'s 
% different underlining styles.
% 
% The \packname{ulem} package changes \LaTeX's emphasis commands so that 
% they use underlining rather than italics for emphasis.  If you don't 
% want this, you should load \packname{ulem} with the |normalem| option:
%\begin{verbatim}
%   \usepackage[normalem]{ulem}
%\end{verbatim}
%
% \section{Other things you can do with \packname{sectsty}}
% 
% Here are a few other things you can do using \packname{sectsty}; the 
% techniques for modifying section heading numbers work with or without 
% \packname{sectsty}. If you find that you can already get 
% \packname{sectsty} to do what you want to do, it might be an idea to 
% leave reading this section until later.
% 
% If you are going to read on, an apology: the \packname{sectsty} 
% package was originally meant to be a very simple thing to use. Various 
% requests from people who wanted to do various things mean that it's no 
% longer as simple to use as I'd like. This can't be helped: some people 
% \emph{need} underlining, and that's that. Unfortunately, the 
% documentation has ended up much more complicated that I'd like. This 
% section makes it even worse. I hope that the use people get from the 
% over long documentation outweighs the extra hassle it causes.
% 
% \subsection{Suppressing a page number}
% It's occasionally useful to be able to suppress page numbering on the 
% first page of a chapter. You can do this by saying:
%\begin{verbatim}
%   \chapterfont{\thispagestyle{empty}}
%\end{verbatim}
% This works because the argument to the \comname{chapterfont} command 
% is (obviously) executed on the page that the chapter begins on. As 
% luck has it, it's executed after the \comname{thispagestyle\ttlb 
% plain\ttrb} command issued by the \comname{chapter} command, so the 
% page style selected by the \comname{chapterfont} command is the one 
% that's used.
% 
% \subsection{Rules around sectional headings}
% 
% I've included a `unofficial' command, \comname{sectionrule}, in 
% \packname{sectsty} that can put a solid rule across the entire width 
% of the page, above and below a sectional heading. It's probably a good 
% idea to visit the library and study some typography books before using 
% this command. The command must be used as the last command in a 
% \comname{\itinangle{section}font} command, and has this syntax:
% \begin{center}
% \begin{tabular}{ll}
% \comname{sectionrule} & \comarg{raise top by}\comarg{top rule height}\\
%                 & \comarg{raise bottom by}\comarg{bottom rule height}\\
% \end{tabular}
% \end{center}
% \comarg{raise top by} is the length that the top rule is raised above 
% the baseline of the top line of the heading;
% \comarg{top rule height} is the height (thickness) of the top rule;
% \comarg{raise bottom by} is the length that the bottom rule is raised 
% above the baseline of the bottom line of the heading (a negative 
% length places the rule underneath the last line); and
% \comarg{bottom rule height} is the height (thickness) of the bottom 
% rule.
% 
% The \comname{sectionrule} command works like this:
%\begin{verbatim}
%   \sectionfont{\sectionrule{3ex}{3pt}{-1ex}{1pt}}
%\end{verbatim}
% What this example does is place two rules across the full width of the 
% text. One is a 3\,pt rule 3\,ex above the baseline of the top line of 
% the heading, and the other is a 1\,pt rule 1\,ex below the baseline of 
% the bottom line of the heading.
% 
% The vertical space before and after sectional headings can be affected 
% by these rules: the vertical space around a heading is placed before 
% and after \emph{everything} that is printed for the sectional heading, 
% so if a rule is the topmost item in the sectional heading, then the 
% vertical space will be measured to that rule.
% 
% Setting the height of either rule to 0\,pt will make it invisible, 
% although such a rule can still have an effect on spacing if you raise 
% or lower it.
% 
% The \comname{sectionrule} command has a few problems: in particular, 
% it can't place rules around centred headings, and it doesn't work 
% properly with run in headings such as the standard \comname{paragraph} 
% and \comname{subparagraph} headings. You might like to try the 
% \packname{titlesec} package if \packname{sectsty} can't help you do 
% what you want.
% 
% Because \comname{sectionrule} must be the last command in a 
% \comname{\itinangle{section}font} command, it can't be used with 
% underlined section headings: the underlining commands must 
% also be placed last, so you can't have both underlining and rules 
% around a sectional heading.
% 
% I wrote the \comname{sectionrule} command and it will be staying in 
% \packname{sectsty}. I call it `unofficial' because \packname{sectsty} 
% is meant to be very simple, and this command takes things a long way 
% away from my original `design concept'; this is why it's not 
% mentioned in the bulk of the documentation above.
% 
% \subsection{A box around sectional headings}
% 
% You can put a sectional heading inside a frame using the standard 
% \LaTeX\ \comname{fbox} command like this:
%\begin{verbatim}
%   \sectionfont{\noindent\fbox}
%\end{verbatim}
% 
% This has two limits: it doesn't work with \comname{chapter} or 
% \comname{part} headings, and it only works with single line headings. 
% The reason for this last problem is that the \comname{fbox} command 
% typesets text in LR mode and will therefore always produce a single 
% line of text.
%
% I've heard that other box making commands can be used to place a frame 
% around a sectional heading in a similar way (\comname{colorbox} 
% apparently works). If you use any box making command like this, you 
% will need to add a \comname{noindent} as with \comname{fbox}. This is 
% because the box making command switches \TeX\ from vertical mode to 
% horizontal mode, which inserts a paragraph indent unless there's a 
% \comname{noindent} at that point. There is a \comname{noindent} 
% command buried deep inside the code that produces sectional headings, 
% but too late on to help with this.
% 
% Another way of putting a box round a sectional heading gets round the 
% one-line limit of the simple approach above:
%\begin{verbatim}
%   \makeatletter
%   
%   \newcommand{\sectbox}[1]{%
%     \noindent\protect\fbox{%
%       \@tempdima=\hsize
%       \advance\@tempdima by-2\fboxsep
%       \advance\@tempdima by-2\fboxrule
%       \protect\parbox{\@tempdima}{%
%         \smallskip
%         % extra commands here
%         #1\smallskip
%         }}}
%   
%   \makeatother
%   
%   \sectionfont{\sectbox}
%\end{verbatim}
% Again, this doesn't work properly with \comname{chapter} or 
% \comname{part} headings; another limit is that the \comname{sectbox} 
% command must be the last command in the 
% \comname{\itinangle{section}font} command.
% 
% This technique has two significant differences to the first 
% suggestion: firstly, it puts a bit of extra vertical space between the 
% text and the frame, which improves the appearance of the heading; 
% secondly, it places the text of the heading inside a \comname{parbox} 
% that stretches across the full width of the text.  This means that 
% long headings can be broken across lines, and also that the 
% surrounding frame extends across the full width of the text, rather 
% than just enclosing the text of the heading.
% 
% While you can use fount changing commands as usual with the 
% \comname{sectbox} command -- 
% \comname{sectionfont\ttlb\comname{sffamily}\comname{sectbox}\ttrb} 
% will work as expected -- the use of \comname{parbox} means that 
% \comname{raggedright} and similar commands won't work in 
% \comname{\itinangle{section}font} commands. There is a way round this 
% problem: put the appropriate command in the definition of 
% \comname{sectbox} at the place marked \verb|extra commands here|. For 
% example, you could say:
%\begin{verbatim}
%   \makeatletter
%   
%   \newcommand{\sectbox}[1]{%
%   \noindent\protect\fbox{%
%   \@tempdima=\hsize
%   \advance\@tempdima by-2\fboxsep
%   \advance\@tempdima by-2\fboxrule
%   \protect\parbox{\@tempdima}{%
%   \smallskip
%   \raggedright% extra commands here
%   #1 \smallskip
%   }}}
%   
%   \makeatother
%   
%   \sectionfont{\sectbox}
%\end{verbatim}
% and you'd get raggedright headings within the box.  Both 
% \comname{raggedleft} and \comname{centering} also work, although you 
% might like to use \comname{nohang} with \comname{centering}.
% 
% \subsection{Changes to section numbers}
% 
% The two suggestions below don't require \packname{sectsty}; I'm 
% including them because if you're using \packname{sectsty}, you 
% might want to do something like this.
% 
% The suggestions modify the \comname{@seccntformat} command. This is 
% the internal \LaTeX\ command which prints the number part of all 
% sectional headings except chapter and part headings. It's quite in 
% order to change this sort of command: one of the reasons this command 
% exists in the first place is so that people can change it to modify 
% the output they get with \LaTeX.  You can find out more about it 
% by \LaTeX ing \filename{classes.dtx}, part of the standard \LaTeX\ 
% distribution.
% 
% The best place in general for the modifications I suggest in this 
% section is in a class or package file. If you put the modifications 
% there, you won't need the surrounding \comname{makeatletter} and 
% \comname{makeatother} commands.
% 
% If you find yourself wanting to do more stuff along these lines, it 
% might be an idea to look at the \packname{titlesec} package from CTAN.
% 
% \subsubsection{Printing the section number in the left margin}
%
% This is a quick hack I stumbled over by accident one day and I hope 
% someone else finds it useful. I haven't tested it thoroughly, so do be 
% aware that it might produce unwanted effects; I can't see that it will 
% do anything untoward, but I think it's best to be paranoid when 
% dealing with computers.
% 
% Putting this code in the preamble of your document:
%\begin{verbatim}
%   \makeatletter
%   \def\@seccntformat#1{\protect\makebox[0pt][r]{\csname
%                        the#1\endcsname\quad}}
%   \makeatother
%\end{verbatim}
% will typeset the number of each section in the left margin, with the 
% start of each instance of sectional heading text aligned with the left 
% hand edge of the body text. It doesn't affect chapter or part 
% headings. This code won't affect the normal paragraph and subparagraph 
% headings. If you change the normal form of these headings by telling 
% \LaTeX\ to print section numbers with them, paragraph headings will 
% work as you'd expect, but subparagraph headings will have the section 
% number to the left of the normal position although not in the left 
% margin.
% 
% \subsubsection{Putting a full stop (period) after the section number}
% 
% Requests on how to do this appear in \texttt{news://comp.text.tex} 
% quite often.  One solution is:
%\begin{verbatim}
%   \makeatletter
%   \def\@seccntformat#1{\csname the#1\endcsname.\quad}
%   \makeatother
%\end{verbatim}
% This will put a full stop after sectional numbers in sectional headers 
% other than part and chapter headings. It doesn't affect 
% cross-references or table of contents entries.
% 
% An interesting extension to the simple original command allows you to 
% control the style of numbering you get with each level of sectional 
% heading independently:
%\begin{verbatim}
%   \makeatletter
%   \def\@seccntformat#1{\@ifundefined{#1@cntformat}%
%   {\csname the#1\endcsname\quad}%  default
%   {\csname #1@cntformat\endcsname}% individual control
%   }
%   \def\section@cntformat{\thesection.\quad}
%   \def\subsection@cntformat{\thesubsection.\quad}
%   \makeatother
%\end{verbatim}
% this example gives you a full stop after section and subsection 
% headings, and has no effect on other levels.
% 
% \section{Compatibility with other packages}
% 
% The \packname{sectsty} package works by blindly re-defining the 
% various sectioning commands, so any package that requires
% that \LaTeX's sectioning commands are precisely as they are defined 
% in the standard classes will have trouble working with 
% \packname{sectsty}.
% 
% The \packname{fncychap} package, for example, re-defines the code 
% that produces chapter headings.  If you use \packname{fncychap} with 
% \packname{sectsty}, you will have to load \packname{fncychap} after 
% \packname{sectsty}:
%\begin{verbatim}
%    \usepackage{sectsty}
%    \usepackage{fncychap}
%\end{verbatim}
% You'll find that \packname{sectsty} will have no effect on chapter 
% headings when you use it like this.
% 
% Some packages perform interesting tricks to add code to the standard 
% sectioning commands.  These packages might well work quite happily 
% with \packname{sectsty}, but they must be loaded after 
% \packname{sectsty}: because \packname{sectsty} re-defines the 
% sectioning commands, any earlier changes will be thrown away.
% 
% In particular, the \packname{minitoc} package modifies the sectioning 
% commands (rather than just re-defining them like \packname{sectsty} 
% does), but if you say:
%\begin{verbatim}
%   \usepackage{sectsty,minitoc}
%\end{verbatim}
% to load \packname{minitoc} after \packname{sectsty}, everything should 
% work perfectly.
%
% \StopEventually{}
%
% \iffalse
% 2002/02/25 v2.0.2 Changed email address and fiddled with scribbles 
%     round the edges.  No code changes.
% 1999/04/12 v2.0.1 changed licence conditions to lppl.txt; stopping 
%     it typesetting code by default (silly boy).  Released.
% 1999/04/07 v2.0 bit the bullet.  Released
% 1999/04/06 v1.9.7 Added KOMA-script note.  Unreleased.
% 1999/03/08 v1.9.6 Fixed \sectbox definition.  Commented out the 
%     redundant chapfudge defs.  Unreleased.
% 1999/02/07 v1.9.5 Fixed showkeys problem thanks to Bernd Schandl.  
%     More playing with underlining code.  Unreleased.
% 1999/01/22 v1.9.4 Playing with underlining code.  Unreleased.
% 1999/01/20 v1.9.3 Changed \SS@sectlevel to \SSsectlevel so that it 
%     can be used inside documents.  It's 1999, not 1998.  Hunted down 
%     and killed yet another spurious space.  Well, killed it anyway.  
%     God knows where it actually was.  Doc mods.  First bash at 
%     getting \sectionrule to work with the KOMA-script classes.  
%     Unreleased.
% 1999/01/18 v1.9.2 added grouping to \chapter and \part commands.  
%     Why didn't I do this ages ago?  Hunted down and killed a 
%     spurious space.  Added grouping to \minisec too, and made its 
%     underlining stuff same as part and chapter stuff.  Changed 
%     \SE@ to \SS@.  Unreleased.
% 1999/01/15 v1.9.1 added debugging stuff.  Unreleased.
% 1999/01/13 v1.9 added stuff for KOMA-script classes.  Untested,  
%     undocumented, and unreleased.  This will transmogrify into v2.0 
%     when it's ready for release.
% 1999/01/06 v1.8.7 Added warning if sectsty isn't going to do 
%     anything because article, report, or book haven't been loaded.  
%     Released.
% 1999/01/03 v1.8.6 More \fbox doc bits.  Added \ttbs command and 
%     changed \comname definition to use it.  Untested.  Unreleased.
% 1998/12/29 v1.8.5 Added doc note about \fbox.  Unreleased.
% 1998/12/11 v1.8.4 Fixed \nohang bug (how the hell did *that* 
%     happen?).  Some documentation mods.  Released
% 1998/12/10 v1.8.3 Documention mods.  Unreleased
% 1998/12/10 v1.8.2 Documention mods. Released
% 1998/12/09 v1.8.1 Documentation mods and changed syntax of 
%     \sectionrule command.  Modified doc stuff so code comes out in 
%     9pt and codeline numbers in 7pt, as standard.  Unreleased.
% 1998/12/08 v1.8 Major \sectionrule mods - should now work with 
%     raggedleft and chapter/part headings as well.  Documentation 
%     mods.  Unreleased
% 1998/12/06 v1.7.2 Documentation mods.  Unreleased.
% 1998/12/01 v1.7.1 Documentation mods.  Unreleased.
% 1998/11/29 v1.7 Stopped being such a bloody fool and added \nohang.  
%     Added note about rule under chapter and part headings.  
%     Unreleased
% 1998/11/19 v1.6 Probably dealt with centering/underline multiline 
%     problem.  Taken Donald Arseneau's name out of the copyright 
%     notice.  Some doc changes.  Unreleased
% 1998/11/18 v1.5.3 Minor doc changes.  Released?
% 1998/11/16 v1.5.2 Minor doc changes.  Re-positioned \strut in 
%     \SS@ulemsectuline.  Unreleased.
% 1998/11/15 v1.5.1 Added \strut to \SS@ulemsectuline.  Some doc 
%     changes.  Unreleased.
% 1998/11/14 v1.5 Changed \sectionrule command and documented it.  
%     Changed \@svec fix to \let.  Not released.
% 1998/11/12 v1.4.4 added \sectionrule command.  Iffy. No doc changes.  
%     Unreleased.
% 1998/11/11 v1.4.3 Moved the version history; added fix for 
%     underlining *-form heading problem; minor documentation mods; 
%     started to document way of putting a full width rule underneath 
%     a section heading and ran into trouble; unreleased.
% 1998/08/24 v1.4.2 Yet more documentation mods; unreleased
% 1998/08/20 v1.4.1 Documentation mods; unreleased
% 1998/08/05 v1.4 more underlining modifications and finished docs
% 1998/07/15 v1.3 added sectional heading underlining stuff and added 
%      some more documentation.  Unreleased.
% 1998/06/28 v1.2 removed \selectfont commands which are redundant 
%      and stop you using commands that take the sectional heading as 
%      an argument.  This is to allow you to underline sectional 
%      headings, as is often required in theses etc.
% 1998/05/28 v1.1.1 fixed problem with \OnlyDescription and 
%      corrected \CheckSum (kicks self vigorously)
% 1998/05/27 v1.1 Fixed bugs in chapter/part code, corrected a 
%      documentation bug, and added a few more notes (thanks to
%      Bernd Schandl <bschand@math.clemson.edu>).  And removed the 
%      spurious spaces from the other sectional headings (grr).
% 1998/05/26 v1.0 Made into dtx/ins pair for general release
% 1998/05/13 v0.2 Changed more than a little
% 1996/12/08 v0.1 original version
%\fi
%
% \iffalse
% This code is used to switch to the usual fount sizes for 
% typesetting the code; because this document is typeset in 11pt rather 
% than 10pt, the code would normally be typeset in a larger than usual 
% fount leading to lots of overfull \hboxes.  I've bunged it here so 
% the casual reader can see what's going on - it's executed just 
% before the first code is typeset.
%
% Because this document is set in 11pt, need to select a smaller than 
% usual size for \MacroFont to get the macros set in 9pt, and code line 
% numbers set in 7pt.
%
% Yes, I know it's ugly.  It was a bit of a battle to get it to work, 
% and now that it does work, I'm loathe to change anything.
%\fi 
%
% \makeatletter
% \def\macro@font{\fontencoding \encodingdefault \fontfamily \ttdefault 
% \fontseries \mddefault \fontshape \updefault \footnotesize}
% \let\MacroFont\macro@font
% 
% \def\theCodelineNo{\rmfamily%
% \@setfontsize\scriptsize\@viipt\@viiipt%
% \arabic{CodelineNo}}
% \makeatother
%
% 
% \section{The code itself}
% 
%
% Who am I, and what do I need?  This package will probably work with 
% any version of \LaTeXe, but I've only tested it with the June 
% 1998 release and some later ones.
%
%    \begin{macrocode}
\ProvidesPackage{sectsty}[2002/02/25 v2.0.2 Commands to change all 
sectional heading styles]
\NeedsTeXFormat{LaTeX2e}[1998/06/01]
%    \end{macrocode}
% 
% \subsection{Options}
% 
% \subsubsection{Control how much stuff is reported}
% 
% This lot is for my benefit at the moment.  Maybe the full range of 
% values will have some meaning one day.
% 
% \begin{macro}{\SS@ocl}
% \comname{SS@ocl}\comarg{number}\comarg{if okay to blather}\comarg{if 
% not okay to blather}
% 
% (ocl stands for On Chat Level)
% 
% If \comarg{number} (1-4) is greater than the current chat level, then 
% blather away. If not, do the other thing. So use 4 for stuff to be 
% printed all the time, and 1 for other stuff.
% 
%    \begin{macrocode}
\long\def\SS@ocl#1#2#3{\ifnum #1>\SS@chatlevel #2\else #3\fi}
%    \end{macrocode}
% \end{macro} 
%
% \begin{macro}{\SS@oclto}
%
% On Chat Level TypeOut -- used for debugging reports (etc).
% 
%    \begin{macrocode}
\def\SS@oclto#1#2{\SS@ocl{#1}{\typeout{#2}}{}}
%    \end{macrocode}
% \end{macro}
% 
% 
% \begin{macro}{\SS@chatlevel}
% By default, don't make much fuss.
%    \begin{macrocode}
\def\SS@chatlevel{3}
%    \end{macrocode}
% 
% Maybe I'll activate the other options one of these days, but only if 
% the messages are meant for people other than me.
% 
%    \begin{macrocode}
% \DeclareOption{verbose}{\def\SS@chatlevel{1}}% chatty
% \DeclareOption{silent}{\def\SS@chatlevel{3}}%  yorkshire
% 
% \DeclareOption{errorshow}{\def\SSchatlevel{3}}%  yorkshire
% \DeclareOption{warningshow}{\def\SS@chatlevel{2}}%  taciturn
% \DeclareOption{infoshow}{\def\SS@chatlevel{1}}%  chatty
% \DeclareOption{debugshow}{\def\SS@chatlevel{0}}%  garrulous
% 
\DeclareOption{garrulous}{\def\SS@chatlevel{0}}
\DeclareOption{chatty}{\def\SS@chatlevel{1}}
\DeclareOption{taciturn}{\def\SS@chatlevel{2}}
\DeclareOption{yorkshire}{\def\SS@chatlevel{3}}
%    \end{macrocode}
% \end{macro}
% 
%    \begin{macrocode}
\ProcessOptions
%    \end{macrocode}
% 
%
% \subsection{Underlining}
% 
% Stuff for underlining sectional headings.  I didn't write much of 
% this myself.
% 
%\begin{macro}{\@svsec}
% First thing to do\ldots\ Define |\@svsec| to prevent underlining 
% extras throwing a wobbly when you try to underline a |\section*| or 
% similar. |\@svsec| is referred to by the underlining code, but it 
% normally only exists inside the non star form of the commands 
% generating sectional headings.
%    \begin{macrocode}
\let\@svsec\relax
%    \end{macrocode}
%\end{macro}
% 
%\begin{macro}{\nohang}
% A hack: you should get hanging indentation on subsequent lines of all 
% sectional headings, but this isn't always appropriate.  
% \comname{nohang} suppresses the hanging indentation.  If you're using 
% centred or raggedright headings, a bug in \comname{@centercr} means 
% the hanging indentation is suppressed if you end lines with |\\|.
%    \begin{macrocode}
\newcommand{\nohang}{\let\@hangfrom\@empty}
%    \end{macrocode}
%\end{macro}
% 
% And then add some stuff so that:
%\begin{verbatim}
%   \section{Algorithm according to \cite{knuth}}
%\end{verbatim}
% works when using the \packname{showkeys} package.  Problem reported by 
% and solved by Bernd Schandl.
%\begin{macro}{\SS@origunderline}
% start by saving the original definition of \comname{underline}
%    \begin{macrocode}
\let\SS@origunderline\underline
%    \end{macrocode}
%\end{macro}
%
% Then check to ensure that the \comname{underbar} command is as it 
% should be by default.  This matters: \comname{underbar} is defined 
% inside sectional headings to use \comname{orig@underline} rather than 
% \comname{underline}, because \comname{underline} is redefined under 
% such circumstances; this breaks the \comname{underbar} command used 
% by \packname{showkeys}.  If \comname{underbar}'s definition has 
% changed, I need to know about it.
%
%    \begin{macrocode}
\CheckCommand*{\underbar}[1]%
  {\underline{\sbox\tw@{#1}\dp\tw@\z@\box\tw@}}
%    \end{macrocode}
% 
% \subsubsection{Main underlining code}
% The first command is for underlining sectional headings created 
% with |\@startsection|.
% 
%\begin{macro}{\SS@ulemsectuline}
% 
% |\SS@ulemsectuline| is a hack that modifies the behaviour of sections 
% created using the |\@startsection| command. It allows you to underline 
% sectional headings with fewer problems than otherwise. First argument 
% is the \packname{ulem} underlining command; second argument is the 
% section heading text to underline.
%    \begin{macrocode}
\newcommand*{\SS@ulemsectuline}[2]{%
  \ifhmode% run-in head
    \begingroup%
    \def\hskip##1\relax##2\@@par{\endgroup\@@hskip##1\relax#1{##2}}%
  \else% stand alone head
    % \ifx\\\@centercr\let\@hangfrom\@empty\fi% deal with \@hangfrom prob
    \protected@edef\@svsec{\noexpand#1{\@svsec\strut}}% added strut
    \def\interlinepenalty##1##2\@@par{\@@interlinepenalty##1#1{##2}\@@par}%
    \fi%
  #2\@@par}% added strut here then removed it (stupid boy)
\let\@@hskip\hskip
\let\@@interlinepenalty\interlinepenalty
%    \end{macrocode}
%\end{macro}
% 
% \begin{macro}{\SS@chapuline}
% 
% A simple command that underlines everything up to the next |\par|.  
% It's used to underline chapter and part headings.  The |\part| 
% commands need a bit of extra modification for this to work.  This 
% command is now obsolete, because I turned my brain on and added 
% grouping to the chapter and part code, so I don't have to use 
% \comname{par} as an argument delimiter any more.
%    \begin{macrocode}
% \def\SS@chapuline#1\par{\uline{#1}\par}
%    \end{macrocode}
%\end{macro}
%
% \begin{macro}{\SS@underline}
% Save the definition of |\underline| in |\SS@underline| so \LaTeX's 
% normal |\underline| command is available in sectioning commands when 
% |\underline| has been re-defined.  For some reason, the construction
% |\let\SS@underline\underline| didn't work right so I started doing 
% it this way.  This way is now essential, because I need to add 
% |\strut|s to keep the underlines lined up (|\SS@ulemsectuline| 
% underlines the numbers and words of a heading separately, which 
% means the underlining would have a discontinuity unless I forced all 
% both the number and title boxes to have the same depth by adding a 
% |\strut| to each).
% 
% First check the definition of |\underline| in |latex.ltx| 
% hasn't changed; then define |\SS@underline| to be the same with added 
% struts.
%    \begin{macrocode}
\CheckCommand*{\underline}[1]{%
  \relax
  \ifmmode\@@underline{#1}%
  \else $\@@underline{\hbox{#1}}\m@th$\relax\fi}
%
\def\SS@underline#1{%
  \relax
  \ifmmode\@@underline{\strut#1}%
  \else $\@@underline{\hbox{\strut#1}}\m@th$\relax\fi}
%    \end{macrocode}
% \end{macro}
%
%\begin{macro}{\SS@ulemunderlinechapfudge}
%\begin{macro}{\SS@ulemheadingchapfudge}
%\begin{macro}{\SS@normunderlinechapfudge}
% 
% Three remarkable similar commands, written to deal with the problem of 
% underlining the number part of KOMA-script chapter headings.  I'm sure 
% there's a better way of doing it, but this appears to work and my head 
% hurts now.
%
% \comname{SS@ulemheadingchapfudge} is the only one which is still 
% used.  I've not changed the name to anything more sensible out of 
% sheer inertia.
% 
%    \begin{macrocode}
% \def\SS@ulemunderlinechapfudge#1{%
%   \ifSS@komascript%
%     \ifnum\SSsectlevel=1% chapter level
%       \ifx\SS@headingpart\SS@nopartid%
%         \SS@oclto{1}{Koma-script chapter number part}%
%         \let\SS@savechapterformat\chapterformat%
%         \def\chapterformat{\uline{\SS@savechapterformat}}%
%         \def\@tempcmda{#1}%
%       \else%
%         \SS@oclto{1}{Koma-script chapter title part}%
%         \def\@tempcmda{\uline{#1}}%
%       \fi%
%     \else%
%       \SS@oclto{1}{Koma-script not chapter}%
%       \def\@tempcmda{\uline{#1}}%
%     \fi%
%   \else%
%     \SS@oclto{1}{Not Koma-script}%
%     \def\@tempcmda{\uline{#1}}%
%   \fi%
%   \@tempcmda
% }%

\def\SS@ulemheadingchapfudge#1#2{%
  \ifSS@komascript%
    \ifnum\SSsectlevel=1% chapter level
      \ifx\SS@headingpart\SS@nopartid%
        \SS@oclto{1}{Koma-script chapter number part}%
        \let\SS@savechapterformat\chapterformat%
        \def\chapterformat{#1{\SS@savechapterformat}}%
        \def\@tempcmda{#2}%
      \else%
        \SS@oclto{1}{Koma-script chapter title part}%
        \def\@tempcmda{#1{#2}}%
      \fi%
    \else%
      \SS@oclto{1}{Koma-script not chapter}%
      \def\@tempcmda{#1{#2}}%
    \fi%
  \else%
    \SS@oclto{1}{Not Koma-script}%
    \def\@tempcmda{#1{#2}}%
  \fi%
  \@tempcmda
}%

% \def\SS@normunderlinechapfudge#1{%
%   \ifSS@komascript%
%     \ifnum\SSsectlevel=1% chapter level
%       \ifx\SS@headingpart\SS@nopartid%
%         \SS@oclto{1}{Koma-script chapter number part}%
%         \let\SS@savechapterformat\chapterformat%
%         \def\chapterformat{\SS@underline{\SS@savechapterformat}}%
%         \def\@tempcmda{#1}%
%       \else%
%         \SS@oclto{1}{Koma-script chapter title part}%
%         \def\@tempcmda{\SS@underline{#1}}%
%       \fi%
%     \else%
%       \SS@oclto{1}{Koma-script not chapter}%
%       \def\@tempcmda{\SS@underline{#1}}%
%     \fi%
%   \else%
%     \SS@oclto{1}{Not Koma-script}%
%     \def\@tempcmda{\SS@underline{#1}}%
%   \fi%
%   \@tempcmda
% }%
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%\begin{macro}{\underline}
%\begin{macro}{\ulemheading}
% Two commands:
%  |\underline{text}|
%                        used for normal underlining in all headings
%  |\ulemheading{ulem underline command}{text}|
%                        used for fancy underlining in all headings
%  
% Basic idea:
%
% \comname{SS@makeulinesect} defines \comname{underline} and 
%                                    \comname{ulemheading} 
% appropriately for |\@startsection| headings.
% 
% |\SS@makeulinechap| defines |\underline| and |\ulemheading| appropriately 
% for chapter and modified part headings.
%
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifundefined{UL@box}%
    {% if ulem has not been loaded
    \SS@oclto{1}{ulem not loaded; underlining setup}%
    \def\SS@makeulinesect{%
% \def\underline##1{\noindent\SS@underline{##1}}%
    \def\underbar##1{\SS@origunderline{\sbox\tw@{##1}\dp\tw@\z@\box\tw@}}%
    \def\underline{\SS@ulemsectuline{\SS@underline}}%
    \def\ulemheading##1{\SS@ulemsectuline{\SS@underline}}}%
%
    \def\SS@makeulinepartchap{%
%     \def\underline##1\par{\SS@underline{##1}\par}
%     \def\ulemheading##1##2\par{\SS@underline{##2}\par}}%
%     \def\underline##1{\SS@underline{##1}}% pre KOMA-script
%     \def\ulemheading##1##2{\SS@underline{##2}}}% pre KOMA-script
    \def\underbar##1{\SS@origunderline{\sbox\tw@{##1}\dp\tw@\z@\box\tw@}}%
%     \let\underline\SS@normunderlinechapfudge% 7/2/99
    \def\underline##1{\SS@ulemheadingchapfudge{\SS@underline}{##1}}%
%     \def\ulemheading##1##2{\SS@normunderlinechapfudge{##2}}% 7/2/99
    \def\ulemheading##1##2{\SS@ulemheadingchapfudge{\SS@underline}{##2}}}%
%
%   \def\SS@makeulinepart{%
%   \def\underline##1\par{\SS@underline{##1}\par}
%   \def\ulemheading##1##2\par{\SS@underline{##2}\par}}%
    }% endif ulem has not been loaded
%
    {% If ulem has been loaded
    \SS@oclto{1}{ulem loaded; underlining setup}%
    \def\SS@makeulinesect{%
    \def\underbar##1{\SS@origunderline{\sbox\tw@{##1}\dp\tw@\z@\box\tw@}}%
    \def\underline{\SS@ulemsectuline{\uline}}%
    \def\ulemheading##1##2{\SS@ulemsectuline{##1}{##2}}}%
%
    \def\SS@makeulinepartchap{%
%     \let\underline\SS@chapuline
%     \def\ulemheading##1##2\par{##1{##2}\par}}%
%     \let\underline\uline% pre KOMA-script
%     \def\ulemheading##1##2{##1{##2}}}% pre KOMA-script
    \def\underbar##1{\SS@origunderline{\sbox\tw@{##1}\dp\tw@\z@\box\tw@}}%
%     \let\underline\SS@ulemunderlinechapfudge% 7/2/99
    \def\underline##1{\SS@ulemheadingchapfudge{\uline}{##1}}%
    \let\ulemheading\SS@ulemheadingchapfudge}
    }% endif ulem has been loaded
}% end \AtBeginDocument
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\begin{macro}{\SS@rr}
% Stolen from \filename{latex.ltx}; this command is used to remove the 
% \comname{leftskip} and \comname{parindent} changes from the definition 
% of \comname{raggedright} in \comname{@start\-section} headings so run-in 
% headings can be indented as specified when you say 
% \comname{raggedright}.
%    \begin{macrocode}
\def\SS@rr{\def\raggedright{%
  \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip}}
%   \leftskip\z@skip% part of the original def
%   \parindent\z@}% part of the original def
%    \end{macrocode}
%\end{macro}
% 
% \subsection{Stuff for putting rules around headings}
% 
% Start out with some supporting commands\ldots
%
%\begin{macro}{\ifSS@komascript}
% 
% I can think of several reasons to know if one of the KOMA-Script 
% classes has been loaded, so let's have a new if for the job. This was 
% written for the \comname{sectionrule} command, which needs to know one 
% way or another, and since \comname{@ifclassloaded} can't be used 
% outside the preamble, this seemed like a sensible solution. The 
% alternative involved hideous contortions or horrible inefficiency as 
% far as I could tell.
% 
%    \begin{macrocode}
\newif\ifSS@komascript
\SS@komascriptfalse
\@ifclassloaded{scrartcl}{\SS@komascripttrue}{}
\@ifclassloaded{scrreprt}{\SS@komascripttrue}{}
\@ifclassloaded{scrbook} {\SS@komascripttrue}{}
%    \end{macrocode}
%\end{macro}

%\begin{macro}{\SS@sectid}
% A command to allow detection of the current section level.  0=part, 
% 1=chapter, 2=section, and so on.
%    \begin{macrocode}
\newcommand{\SS@sectid}[1]{\gdef\SSsectlevel{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\SS@nopart}
%\begin{macro}{\SS@titlepart}
%\begin{macro}{\SSnopartid}
%\begin{macro}{\SStitlepartid}
%\begin{macro}{\SSifnumberpart}
%\begin{macro}{\SSiftitlepart}
% A set of commands to allow detection of what part of a chapter or 
% part heading is being typeset (the number part or the title part). 
% This is quite important for bunging rules around the Koma-script 
% chapter headings, if nothing else.
%
%    \begin{macrocode}
\newcommand{\SS@nopart}{\global\let\SS@headingpart\SS@nopartid}
\newcommand{\SS@titlepart}{\global\let\SS@headingpart\SS@titlepartid}
% 
\newcommand{\SS@nopartid}{number part}
\newcommand{\SS@titlepartid}{title part}
% 
\newcommand{\SSifnumberpart}{%
  \ifx\SS@headingpart\SS@nopartid
      \expandafter\@firstoftwo
    \else
      \expandafter\@secondoftwo
  \fi}
% 
\newcommand{\SSiftitlepart}{%
  \ifx\SS@headingpart\SS@titlepartid
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
% 
%\begin{macro}{\ifraggedleft}
% With a bit of luck, the following command detects if \LaTeX\ is 
% currently doing raggedleft typesetting -- this test is used by the 
% rule commands below. The tests are based on this stuff from 
% |latex.ltx|:
%\begin{verbatim}
% \def\centering{%
%   \let\\\@centercr
%   \rightskip\@flushglue\leftskip\@flushglue
%   \parindent\z@\parfillskip\z@skip}
% \def\raggedright{%
%   \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip
%   \leftskip\z@skip
%   \parindent\z@}
% \def\raggedleft{%
%   \let\\\@centercr
%   \rightskip\z@skip\leftskip\@flushglue
%   \parindent\z@\parfillskip\z@skip}
%\end{verbatim}
% 
% If raggedleft is `on', the first argument is executed.  If it's 
% off, the second argument is executed.  This isn't the most elegant 
% code possible, but it does have the virtue that I understand it.
%    \begin{macrocode}
\def\ifraggedleft#1#2{%
  \edef\@tempcmda{\the\rightskip}%
  \edef\@tempcmdb{\the\z@skip}%
  \ifx\@tempcmda\@tempcmdb\@tempswatrue\else\@tempswafalse\fi
  \edef\@tempcmda{\the\leftskip}%
  \edef\@tempcmdb{\the\@flushglue}%
  \if@tempswa
    \ifx\@tempcmda\@tempcmdb\@tempswatrue\else\@tempswafalse\fi
    \fi
  \if@tempswa#1\else#2\fi}
%    \end{macrocode}
%\end{macro}
% \begin{macro}{\ifcentering}
% 
% A similar command to detect if centering is `on'; again, first 
% argument is executed if centering is on, second argument is executed 
% if it's not. This isn't the most elegant code possible, but it does 
% have the virtue that I understand it.
% 
%    \begin{macrocode}
% \def\ifcentering#1#2{%
%   \edef\@tempcmda{\the\rightskip}%
%   \edef\@tempcmdb{\the\@flushglue}%
%   \ifx\@tempcmda\@tempcmdb\@tempswatrue\else\@tempswafalse\fi
%   \edef\@tempcmda{\the\leftskip}%
%   \edef\@tempcmdb{\the\@flushglue}%
%   \if@tempswa
%     \ifx\@tempcmda\@tempcmdb\@tempswatrue\else\@tempswafalse\fi
%     \fi
%   \if@tempswa#1\else#2\fi}
\def\ifcentering{%
  \edef\@tempcmda{\the\rightskip}%
  \edef\@tempcmdb{\the\@flushglue}%
  \ifx\@tempcmda\@tempcmdb\@tempswatrue\else\@tempswafalse\fi
  \edef\@tempcmda{\the\leftskip}%
  \edef\@tempcmdb{\the\@flushglue}%
  \if@tempswa
    \ifx\@tempcmda\@tempcmdb\@tempswatrue\else\@tempswafalse\fi
    \fi
  \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
%    \end{macrocode}
%\end{macro}
% 
% \subsubsection{The main heading rule code}
% 
%\begin{macro}{\sectionrule}
% A rather dodgy command that will stick a rule across the full width of 
% the text, around a sectional heading, unless it's a run-in heading or 
% centred. Must be used as the last command in a |\...font| command;
%\begin{verbatim}
% \sectionrule{<top rule raise height>}   {<top rule height>}
%             {<bottom rule raise height>}{<bottom rule height>}.
%\end{verbatim}
% 
%    \begin{macrocode}
\newcommand{\sectionrule}[5]{%
  \ifcentering{%
    \PackageError{sectsty}%
    {Can't use \protect\sectionrule\space with \protect\centering}%
    {The \protect\sectionrule\space command doesn't work properly
    with sectional headings that\MessageBreak are centred, so I'll
    carry on as if you'd not used the \protect\sectionrule\space 
    command.}#5}%
    {\ifSS@komascript
      \ifnum\SSsectlevel>1
%       use normal sectionrule if Koma-script and not part/chapter
        \SS@oclto{1}{KOMA-script; normal section rule}%
        \SS@sectionrule{#1}{#2}{#3}{#4}{#5}%
      \else
%       use strange sectionrule if Koma-script and part/chapter
        \SS@oclto{1}{KOMA-script; part/chap section rule}%
        \SS@komapartchaprule{#1}{#2}{#3}{#4}{#5}%
      \fi
    \else
%     use normal sectionrule if not Koma-script
      \SS@oclto{1}{No KOMA-script; normal section rule}%
        \SS@sectionrule{#1}{#2}{#3}{#4}{#5}%
    \fi}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\SS@sectionrule}
%
% This gets called by |\sectionrule| unless in a part or chapter 
% heading, and picks one of two commands to place the rules depending on 
% whether the heading's raggedleft or not.
%
%    \begin{macrocode}
\def\SS@sectionrule#1#2#3#4#5{%
  \ifraggedleft
    {\SS@rlsectionrule{#1}{#2}{#3}{#4}{#5}}%
    {\SS@normsectionrule{#1}{#2}{#3}{#4}{#5}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\SS@normsectionrule}
%\begin{macro}{\SS@rlsectionrule}
% These are the commands that do the dirty work for 
% \comname{SS@sectionrule} and actually place the rules around the 
% headings. \comname{SS@normsectionrule} does for raggedright and fully 
% justified headings; \comname{SS@rlsectionrule} does for raggedleft 
% headings.
%    \begin{macrocode}
\def\SS@normsectionrule#1#2#3#4#5{%
  \let\SS@@par\@@par\let\@@par\relax% very dodgy
  \noindent\makebox[0pt][l]{\rule[#1]{\hsize}{#2}}%
    #5\hfill\makebox[0pt][r]{\rule[#3]{\hsize}{#4}}%
  \let\@@par\SS@@par\@@par}
% 
\def\SS@rlsectionrule#1#2#3#4#5{%
  \let\SS@@par\@@par\let\@@par\relax% very dodgy
  \noindent\makebox[0pt][l]{\rule[#1]{\hsize}{#2}}\hfill%
    #5\makebox[0pt][r]{\rule[#3]{\hsize}{#4}}%
  \let\@@par\SS@@par\@@par}
%    \end{macrocode}
%\end{macro}
%\end{macro}
% 
%\begin{macro}{\ifSS@starform}
%\begin{macro}{\secdef}
%
% Some code to help the rule drawing commands find out if the star form 
% of a chapter or part heading is being typeset. This information is 
% needed to get rules around chapters right in scrreprt and scrartcl.
%
%    \begin{macrocode}
\newif\ifSS@starform
% 
\def\secdef#1#2{\@ifstar{\SS@starformtrue#2}{\SS@starformfalse\@dblarg{#1}}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
% 
%\begin{macro}{\SS@komapartchaprule}
% 
% Some more commands for shoving rules around headings. They work just 
% like \comname{SS@sectionrule} and friends, but for part and chapter 
% headings
% 
%    \begin{macrocode}
% \def\SS@partchaprule#1#2#3#4#5{%
% \ifraggedleft{\SS@rlpartchaprule{#1}{#2}{#3}{#4}{#5}}%
% {\SS@normpartchaprule{#1}{#2}{#3}{#4}{#5}}}
\def\SS@komapartchaprule#1#2#3#4#5{%
  \ifraggedleft
    {\SS@rlkomapartchaprule{#1}{#2}{#3}{#4}{#5}}%
    {\SS@normkomapartchaprule{#1}{#2}{#3}{#4}{#5}}%
}
%    \end{macrocode}
%\end{macro}
% 
%\begin{macro}{\SS@normkomapartchaprule}
%\begin{macro}{\SS@komapartchaprule}
% 
% Called by \comname{SS@komapartchaprule}: these are the commands that 
% do the dirty work of placing the rules around the headings. 
% \comname{SS@normkomapartchaprule} does for raggedright and fully 
% justified headings; \comname{SS@rlkomapartchaprule} does for 
% raggedleft headings.
% 
%    \begin{macrocode}
% \def\SS@normpartchaprule#1#2#3#4#5\par{%
% \noindent\makebox[0pt][l]{\rule[#1]{\hsize}{#2}}%
% #5%
% \hfill\makebox[0pt][r]{\rule[#3]{\hsize}{#4}}%
% \par}
\def\SS@normkomapartchaprule#1#2#3#4#5{%
  \SS@oclto{1}{SS@normkomapartchaprule}%
  \ifSS@starform
    \SS@normsectionrule{#1}{#2}{#3}{#4}{#5}%
  \else
    \SSifnumberpart
  	  {\noindent\makebox[0pt][l]{\rule[#1]{\hsize}{#2}}#5}%
  	  {#5\hfill\makebox[0pt][r]{\rule[#3]{\hsize}{#4}}}%
  \fi
}
%    \end{macrocode}
% 
%    \begin{macrocode}
% \def\SS@rlpartchaprule#1#2#3#4#5\par{%
% \noindent\makebox[0pt][l]{\rule[#1]{\hsize}{#2}}\hfill%
% #5%
% \makebox[0pt][r]{\rule[#3]{\hsize}{#4}}%
% \par}
\def\SS@rlkomapartchaprule#1#2#3#4#5{%
  \SS@oclto{1}{SS@rlkomapartchaprule}%
  \ifSS@starform
    \SS@rlsectionrule{#1}{#2}{#3}{#4}{#5}%
  \else
    \SSifnumberpart
      {\noindent\makebox[0pt][l]{\rule[#1]{\hsize}{#2}}\hfill#5}%
      {#5\makebox[0pt][r]{\rule[#3]{\hsize}{#4}}}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%\end{macro}
% 
% \subsection{The new author commands}
%
% The extra commands are below.  Note that the |\SSsectlevel| is 
% defined to be 0 in part headings, 1 in chapter headings, 2 in section 
% headings, and so on.  You might find this useful if you want to play 
% interesting games. \comname{minisec} is a KOMA-script sectioning 
% command which is one level lower than \comname{subparagraph}.
%
%    \begin{macrocode}
\newcommand*{\partfont}          [1]
   {\gdef\SS@partnumberfont{\SS@sectid{0}\SS@nopart\SS@makeulinepartchap#1}
    \gdef\SS@parttitlefont{\SS@sectid{0}\SS@titlepart\SS@makeulinepartchap#1}}
\newcommand*{\partnumberfont}    [1]
   {\gdef\SS@partnumberfont{\SS@sectid{0}\SS@nopart\SS@makeulinepartchap#1}}
\newcommand*{\parttitlefont}     [1]
   {\gdef\SS@parttitlefont{\SS@sectid{0}\SS@titlepart\SS@makeulinepartchap#1}}
\newcommand*{\chapterfont}       [1]
   {\gdef\SS@chapnumfont{\SS@sectid{1}\SS@nopart\SS@makeulinepartchap#1}
    \gdef\SS@chaptitlefont{\SS@sectid{1}\SS@titlepart\SS@makeulinepartchap#1}}
\newcommand*{\chapternumberfont} [1]
   {\gdef\SS@chapnumfont{\SS@sectid{1}\SS@nopart\SS@makeulinepartchap#1}}
\newcommand*{\chaptertitlefont}  [1]
   {\gdef\SS@chaptitlefont{\SS@sectid{1}\SS@titlepart\SS@makeulinepartchap#1}}
\newcommand*{\sectionfont}       [1]
   {\gdef\SS@sectfont{\SS@sectid{2}\SS@rr\SS@makeulinesect#1}}
\newcommand*{\subsectionfont}    [1]
   {\gdef\SS@subsectfont{\SS@sectid{3}\SS@rr\SS@makeulinesect#1}}
\newcommand*{\subsubsectionfont} [1]
   {\gdef\SS@subsubsectfont{\SS@sectid{4}\SS@rr\SS@makeulinesect#1}}
\newcommand*{\paragraphfont}     [1]
   {\gdef\SS@parafont{\SS@sectid{5}\SS@rr\SS@makeulinesect#1}}
\newcommand*{\subparagraphfont}  [1]
   {\gdef\SS@subparafont{\SS@sectid{6}\SS@rr\SS@makeulinesect#1}}
\newcommand*{\minisecfont}  [1]
   {\gdef\SS@minisecfont{\SS@sectid{7}\SS@rr\SS@makeulinepartchap#1}}
% 
\newcommand*{\allsectionsfont}   [1] {\partfont{#1}
                                      \chapterfont{#1}
                                      \sectionfont{#1}
                                      \subsectionfont{#1}
                                      \subsubsectionfont{#1}
                                      \paragraphfont{#1}
                                      \subparagraphfont{#1}
                                      \minisecfont{#1}}
% 
\allsectionsfont{\relax}
%    \end{macrocode}
% 
% \subsection{The re-defined sectioning commands}
%
% For obscure reasons, this is where I test to see if 
% \packname{sectsty} is being used with a class it'll work with. This 
% test isn't infallible, but it does let you know if \packname{sectsty} 
% will do nothing at all.
%
%    \begin{macrocode}
\@tempswafalse
%
\@ifclassloaded{article} {\@tempswatrue\SS@oclto{1}{article detected}} {}
\@ifclassloaded{report}  {\@tempswatrue\SS@oclto{1}{report  detected}} {}
\@ifclassloaded{book}    {\@tempswatrue\SS@oclto{1}{book    detected}} {}
\@ifclassloaded{letter}  {}                                            {}
\@ifclassloaded{slides}  {}                                            {}
%
\@ifclassloaded{scrartcl}{\@tempswatrue\SS@oclto{1}{scrartcl detected}} {}
\@ifclassloaded{scrreprt}{\@tempswatrue\SS@oclto{1}{scrreprt detected}} {}
\@ifclassloaded{scrbook} {\@tempswatrue\SS@oclto{1}{scrbook  detected}} {}
% \@ifclassloaded{handout} {} {}

\if@tempswa\else
    \PackageError{sectsty}%
    {The sectsty package doesn't work with\MessageBreak
    this document class}%
    {The sectsty package only works with the following classes:
    \MessageBreak
    the standard LaTeX document classes\MessageBreak
    article, report, and book; and\MessageBreak
    the KOMA-Script classes\MessageBreak
    scrartcl, scrbook, and scrreprt.}
\fi
%    \end{macrocode}
%
% \subsubsection{Section code for article, book, and report classes}
%
%    \begin{macrocode}
\@tempswafalse
%
\@ifclassloaded{article} {\@tempswatrue\SS@oclto{1}{article detected}} {}
\@ifclassloaded{report}  {\@tempswatrue\SS@oclto{1}{report  detected}} {}
\@ifclassloaded{book}    {\@tempswatrue\SS@oclto{1}{book    detected}} {}
\@ifclassloaded{letter}  {}              {}
\@ifclassloaded{slides}  {}              {}
%
\@ifclassloaded{scrartcl}{} {}
\@ifclassloaded{scrreprt}{} {}
\@ifclassloaded{scrbook} {} {}
% \@ifclassloaded{handout} {} {}
%    \end{macrocode}
%
% Code from |article.cls| and |report.cls| June 1996; same as book code.  
% Execute this only if the book, report, or article classes have been 
% loaded.
%    \begin{macrocode}
\if@tempswa
\SS@oclto{1}{section->subparagraph modifications for article, report, 
and book classes}%
\renewcommand\section{\@startsection {section}{1}{\z@}%
      {-3.5ex \@plus -1ex \@minus -.2ex}%
      {2.3ex \@plus.2ex}%
%     {\normalfont\Large\bfseries}}
      {\normalfont\Large\bfseries\SS@sectfont}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
      {-3.25ex\@plus -1ex \@minus -.2ex}%
      {1.5ex \@plus .2ex}%
%     {\normalfont\large\bfseries}}
      {\normalfont\large\bfseries\SS@subsectfont}}
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
      {-3.25ex\@plus -1ex \@minus -.2ex}%
      {1.5ex \@plus .2ex}%
%     {\normalfont\normalsize\bfseries}}
      {\normalfont\normalsize\bfseries\SS@subsubsectfont}}
\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
      {3.25ex \@plus1ex \@minus.2ex}%
      {-1em}%
%     {\normalfont\normalsize\bfseries}}
      {\normalfont\normalsize\bfseries\SS@parafont}}
\renewcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
      {3.25ex \@plus1ex \@minus .2ex}%
      {-1em}%
%     {\normalfont\normalsize\bfseries}}
      {\normalfont\normalsize\bfseries\SS@subparafont}}
\fi
%    \end{macrocode}
%
% End re-defining section|->|subparagraph commands for article, 
% report, and book classes
%
% \subsubsection{Section code for scrartcl, scrbook, and scrreprt classes}
%
%    \begin{macrocode}
\@tempswafalse
%
\@ifclassloaded{article} {} {}
\@ifclassloaded{report}  {} {}
\@ifclassloaded{book}    {} {}
\@ifclassloaded{letter}  {}              {}
\@ifclassloaded{slides}  {}              {}
%
\@ifclassloaded{scrartcl}{\@tempswatrue\SS@oclto{1}{scrartcl detected}} {}
\@ifclassloaded{scrreprt}{\@tempswatrue\SS@oclto{1}{scrreprt detected}} {}
\@ifclassloaded{scrbook} {\@tempswatrue\SS@oclto{1}{scrbook  detected}} {}
% \@ifclassloaded{handout} {} {}
%    \end{macrocode}
% 
% Code from |scrclass.dtx| 1998/07/17 v2.5e. Execute this only if the 
% scrartcl, scrreprt, or scrbook classes have been loaded.
%
%    \begin{macrocode}
\if@tempswa
\SS@oclto{1}{section->minisec modifications for scrartcl, scrreprt, 
and scrbook classes}%
\renewcommand\section{\@startsection{section}{1}{\z@}%
  {-3.5ex \@plus -1ex \@minus -.2ex}%
  {2.3ex \@plus.2ex}%
  {\raggedsection\normalfont\size@section\sectfont\SS@sectfont}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
  {-3.25ex\@plus -1ex \@minus -.2ex}%
  {1.5ex \@plus .2ex}%
  {\raggedsection\normalfont\size@subsection\sectfont\SS@subsectfont}}
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
  {-3.25ex\@plus -1ex \@minus -.2ex}%
  {1.5ex \@plus .2ex}%
  {\raggedsection\normalfont\size@subsubsection\sectfont\SS@subsubsectfont}}
\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
  {3.25ex \@plus1ex \@minus.2ex}%
  {-1em}%
  {\raggedsection\normalfont\size@paragraph\sectfont\SS@parafont}}
\renewcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
  {3.25ex \@plus1ex \@minus .2ex}%
  {-1em}%
  {\raggedsection\normalfont\size@subparagraph\sectfont\SS@subparafont}}
\renewcommand\minisec[1]{\@afterindentfalse \vskip 1.5ex
  {\parindent \z@ \raggedsection\sectfont\SS@minisecfont {#1}\par\nobreak}%
  \@afterheading}%
  \fi
%    \end{macrocode}
%
% \subsection{Re-defined chapter code}
%
% \subsubsection{Chapter command for report class}
%
%% Code from |report.cls| June 1996
%    \begin{macrocode}
\@ifclassloaded{report}{%
\SS@oclto{1}{chapter modifications for report class}%
\def\@makechapterhead#1{%
  \vspace*{50\p@}%
  {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
        \huge\bfseries\SS@chapnumfont{\@chapapp\space \thechapter}%
        \par\nobreak
        \vskip 20\p@
    \fi
    \interlinepenalty\@M
    \raggedright \normalfont
    \Huge \bfseries \SS@chaptitlefont {#1}\par\nobreak
    \vskip 40\p@
  }}
\def\@makeschapterhead#1{%
  \vspace*{50\p@}%
  {\parindent \z@ \raggedright
    \normalfont
    \interlinepenalty\@M
    \Huge \bfseries \SS@chaptitlefont {#1}\par\nobreak
    \vskip 40\p@
  }}%
}{}
%    \end{macrocode}
%
%% End code re-defining chapter stuff for report class
%
% \subsubsection{Chapter command for book class}
%
%% Chapter code from |book.cls| 1997/10/10 v1.3x
%
%    \begin{macrocode}
\@ifclassloaded{book}{%
\SS@oclto{1}{chapter modifications for book class}%
\def\@makechapterhead#1{%
  \vspace*{50\p@}%
  {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \huge\bfseries\SS@chapnumfont {\@chapapp\space \thechapter}%
        \par\nobreak
        \vskip 20\p@
      \fi
    \fi
    \interlinepenalty\@M
    \raggedright \normalfont
    \Huge \bfseries \SS@chaptitlefont {#1}\par\nobreak
    \vskip 40\p@
  }}
\def\@makeschapterhead#1{%
  \vspace*{50\p@}%
  {\parindent \z@ \raggedright
    \normalfont
    \interlinepenalty\@M
    \Huge \bfseries \SS@chaptitlefont  {#1}\par\nobreak
    \vskip 40\p@
  }}%
}{}
%    \end{macrocode}
%
%% End code redefining chapter stuff from book.cls
% 
% \subsubsection{Chapter command for scrreprt class}
% 
% Code from \filename{scrreprt.cls} 1998/07/17 v2.5e.
% 
%% Begin code redefining chapter stuff from scrreprt.cls
%
%    \begin{macrocode}
\@ifclassloaded{scrreprt}{%
\SS@oclto{1}{chapter modifications for scrreprt class}%
\def\@makechapterhead#1{\chapterheadstartvskip%
  {\size@chapter{\sectfont\SS@chapnumfont
    \@hangfrom{\ifnum \c@secnumdepth >\m@ne%
               \chapterformat\fi}%
      {\raggedsection \interlinepenalty \@M \SS@chaptitlefont {#1}\par}}%
    \nobreak\chapterheadendvskip
  }}
\def\@makeschapterhead#1{\chapterheadstartvskip%
  {\parindent \z@ \raggedsection
    \normalfont
    \size@chapter\sectfont\SS@chaptitlefont {#1}\par
    \nobreak\chapterheadendvskip
  }}
}{}
%    \end{macrocode}
% 
%% End code redefining chapter stuff from scrreprt.cls
% 
% \subsubsection{Chapter command for scrbook class}
% 
% Code from \filename{scrbook.cls} 1998/07/17 v2.5e.
% 
%% Begin code redefining chapter stuff from scrbook.cls
%
%    \begin{macrocode}
\@ifclassloaded{scrbook}{%
\SS@oclto{1}{chapter modifications for scrbook class}%
\def\@makechapterhead#1{\chapterheadstartvskip%
  {\size@chapter{\sectfont\SS@chapnumfont
    \@hangfrom{\ifnum \c@secnumdepth >\m@ne%
                 \if@mainmatter \chapterformat\fi\fi}%
       {\raggedsection \interlinepenalty \@M \SS@chaptitlefont {#1}\par}}%
    \nobreak\chapterheadendvskip
  }}
\def\@makeschapterhead#1{\chapterheadstartvskip%
  {\parindent \z@ \raggedsection
    \normalfont
    \size@chapter\sectfont\SS@chaptitlefont {#1}\par
    \nobreak\chapterheadendvskip
  }}%
  }{}
  %    \end{macrocode}
% 
%% End code redefining chapter stuff from scrbook.cls
% 
% \subsection{Re-defined part code}
%
% \subsubsection{Part command for book class}
%
%% Part code from book.cls 1997/10/10 v1.3x
%\begin{macro}{\part}
%
% This code adds the |\SS@...font| hooks; there used to be some other 
% additions but there aren't any more because they were silly.
%
% \begin{macrocode}
\@ifclassloaded{book}{%
\SS@oclto{1}{part modifications for book class}%
\def\@part[#1]#2{%
    \ifnum \c@secnumdepth >-2\relax
      \refstepcounter{part}%
      \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
    \else
      \addcontentsline{toc}{part}{#1}%
    \fi
    \markboth{}{}%
    {\centering
     \interlinepenalty \@M
     \normalfont
     \ifnum \c@secnumdepth >-2\relax
       \huge\bfseries\SS@partnumberfont {\partname~\thepart}%
       \par
       \vskip 20\p@
     \fi
     \centering \normalfont
     \Huge \bfseries \SS@parttitlefont {#2}\par}%
    \@endpart}
\def\@spart#1{%
    {\centering
     \interlinepenalty \@M
     \normalfont \Huge \bfseries \SS@parttitlefont {#1}\par}%
    \@endpart}
}{}
%    \end{macrocode}
%
%% End code redefining part stuff from |book.cls|
%
% \subsubsection{Part command for article class}
%
%% Part code from |article.cls| 1997/10/10 v1.3x
%
%    \begin{macrocode}
\@ifclassloaded{article}{%
\SS@oclto{1}{part modifications for article class}%
\def\@part[#1]#2{%
    \ifnum \c@secnumdepth >\m@ne
      \refstepcounter{part}%
      \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
    \else
      \addcontentsline{toc}{part}{#1}%
    \fi
    {\parindent \z@ \raggedright
     \interlinepenalty \@M
     \normalfont
     \ifnum \c@secnumdepth >\m@ne
       \Large\bfseries\SS@partnumberfont {\partname~\thepart}%
       \par\nobreak
     \fi
     \raggedright \normalfont
     \huge \bfseries \SS@parttitlefont {#2}%
     \markboth{}{}\par}%
    \nobreak
    \vskip 3ex
    \@afterheading}
\def\@spart#1{%
    {\parindent \z@ \raggedright
     \interlinepenalty \@M
     \normalfont
     \huge \bfseries \SS@parttitlefont {#1}\par}%
     \nobreak
     \vskip 3ex
     \@afterheading}
}{}
%    \end{macrocode}
%
%% End code redefining part stuff from |article.cls|
%
% \subsubsection{Part command for report class}
%
%% Part code from |report.cls| 1997/10/10 v1.3x
%
%    \begin{macrocode}
\@ifclassloaded{report}{%
\SS@oclto{1}{part modifications for report class}%
\def\@part[#1]#2{%
    \ifnum \c@secnumdepth >-2\relax
      \refstepcounter{part}%
      \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
    \else
      \addcontentsline{toc}{part}{#1}%
    \fi
    \markboth{}{}%
    {\centering
     \interlinepenalty \@M
     \normalfont
     \ifnum \c@secnumdepth >-2\relax
       \huge\bfseries\SS@partnumberfont {\partname~\thepart}%
       \par
       \vskip 20\p@
     \fi
     \centering \normalfont
     \Huge \bfseries \SS@parttitlefont {#2}\par}%
    \@endpart}
\def\@spart#1{%
    {\centering
     \interlinepenalty \@M
     \normalfont
     \Huge \bfseries \SS@parttitlefont {#1}\par}%
    \@endpart}
}{}
%    \end{macrocode}
%
%% End code redefining part stuff from report.cls
%
% \subsubsection{Part command for scrbook and scrreprt classes}
%    \begin{macrocode}
\@tempswafalse
%
\@ifclassloaded{scrreprt}{\@tempswatrue}{}
\@ifclassloaded{scrbook} {\@tempswatrue}{}
%
%% Part code from |scrbook.cls| 1998/07/17 v2.5e
\if@tempswa%
\SS@oclto{1}{part modifications for scrreprt and scrbook classes}%
\def\@part[#1]#2{%
    \ifnum \c@secnumdepth >-2\relax
      \refstepcounter{part}\@maybeasf%
      \addcontentsline{toc}{part}{\protect\numberline{\thepart}#1}%
    \else
      \addcontentsline{toc}{part}{#1}%
    \fi
    \chaptermark{}
    {\centering
     \interlinepenalty \@M
     \normalfont
     \ifnum \c@secnumdepth >-2\relax
       \size@partnumber\sectfont\SS@partnumberfont\partformat
       \par
       \vskip 20\p@
     \fi
     \size@part\sectfont\SS@parttitlefont {#2}\par}%
    \@endpart}
\def\@spart#1{%
    {\centering
     \interlinepenalty \@M
     \normalfont
     \size@part\sectfont\SS@parttitlefont {#1}\chaptermark{}\par}%
    \@endpart}%
    \fi
%    \end{macrocode}
%% End part code from |scrbook.cls| 1998/07/17 v2.5e
%
% \subsubsection{Part command for the scrartcl classes}
%
%% Part code from |scrartcl.cls| 1998/07/17 v2.5e
%    \begin{macrocode}
\@ifclassloaded{scrartcl}{%
\SS@oclto{1}{part modifications for scrartcl classes}%
\def\@part[#1]#2{%
    \ifnum \c@secnumdepth >\m@ne
      \refstepcounter{part}\@maybeasf%
       \addcontentsline{toc}{part}{\protect\numberline{\thepart}#1}%
    \else
      \addcontentsline{toc}{part}{#1}%
    \fi
    {\parindent \z@ \raggedright
     \interlinepenalty \@M
     \normalfont
     \ifnum \c@secnumdepth >\m@ne
       \size@partnumber\sectfont\SS@partnumberfont\partformat
       \par\nobreak
     \fi
     \size@part\sectfont\SS@parttitlefont {#2}%
     \sectionmark{}\par}%
     \nobreak
     \vskip 3ex
    \@afterheading}
\def\@spart#1{%
    {\parindent \z@ \raggedright
     \interlinepenalty \@M
     \normalfont
     \size@part\sectfont\SS@parttitlefont {#1}\sectionmark{}\par}%
     \nobreak
     \vskip 3ex
    \@afterheading}%
    }{}
%    \end{macrocode}
% 
%\end{macro}
% The end
%    \begin{macrocode}
\endinput
%    \end{macrocode}
%
% \Finale
%\iffalse
%<*package>
%% 
%% End of file `sectsty.dtx'.
%% \fi