% TOC DOCUMENT STYLE -- Released 18 Jul 90 % for LaTeX version 2.09 % Copyright (C) 1990 by Nico Poppelier \typeout{Document-style option `toc' <18 Jul 90>.} % **************************************** % * SECTIONAL-UNIT LEVELS * % **************************************** % % \new@level{LEVEL}[WITHIN] % - if X = \n@level, then define % \dl@LEVEL == X and \dln@X == LEVEL % - allocate an extra counter \xc@LEVEL, to be used to save % the original counter value while we are generating the TOC, % during which \c@LEVEL holds the counter value that is read % from the .toc file % - \newcounter{LEVEL} is the last part of the macro, so it picks up % the optional argument, if this is present \newcount\n@level \n@level=\m@ne \def\new@level#1{\advance\n@level\@ne \expandafter\xdef\csname dl@#1\endcsname{\the\n@level} \expandafter\gdef\csname dln@\the\n@level\endcsname{#1} \expandafter\newcount\csname xc@#1\endcsname \expandafter\gdef\csname #1mark\endcsname##1{} \newcounter{#1}} % **************************************** % * TABLE FILES * % **************************************** % % In the document style, the definitions % \def\ext@figure{lof} % \def\ext@table{lot} % are replaced by % \@extension{figure}{lof} % \@extension{table}{lot} % The calls to \@extension should be put in the \tableofcontents, % \listoffigures, ... commands % % \@extension{TYPE}{EXT}: % - globally defines \ext@TYPE == EXT % - globally sets \@extlist := \@extlist * \@op {EXT} % for TYPE = type of float object, EXT = file extension. % The .toc file is always on the list. \newtoks\@extlist \@extlist={\@op{toc}} \def\@extension#1#2{\expandafter\gdef\csname ext@#1\endcsname{#2} \begingroup \let\@op\relax \xdef\@tempa{\noexpand\@extlist={\the\@extlist\@op{#2}}} \endgroup \@tempa} % **************************************** % * TABLE OF CONTENTS * % * (PROCESSING THE INFORMATION) * % **************************************** % % The command \contentsline{NAME} executes \l@NAME. % So, to specify the table of contents, we must define \l@chapter, % \l@section, \l@subsection, ... ; to specify the list of figures, we must % define \l@figure; and so on. % % If a full table (of contents, of figures, ...) must be produced, we % read the entire table file, e.g. JOB.toc or JOB.lof. If a partial table % (of contents, of figures, ...) must be produced, we set up a restriction % and then read the entire table file, but only execute those entries that % satisfy the restriction. \newcount\cur@level \cur@level=\m@ne \newcount\cur@count \cur@count=\m@ne % \currentsection{TYPE}{NUMBER} \def\currentsection#1#2{\cur@level=\csname dl@#1\endcsname \cur@count=#2 \ifnum\cur@count<0 \else \csname c@#1\endcsname=#2\fi} % \contentsline{TYPE}{NUMBER}{TITLE}{PAGE} % % Making a fulll TOC means that only those entries are processed % for which \cur@level <= \max@level. % % Making a partial TOC at level D for counter values (c_0, ..., c_D) % means that only those entries are processed for which % \min@level <= \cur@level AND % \cur@level <= \max@level AND % (c_0, ..., c_D) = (r_0, ..., r_D) % \min@level and D are dependent, since we have: \min@level= D+1. % r_k is the value of the k-th counter as read from the table file. % % \check@result := true; % FOR k := 0 TO d DO % \check@result := \check@result AND (c_k = r_k) % OD % \check@result := \check@result AND % (\min@level <= \cur@level) AND (\cur@level <= \max@level) % % We translate each of these D+3 conditions to true = 1, false = 0. % If the result is 1 we process the entry, otherwise we don't. % % One \@whilenum loop is used to build up a token list. The token list % is used to simulate a loop in the decision whether to process % a certain entry. % % \if@partialtab indicates whether the table currently being constructed % is a partial one (\@partialtabtrue) or a full one (\@partialtabfalse) \newif\if@partialtab \@partialtabfalse \newtoks\@levlist \newcount\min@level \newcount\max@level \def\@addlevel#1{\begingroup \let\@op\relax \xdef\@tempa{\noexpand\@levlist={\the\@levlist\@op{#1}}} \endgroup \@tempa} \def\settocdepth#1{\c@tocdepth=\csname dl@#1\endcsname} \def\setsecnumdepth#1{\c@secnumdepth=\csname dl@#1\endcsname} % \@starttoc{EXTENSION} == % - set \max@level; \min@level should be set by calling macro % - build list of all counters that need to be compared % - save the global values of the counters \c@TYPE in \xc@TYPE % - define condition on counter values % - read table file % - open new table file % \def\@starttoc#1{\begingroup \max@level=\c@tocdepth \if@partialtab \@tempcnta\z@ \@levlist={} \@whilenum \@tempcnta<\min@level\do% {\edef\@tempa{\noexpand\@addlevel{\csname dln@\the\@tempcnta\endcsname}} \@tempa \advance\@tempcnta\@ne}\fi \def\@op##1{\csname xc@##1\endcsname=\csname c@##1\endcsname}\the\@levlist \def\@op##1{\ifnum\csname c@##1\endcsname=\csname xc@##1\endcsname \else \check@result\z@ \fi}\makeatletter \@input{\jobname.#1}\global\@nobreakfalse \endgroup} % opening of the new .toc, .lof, .lot, ... files is postponed until % the end of the document, just before the .aux file is processed % \def\enddocument{\@checkend{document}\clearpage\begingroup \if@filesw \immediate\closeout\@mainaux \def\@op##1{\expandafter\newwrite\csname tf@##1\endcsname \expandafter\immediate\expandafter\openout \csname tf@##1\endcsname=\jobname.##1\relax}\the\@extlist \def\global\@namedef##1##2{}\def\newlabel{\@testdef r}% \def\bibcite{\@testdef b}\@tempswafalse \makeatletter\input \jobname.aux \if@tempswa \@warning{Label(s) may have changed. Rerun to get cross-references right}\fi\fi\endgroup\deadcycles\z@\@@end} \newif\if@numbered \newcount\check@result \def\@checkentry{\ifnum\cur@level<\min@level \check@result\z@ \fi \ifnum\cur@level>\max@level \check@result\z@ \fi \the\@levlist} % \contentsline{LEVEL}{NUMBER}{TITLE}{PAGE} \def\contentsline#1#2#3#4{\cur@level=\csname dl@#1\endcsname \cur@count=#2 \ifnum\cur@count<0 \@numberedfalse \else \@numberedtrue \csname c@#1\endcsname=#2\fi \check@result\@ne \if@partialtab \@checkentry \else \ifnum\cur@level>\max@level \check@result\z@ \fi \fi \ifnum\check@result=\@ne \csname l@#1\endcsname{#3}{#4}\fi} % \def\contentsextra#1{\if@partialtab\@checkentry\else\check@result\@ne\fi % \ifnum\check@result=\@ne #1\fi} \def\contentsextra#1{#1} % \@starttable{FULL}{PARTIAL} == % BEGIN % IF optional argument present THEN % absorb optional argument LEVEL % \@partialtab := true % current level := \dl@LEVEL % PARTIAL % ELSE % \@partialtab := false; % FULL % FI % END \def\@starttable#1#2{\@ifnextchar [{\@xstarttable{#2}}{\@partialtabfalse #1}} \def\@xstarttable#1[#2]{\@partialtabtrue \expandafter\min@level\csname dl@#2\endcsname \edef\@tempa{\the\min@level}\advance\min@level\@ne #1{\@tempa}} % **************************************** % * TABLE OF CONTENTS * % * (FORMATTING THE INFORMATION) * % **************************************** % % \@dottedtocline{INDENT}{NUMWIDTH}{STYLE}{NUMBER}{TITLE}{PAGE} : % #1 #2 #3 #4 #5 #6 % Macro to produce a table of contents line with the following % parameters: % INDENT : Total indentation from the left margin. % NUMWIDTH : Width of box for number. % This is also the amount of extra indentation added % to second and later lines of a multiple line entry. % STYLE : Style declarations that determine layout of entry. % NUMBER : Formatted sectional-unit number % TITLE : Contents of entry. % PAGE : Formatted page number. % STYLE : Style declarations. % % Uses the following parameters, which must be set by the document style. % They should be defined with \def's. % \@pnumwidth : Width of box in which page number is set. % \@tocrmarg : Right margin indentation for all but last line of % multiple-line entries. % \@dotsep : Separation between dots, in mu units. Should be \def'd to % a number like 2 or 1.7 % % \@dottedtocline{INDENT}{NUMWIDTH}{STYLE}{NUMBER}{TITLE}{PAGE} : % #1 #2 #3 #4 #5 #6 \def\@dottedtocline#1#2#3#4#5#6{\vskip \z@ plus 0.2pt \begingroup #3 \@tempdima #1\relax \@tempdimb #2\relax \leftskip\@tempdima \advance\leftskip by \@tempdimb \rightskip\@tocrmarg plus 1fil \interlinepenalty\@M \parfillskip-\rightskip \parindent\z@ \leavevmode \hbox{}\hskip-\@tempdimb \if@numbered \hbox to \@tempdimb{#4\hfill}\fi #5\nobreak \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern \@dotsep mu $}\hfill \nobreak \hbox to\@pnumwidth{\hfil #6}\par \endgroup} %%% Note: \nobreak's added 7 Jan 86 to prevent bad line break that %%% left the page number dangling by itself at left edge of a new line. %%% %%% Changed 25 Jan 88 to use \leftskip instead of \hangindent so %%% leaders of multiple-line contents entries would line up properly. % **************************************** % * TABLE OF CONTENTS * % * (GENERATING THE INFORMATION) * % **************************************** % % Entries in the table of contents, or another table file, are % generated by a call to % \addcontentsline{EXT}{TYPE}{ENTRY} % % For every sectional-unit command \TYPE the following instructions must % be written to the .aux file: % \currentsection{TYPE}{NUMBER} % \contentsline{TYPE}{NUMBER}{TITLE}{PAGE} % % For every sectional-unit command \TYPE the following instruction must % also be written to all table files, e.g. the .lof and .lot files: % \currentsection{TYPE}{NUMBER} % % For every caption of a float object TYPE the following % instruction must be written to the corresponding table file: % \contentsline{TYPE}{NUMBER}{TITLE}{PAGE} % % Extra instructions, added via \addtocontents{EXT}{TEXT}, % must result in the following line, without the in this case % irrelevant page number, on the .EXT file % \contentsextra{TEXT} % % Legend: % NUMBER = the value of the counter corresponding to LEVEL % TITLE = heading of sectional unit % PAGE = page number (formatted) % \def\addcontentsline#1#2#3{\if@filesw \begingroup \let\label\@gobble \let\index\@gobble \let\glossary\@gobble \def\protect##1{\string\string\string##1\string\space \space}\@temptokena{\thepage}% \edef\@tempa{\write \@auxout{\string\@writefile{#1}{\protect \contentsline{#2}{\the\cur@count}{#3}{\the\@temptokena}}}}\@tempa \if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi} \def\addcurrentsection#1{\if@filesw \begingroup \def\protect##1{\string\string\string##1\string\space \space}\edef\@tempa {\write\@auxout{\string\currentsection{#1}{\the\cur@count}}}\@tempa \def\@op##1{\edef\@tempa{\write \@auxout{\string\@writefile{##1}{\protect \currentsection{#1}{\the\cur@count}}}}\@tempa} \the\@extlist \if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi} \long\def\addtocontents#1#2{\if@filesw \begingroup \let\label\@gobble \let\index\@gobble \let\glossary\@gobble \def\protect##1{\string\string\string##1\string\space\space}% \edef\@tempa{\write \@auxout{\string\@writefile{#1}{\protect \contentsextra{#2}}}}\@tempa \if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi} % **************************************** % * FLOATS * % **************************************** % % \long\def\@caption#1[#2]#3{\par\addcontentsline{\csname % ext@#1\endcsname}{#1}{\protect\numberline{\csname % the#1\endcsname}{\ignorespaces #2}}\begingroup % \@parboxrestore % \normalsize % \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par % \endgroup} \long\def\@caption#1[#2]#3{\cur@count=\csname c@#1\endcsname \par \addcontentsline{\csname ext@#1\endcsname}{#1}{{\ignorespaces #2}} \begingroup \@parboxrestore \normalsize \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par \endgroup}