% $Id: tdsguide.cls,v 1.19 2004/03/28 14:21:10 karl Exp $
% LaTeX document class tdsguide
% (history at end)
%
% This class provides markup & layout for the TDS report.
%
\NeedsTeXFormat{LaTeX2e}[1994/12/01] % star-form of \CheckCommand, etc.
% The code below is explained in the implementation documentation of the
% rcs package.
\begingroup
\def\RCSClass#1#2 $#3: #4 #5\endRCS $#6: #7 #8\endRCS{%
\def\date{#4}\def\id{v#7}%
\ProvidesClass{#1}[\date\space\id\space #2]%
}
\RCSClass{tdsguide}{markup and layout for TDS document}
$Date: 2004/03/28 14:21:10 $: 9999/00/00 \endRCS
$Revision: 1.19 $: 0.0 \endRCS
\endgroup
% default setup
\ifx \CatEscape\undefined
\chardef\CatEscape=0
\chardef\CatOpen=1
\chardef\CatClose=2
\chardef\CatIgnore=9
\chardef\CatLetter=11
\chardef\CatOther=12
\chardef\CatActive=13
\chardef\CatUsCode=\catcode`\_
\fi
%%% ======================================================================
%
% OPTIONS
%
\catcode`\_=\CatLetter
% We can select to use Roman for METAFONT/METAPOST logos by the
% nomflogo option. That should be done if no current logo fonts (with
% `P' & `S') are available. Of course, it would be best to install
% current fonts.
% The mflogo options is provided for upward compatibility.
\let\tds_mflogo\relax
\DeclareOption{nomflogo}{%
\def\tds_mflogo{\let\textlogo\tds@transfer@logo} % gimme refinements! :(
}
\DeclareOption{mflogo}{}
\newif\ifTdsDraft
\TdsDraftfalse
\DeclareOption{draft}{%
\TdsDrafttrue
\PassOptionsToClass{\CurrentOption}{article}%
}
\DeclareOption{final}{%
\TdsDraftfalse
\PassOptionsToClass{\CurrentOption}{article}%
}
\catcode`\_=\CatUsCode
%%% ------------------------------------------------------------
%
% CONFIGURATION, INHERITANCE, AND OTHER MODULES
%
% configure this class
\InputIfFileExists{tdsguide.cfg}{%
\typeout{*************************************^^J%
*^^J%
* Local config file tdsguide.cfg used^^J%
*^^J%
*************************************%
}%
}{}
% inherit article class
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions
\LoadClass{article}
% add more modules
\RequirePackage{url} % file names & email addresses
\RequirePackage{mflogo} % MF & MP logos (but see below)
%\RequirePackage{hyperref} % navigation specials in .dvi
\RequirePackage{fancyhdr} % rev. no & draft notice in headers
% Put hypertext links in the DVI file on the URL's:
% \def\UrlLeft#1\UrlRight{\special{html:}#1\special{html:}}
% Don't do this because xdvi doesn't know what do with ftp url's, which
% is the vast majority of links; also because we use the url package for
% mere directory names.
%%% ============================================================
%
% NEW MARKUP
%
\catcode`\_=\CatLetter
% info about original SGML files
\def\sourcefile#1{}
\def\formatterfile#1{}
% revision number (should use rcs package)
\newtoks\tdsVersion
%
% RENDER DOCUMENT-SPECIFIC MARKUP
%
% categories for terms
% typewriter type.
% `_', `\_', and `\\' produce respective chars.
\def\tds_tt{%
\begingroup
\catcode`\_=\CatOther
\chardef\_=`\_
\chardef\\=`\\
\tds_tt_set
}
\def\tds_tt_set#1{%
\ttfamily
#1%
\endgroup
}
\def\systemitem#1{\tds_tt}
\def\replaceable#1{{\rmfamily $\langle$\textit{#1}$\rangle$}}
\let\command=\tds_tt
\def\application#1{\textrm{#1}}
\let\literal=\tds_tt
\let\email=\url
% \abbr may be called with lowercase & uppercase letters, actually all
% abbreviations are to be typeset with reduced-size uppercase letters.
% (That lowercase letters are used as arguments was a half-hearted
% attempt by Norm who did use small caps at this time.) `Reduced size'
% means one point smaller than the current size. If the reduced size
% is larger than 12pt, we issue a warning; if no font-generating
% driver is used, this situation will lead to character replacements
% most probably.
%
% This macro may be written to an auxilliary file, we must not use
% underscores in its name.
\DeclareRobustCommand\tds@reduced@size{%
\dimen@\f@size\p@
\advance \dimen@ -\p@ % dimen@ = font_size - 1
\ifdim \dimen@ >12\p@
\@font@warning{%
Using font size `\the\dimen@' for abbreviations. That might lead%
\MessageBreak
to character replacements if you don't use a driver that\MessageBreak
generates fonts.}%
\fi
\math@fontsfalse
\fontsize{\the\dimen@}\z@
\selectfont
}
\def\abbr#1{{\tds@reduced@size \uppercase{#1}}}
% references
\let\xref\relax
\let\citetitle=\textit
% aliases for LaTeX markup
\let\emphasis=\emph
% environment `legalnotice', part of front matter
\let\legalnotice=\par
\let\endlegalnotice=\par
% environment `ttdisplay', used to explicate some fact. Basically,
% it's the alltt environment without parskip and with an additional
% level of indentation.
\def\ttdisplay{%
\begingroup
\list{}{%
\parsep\z@skip % no skip before env
\parskip\z@skip
\relax
}%
\item\relax
\parshape\z@
%% code below is copied from alltt.dtx.
\leftskip\@totalleftmargin
\@tempswafalse
\def\par{%
\if@tempswa
\leavevmode\null\@@par\penalty\interlinepenalty
\else
\@tempswatrue
\ifhmode
\@@par
\penalty\interlinepenalty
\fi
\fi
}%
\obeylines
\verbatim@font
\let\org@prime~%
\@noligs
\everymath \expandafter{\the\everymath \let~\org@prime}%
\everydisplay \expandafter{\the\everydisplay \let~\org@prime}%
\let\org@dospecials\dospecials
\g@remfrom@specials{\\}%
\g@remfrom@specials{\{}%
\g@remfrom@specials{\}}%
\let\do\@makeother \dospecials
\let\dospecials\org@dospecials
\frenchspacing\@vobeyspaces
\everypar \expandafter{\the\everypar \unpenalty}%
%}
}
\def\endttdisplay{%
\endlist
\endgroup
\vskip -\parskip % undo skip after env
}
% Code below is from alltt.dtx. I don't understand why it's not part
% of the LaTeX kernel.
\def\g@remfrom@specials#1{%
\def\@new@specials{}%
\def\@remove##1{%
\ifx ##1#1%
\else
\g@addto@macro\@new@specials{\do ##1}%
\fi
}%
\let\do\@remove \dospecials
\let\dospecials\@new@specials
}
%%% ------------------------------------------------------------
%
% LOGOS
%
% Some of them are rather document-specific.
\def\texmf{\path|texmf|}
\def\CTAN:{\replaceable{\abbr{CTAN}:}}
% Actually, I should use my logos package for the rest... [-js]
% The AmS definition is from AmS-LaTeX, that's more stable in this
% document's context than the one from AmS-TeX.
\def\AmS{%
\begingroup
\protect\usefont{OMS}{cmsy}{m}{n}%
A\kern-.1667em \lower.5ex\hbox{M}\kern-.125em S%
\endgroup
}
\def\AMSTeX{\AmS-\TeX}
\def\iniTeX{\texttt{INITEX}\@}
\def\iniMF{\texttt{INIMF}\@}
\def\iniMP{\texttt{INIMP}\@}
\def\PS{\textsc{PostScript}}
% If we don't use logo fonts, both the Metafont and the MetaPost logo
% is typeset in the current font, as shown in this comment. The macros
% `\MF' & `\MP' expand to two \textfont macros, with uppercase
% syllables as arguments. We check for the syllable `FONT', this has
% to be typeset in lowercase. All other syllables are capitalized.
\def\tds_logo_fontarg{FONT}
\DeclareRobustCommand\tds@transfer@logo[1]{%
\def\tds_arg{#1}%
\ifx \tds_arg\tds_logo_fontarg
font%
\else
\tds_capitalize#1\tds_argend
\fi
}
\def\tds_capitalize#1#2\tds_argend{%
\uppercase{#1}\lowercase{#2}%
}
\tds_mflogo
% Use a small caps fake for BibTeX's `ib'. This way we can typeset it
% in bold face or sans-serif, too. The code is copied from the LaTeX
% logo definition, from ltlogos.dtx.
\DeclareRobustCommand\tds@smsize{%
$\m@th$% % force math size calculation
\csname S@\f@size\endcsname
\fontsize\sf@size\z@
\math@fontsfalse \selectfont
}
\def\BibTeX{B\kern-.05em{\tds@smsize IB}\kern-.08em\TeX}
%%% ============================================================
%
% TDS SUMMARIES
%
% Typeset a figure that shows the TeX directory layout. The layout is
% input with optical markup:
%
% \begin{tdsSummary}
% dir/ explanation of dir
% . subdir/ explanation of subdir
% . . subsubdir/ next subdir level
% . dir/dir/ more than one dir in one line
% . / explanation of category
% \end{tdsSummary}
%
% Directories and category names don't have dots.
% We transform that input into a table. The first table column (the
% directory spec) is terminated by a slash that's followed by white
% space. Directory names are typeset in monocase. are
% tagged with \replaceable. Subdirectory levels are indented by one
% quad. A quad is placed between columns. The explanation text
% is typeset in one line.
% As this is a special implementation for a special document, these
% design decisions are hardwired, no protected interface is available.
% Design changes will be realized by changes to the macro code.
% The environment is realized as a trivlist to behave correctly in list
% environments. I don't use a tabular environment, since I don't know
% exactly how the first column is tokenized. Instead a halign is used.
% IMO it does not matter, as tdsSummary does not use table markup
% anyhow. If somebody wants to use longer explanations and if they must
% be broken then, I have to use one of the tabulars of the tools bundle.
% The first column (the directory names) is typeset in typewriter type. The
% font chosen hereby must have the underscore at its ASCII position. If
% that is not the case, one has to generalize \tds_dir_tags below.
% Namely, this macro sets up the special lexical convention for this
% column. As TeX will look at the first token of the column to check for
% the table end, \cr, or \omit before \tds_dir_tags is evaluated, the
% redefinition of the lexical analysis will not have happened for that
% token. So we have to check this token specially if it's one of the
% special optical markup chars.
% After we started the trivlist, we need to supply the item (as this
% macro really adds the vertical space). But it does not actually
% start an item, it sets up the everypar register to do so. We fake
% the item start as we don't want to go in horizontal mode, \halign
% needs to be evaluated in vertical mode.
%
% \par is not evaluated by \endtrivlist and \end, so we don't need
% another group around its redefinition.
\def\tdsSummary{%
\trivlist \item\relax
\vskip\parskip
\global\@inlabelfalse \global\@newlistfalse \global\everypar{}%
\tabskip 0pt
\let\par\crcr \obeylines % can't use \obeycr, redefined by LaTeX
% redefine \obeylines to do nothing; url.sty v3.0 calls it, and the
% ^^M character therein causes a `Missing \endgroup inserted' error
% at a \path|...| within a tdsSummary, if it's already defined as \par.
\let\obeylines=\relax
\halign\bgroup
\ttfamily \tds_dir_tags \tds_first_token ##\unskip\hfil &%
\quad ##\unskip\hfil \cr
}
\def\endtdsSummary{%
\crcr
\egroup
\endtrivlist
}
% Our special lexical conventions are: `.' denotes the next directory
% level, `<...>' denotes a directory category, and `/' is a column
% separator if it is followed by space or tab, a typeset slash
% otherwise. Underscores don't have any special meaning.
\begingroup
\catcode`\.=\CatActive
\catcode`\<=\CatActive
\catcode`\/=\CatActive
\catcode`\:=\CatActive
\gdef\tds_dir_tags{%
\catcode`\.=\CatActive \let.=\tds_next_dir_level
\catcode`\<=\CatActive \let<=\tds_dir_category
\catcode`\/=\CatActive \let/=\tds_slash
\catcode`\:=\CatActive \let:=\tds_colon
\catcode`\_=\CatOther
\tt
}
\endgroup
% There are spaces between the dots, ignore them.
\def\tds_next_dir_level{\quad \ignorespaces}
\def\tds_dir_category#1>{\replaceable{#1}}
\chardef\tds_dir_sep=`\/ % typeset a directory separator
% The slash has to check the stuff behind. If it's a space or a tab,
% \next is bound to the action `blank-space' (the binding of all
% '(space . #\Space) tokens). A tab is usually tokenized to the same
% token, but we care for redefinitions below.
%
\def\tds_slash{%
\futurelet\next \tds_check_dir_end
}
% For colons in the examples.
%
\def\tds_colon{:&}
% We need two control sequencess that are bound to the actions currently
% bound to '(space . #\Space) and (tex:parse "\t"). A direct \let
% evaluation is difficult as the lexical analysis collapses subsequent
% spaces to one token. But we need one space token behind the equal
% sign, to be able to \let our cseq to the next space token. The first
% token is stored in the replacement list of a macro, the second token
% comes as its argument.
\def\tds_let#1#2{\let#1= #2}
\tds_let\tds_space{ }
\tds_let\tds_tab{^^I}
\def\TdsColSep{/&} % use trailing slashes for dir names
\def\tds_check_dir_end{%
\ifx \next\tds_space
\let\next\TdsColSep
\else
\ifx \next\tds_tab
\let\next\TdsColSep
\else
\let\next\tds_dir_sep
\fi
\fi
\next
}
% We're almost finished with the tdsSummary setup. The stuff above is
% not used for the first column token, as it's already tokenized when
% the catcode changes take effect. So let's check and remap this token
% by hand. Actually, I'm sloppy here; I assume that `/' won't be a
% used as a directory name and that no directory name starts with an
% underscore. But then, I know that this won't happen in TDS... :-)
\def\tds_first_token{%
\futurelet\next \tds_check_special
}
\def\tds_check_special{%
\ifx \next.%
\def\next{\afterassignment\tds_next_dir_level \let\next}%
\else
\ifx \next<%
\def\next{\afterassignment\tds_dir_category \let\next}%
\else
\let\next\relax
\fi
\fi
\next
}
%%% ============================================================
%
% LAYOUT
%
% text area size
% We use the same height as article's default, but increase the width.
\textwidth=35pc
\oddsidemargin = \paperwidth
\advance\oddsidemargin by -\textwidth
\divide\oddsidemargin by 2
\evensidemargin = \oddsidemargin
\hoffset = -1in
% spacing
\parindent=0pt % no paragraph indentation
\emergencystretch=2em % fewer overfull hboxes, only a memo
\parskip=1ex plus 1ex minus .5ex % between paragraphs; if you change it,
% change the spacing in section headers
% below, too!
% Our spacing for lists is very simplistic, but uniform: We use (almost)
% parskip everywhere, and don't distinguish vertical spacing for
% different list levels. Actually, the latter is the thing we might want
% to introduce later again.
\labelsep=1.1em % increase distance between item & text
\topsep=0pt % no extra skip above list in paragraph
\partopsep=0pt % no extra skip above list starting par.
\itemsep=0pt % no extra space between items
\parsep=.9\parskip % between paragraphs in items
\def\@listI{%
\leftmargin\leftmargini
}
\let\@listi\@listI
\@listi
\def\@listii{%
\leftmargin\leftmarginii
\labelwidth\leftmarginii \advance \labelwidth-\labelsep
}
\def\@listiii{%
\leftmargin\leftmarginiii
\labelwidth\leftmarginiii \advance \labelwidth-\labelsep
}
% Like itemize, but squeeze the items.
\newenvironment{itemize-squeeze}
{%
\parsep\z@skip
\itemize
}{%
\enditemize
}
% Ditto, for description.
\newenvironment{description-squeeze}
{%
\parsep\z@skip
\description
}{%
\enddescription
}
% Redefine section headers, different spacing and other fonts.
\newskip\TdsPreSubSectionSkip
\TdsPreSubSectionSkip = 2.5ex plus 0.5ex minus 0.2ex
\def\section{%
\@startsection{section}{1}% % name and level
{\z@}% % indentation
{-3ex plus-.75ex minus-.2ex}% % skip above and don't indent next par
{1.5ex plus.2ex}% % skip below
{\reset@font \Large \sffamily}% % type
}
\def\subsection{%
\@startsection{subsection}{2}% % name and level
{\z@}% % indentation
{-\TdsPreSubSectionSkip}% % skip above and don't indent next par
\parskip % skip below
{\reset@font \large \sffamily}% % type
}
\def\subsubsection{%
\@startsection{subsubsection}{3}% % name and level
{\z@}% % indentation
{-\TdsPreSubSectionSkip}% % skip above and don't indent next par
\parskip % skip below
{\reset@font \normalsize \sffamily}% % type
}
\def\paragraph{%
\@startsection{paragraph}{4}% % name and level
{\z@}% % indentation
\TdsPreSubSectionSkip % skip above and indent next par
{-1.5em}% % skip after, run in text
{\reset@font \normalsize \scshape}% % type
}
% Table of contents
\setcounter{tocdepth}{2} % only sections on first two levels
% Less space between TOC entries, discard the parskip. For that, we
% have to redefine \@starttoc, since no hook is available.
\let\tds_orig_starttoc=\@starttoc
\def\@starttoc#1{%
\begingroup
\parskip\z@skip
\tds_orig_starttoc{#1}%
\endgroup
}
% Section TOC entries in sans serif, and less space above. The code
% below is copied from the article view on classes.dtx, I have changed
% space and font. But let's first assure that we shouldn't use a newer
% version of this code.
\CheckCommand*\l@section[2]{%
\ifnum \c@tocdepth >\z@
\addpenalty\@secpenalty
\addvspace{1.0em \@plus\p@}%
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \bfseries
\advance\leftskip\@tempdima
\hskip -\leftskip
#1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
\endgroup
\fi}
\def\l@section#1#2{%
\ifnum \c@tocdepth >\z@
\addpenalty\@secpenalty
\addvspace{.75ex \@plus\p@ \@minus\p@}% % was: 1em plus 1pt
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@
\rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \sffamily % was: \bfseries
\advance\leftskip\@tempdima
\hskip -\leftskip
#1\nobreak \hfil \nobreak \hbox to\@pnumwidth{\hss #2}%
\par
\endgroup
\fi}
% Not so spacey a title, please.
\def\@maketitle{%
\null
\kern-90pt \relax \kern0pt
\begin{center}%
{\LARGE \@title \par}%
%\vskip 1.5em%
{\large
\lineskip .5em%
\begin{tabular}[t]{c}%
\@author
\end{tabular}\par}%
\vskip 1em%
{\large version \the\tdsVersion \quad \@date}%
\end{center}%
\par
\vskip 1.5em}
% Make labels in the description environment come out in the
% requested type rather than bold.
\def\descriptionlabel#1{\hspace\labelsep #1}
% Headline & footline
\pagestyle{fancy}
\lhead{}
\chead{%
\ifTdsDraft draft \fi % <-- space!
TDS version \the\tdsVersion
}
\rhead{}
\renewcommand{\headrulewidth}{0.4pt}
\lfoot{}
\cfoot{\thepage}
\rfoot{}
\renewcommand{\footrulewidth}{0pt}
%%% ============================================================
\catcode`\_=\CatUsCode
\endinput
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% $Log: tdsguide.cls,v $
% Revision 1.19 2004/03/28 14:21:10 karl
% (\tdsSummary): \let\obeylines=\relax after we set
% it, so url.sty v3.0's usage of \obeylines does not
% cause errors.
%
% Revision 1.18 1998/01/26 21:26:10 karl
% (\TeXinfo): Remove unused and incorrect name.
% (\parsep): Decrease slightly.
% (\l@section): Decrease section spacing for toc slightly.
% (\@maketitle): Remove word `draft'.
%
% Revision 1.17 1997/02/07 20:47:16 karl
% Fix : in tdsSummary, more doc.
%
% Revision 1.16 1996/11/16 14:23:58 karl
% fancyhdr requires different commands.
%
% Revision 1.13 1995/11/21 18:57:35 schrod
% Add description-squeeze environment.
%
% Revision 1.12 1995/11/14 18:33:18 schrod
% Drop draft hint in legalnotice environment, make title more
% squeezed. Changes by Karl, to make title & toc fit on one page.
%
% Revision 1.11 1995/11/14 12:36:54 schrod
% Use url.sty instead of path.sty. (On request of Karl, better input
% syntax and different line breaks [0.103].)
% Rename environment explicate to ttdisplay. (Proposal of Karl.)
%
% Revision 1.10 1995/11/11 16:29:01 schrod
% Identify version of class in log file.
% Change layout of table of contents. Implementation of a discussion
% between Karl Berry and myself.
%
% Revision 1.9 1995/11/11 15:43:34 schrod
% Replace alltt environment by explicate environment. Change
% requested by Karl at 09 Nov 95.
%
% Revision 1.8 1995/11/02 10:52:29 schrod
% Add option nomflogo, mflogo is default now.
% Don't need provision for slanted typewriter type any more,
% replacable texts are set in italics now.
% Add logos \texmf and \CTAN:. [kb]
% Set margins in addition to \textwidth. It's a bit wider, too. [kb]
% Wider distance between item label and item text. [kb]
% New environment itemize-squeeze, without space between items. [kb]
%
% Revision 1.7 1995/05/18 09:06:39 schrod
% Don't parse arguments unnecessarily early, one might change
% catcodes in them.
% Use \tds_tt to switch to typewriter, also typesets backslashs and
% underscores [kb].
% Increase width to 33pc [kb].
%
% Revision 1.6 1995/05/12 23:19:07 schrod
% \f@size may be a fraction, so use dimension register to compute
% the reduced size for abbreviations [dc].
% In summary tables, terminate the directory names with slashes [kb, nw].
%
% Revision 1.5 1995/05/09 01:46:24 schrod
% Typeset abbreviation one point smaller than surrounding font [uv,
% kb, bb], use always uppercase letters for them. Rename the tag from
% \acronym to \abbr [kb, nw].
%
% Revision 1.4 1995/05/09 00:39:57 schrod
% Repair vertical spacing around tdsSummary environment.
%
% Revision 1.3 1995/05/08 17:14:52 schrod
% For TDS 0.72 Norm changed the document to use \abbr (argument with
% lowercase letters) instead of \acronym. It's not looking better, of
% course; small caps is not really a good font for abbreviations. This
% revision just tracks his change, I'll look later if I can improve the
% rendering.
%
% Revision 1.2 1995/05/07 18:22:53 schrod
% In environment tdsSummary: Next directory level indented by one
% quad, without dots for indentation [kb, !uv, js].
% Renamed Draft flag to TdsDraft, to keep namespace clean.
% Headline now features a centered short title [kb, uv, nw]. It's
% still ruled.
% \replaceable used spurious \selectfont [uv]. \dir & \ext are not
% used [uv].
% Subsubsections are also numbered and not indented [uv]. But they
% are still not added to the table of contents. Actually, we have only
% _one_ subsubsection...
% Set erroneously counter `secnumdepth' when I wanted fewer section
% headings in the table of contents. That's controlled by counter
% `tocdepth' [uv].
% Inherit tdsguide from article class, not from ltxguide. The tags
% of the latter class are not appropriate and we define our layout
% ourselves.
%
%
% pre-CVS Log:
%
% 19 Apr 95 js Made a LaTeX2e class.
% Use mflogo option to select MF/MP logo typesetting,
% support configuration file.
% 1994-1995 nw Initial revision.
%%%------------------------------------------------------------
% mode: LaTeX
% Local Variables:
% TeX-brace-indent-level: 4
% indent-tabs-mode: t
% TeX-auto-untabify: nil
% TeX-auto-regexp-list: LaTeX-auto-regexp-list
% page-delimiter: "^%%%"
% End: