% \iffalse \NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{multitoc} % [1999/06/08 v2.01 MultiToc Package (MS)] % %<*driver> \ProvidesFile{multitoc.drv} [1999/06/08 v2.01 Driver for MultiToc Package (MS)] \documentclass{ltxdoc} \usepackage{url} \usepackage{ragged2e} \usepackage[toc]{multitoc} \GetFileInfo{multitoc.sty} \setcounter{IndexColumns}{2} \EnableCrossrefs %%\DisableCrossrefs% Say \DisableCrossrefs if index is ready \CodelineIndex % Index code by line number \OnlyDescription % comment out for implementation details %%\OldMakeIndex % use if your MakeIndex is pre-v2.9 \setcounter{IndexColumns}{2} \setlength{\IndexMin}{30ex} \setlength{\premulticols}{\IndexMin} \RaggedRight \begin{document} \DocInput{multitoc.dtx} \end{document} % % % Copyright (c) [1998..1999] by Martin Schr\"oder. All rights reserved. % % This program may be redistributed and/or modified under the terms % of the LaTeX Project Public License, either version 1.0 of this % license, or (at your option) any later version. % The latest version of this license is in % CTAN:macros/latex/base/lppl.txt. % % Happy users are requested to send me a postcard. :-) % % For error reports in case of UNCHANGED versions see multitoc.ins % % \fi % % \CheckSum{83} % %% \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 meta-comment %% =================================================================== %% @LaTeX-style-file{ %% author = {Martin Schr\"oder}, %% version = "2.01", %% date = "8 June 1999", %% filename = "multitoc.sty", %% address = {Martin Schr\"oder %% Cr\"usemannallee 3 %% D-28213 Bremen %% telephone = "+49-421-2239425", %% email = "Martin.Schroeder@ACM.org", %% pgp-Key = "2048 bit / KeyID 292814E5", %% pgp-fingerprint = "7E86 6EC8 97FA 2995 82C3 FEA5 2719 090E", % checksum = "62732 556 2216 19056", % codetable = "ISO/ASCII", % keywords = "LaTeX, multicol, toc, lof, lot", % dependences = "multicol", % supported = "yes", %% docstring = "LaTeX package which automatically sets only %% the table of contents, list of figures and list %% of tables in two or more columns. %% The number of columns can be configured. %% Uses the multicol package. % % The checksum field above contains a CRC-16 % checksum as the first value, followed by % the equivalent of the standard UNIX wc % (word count) utility output of lines, % words, and characters. This is produced % by Robert Solovay's checksum utility." %% } %% =================================================================== %% \fi % % \changes{v0.90}{1998/05/23}{New} % \changes{v1.00}{1998/08/09}{Documentation improved} % \changes{v2.00}{1998/08/23}{Redesign} % \changes{v2.01}{1999/06/08}{Moved to LPPL} % % \newcommand*{\option}[1]{\textnormal{\sffamily#1}} % \newcommand*{\package}[1]{\textnormal{\sffamily#1}} % \newcommand*{\file}[1]{\textnormal{\texttt{.#1}}} % \newcommand*{\env}[1]{\textnormal{\texttt{#1}}} % % % ^^A ----------------------------- % % \title{\unskip % The \textsf{multitoc} package^^A % \thanks{^^A % The version number of this file is \fileversion, % last revised \filedate.\protect\newline % The name \textsf{multitoc} is a tribute to the $8+3$ % file-naming convention of certain ``operating % systems''; strictly speaking it should be % \textsf{MulticolumnToc}.} % } % \author{Martin Schr\"oder\\[0.5ex] % \normalsize Cr\"usemannallee 3\\ % \normalsize D-28213 Bremen\\ % \normalsize Martin.Schroeder@ACM.org\\ % \scriptsize \texttt{PGP-Key: 2048 bit / KeyID 292814E5}\\[-0.5em] % \scriptsize \texttt{7E86 6EC8 97FA 2995~~82C3 FEA5 2719 090E}} % \date{\filedate} % \maketitle % % ^^A ----------------------------- % % % \begin{abstract} % This package allows setting only the table of contents, list of % figures and/or list of tables in two or more columns. % The number of columns can be configured via commands; the % multicolumn toc(s) can be selected via package options. % \end{abstract} % % \pagestyle{headings} % % ^^A ----------------------------- % % \tableofcontents % % ^^A ----------------------------- % % \section{Introduction} % % % ^^A ----------------------------- % % \subsection{The problem\label{sec:sec:problem}} % ^^A % When you want to set only the table of contents of a document in two % (or more columns), there is one known way^^A % \footnote{^^A % This was first used in the \package{doc} % package\protect\cite{package:doc}. % }^^A % : Add an % \begin{quote} % |\addtocontents{toc}{\protect\begin{multicols}{2}}| % \end{quote} % before the \cs{tableofcontents} and an % \begin{quote} % |\addtocontents{toc}{\protect\end{multicols}}| % \end{quote} % at the end of the document. % This way your \file{toc} will start with |\begin{multicols}{2}| % and end with |\end{multicols}|. % % This can be automised by using \cs{AtBeginDocument} and % \cs{AtEndDocument} but this has the drawback that it may % collide with other commands inserted using \cs{AtEndDocument} that % try to write information to the auxilary file (like the % \package{count1to} package\cite{package:count1to}). % This is because \TeX{} has two ways to write information to files % \cite[p.\ 226--228]{KnuthTeXa}: immediately (when the \cs{write} is % prefixed by \cs{immediate}) or deferred till the current page is % finished and written out by \TeX{} (at the next \cs{shipout}). % \cs{addtocontents} does a deferred \cs{write}, \package{count1to} % does an immediate. % % \begin{quote} % \small % Sidenote: \cs{addtocontents} writes a command to the \file{aux} file % to write its information to the \file{toc} file. % The \file{aux} is read in and executed by |\end{document}| and at % the next run by |\begin{document}|. % So the \file{toc} is written by |\end{document}| and at the % next run by |\begin{document}|. % \end{quote} % % When you use the automised solution with \package{count1to} this may % happen: % \begin{enumerate} % \item The |\addtocontents{toc}{\protect\end{multicols}}| is inserted % using \cs{AtEndDocument} somewhere in the preamble. % \item \package{count1to} inserts this code % \begin{quote} % \hfuzz135pt % \small % |\clearpage|\\ % |\immediate\write\@auxout{\string\newlabel{TotalPages}{{\the\count1}{\the\count1}}}| % \end{quote} % via an |\AtBeginDocument{\AtEndDocument{| so it can be sure that % this code is the \emph{last} code executed by \cs{AtEndDocument}. % \item At the |\end{document}| first the code from step~1 is executed % which adds the information to the current page to write the % |\@writefile{toc}{\end{multicols}}| to the auxilary file % \emph{when the current page is finished}. % % Then the code from step~2 is executed, which lets \LaTeX{} clear % the page (to force all pending writes to be written) and % \emph{immediately} after that write the information for the % |TotalPages| to the auxilary file. % % Now suppose that the |\end{document}| is called \emph{just after} % \LaTeX{} has finished the last page. % The code from step~1 is never written to the file (since at the % \cs{clearpage} \LaTeX{} has no page to finish and so the code % waits for the \cs{shipout} which won't come), but the code from % step~2 is. % So you now have an \file{aux} which won't write the % |\end{multicols}| to the \file{toc}. % This of course produces an error at the next run. % \end{enumerate} % % % ^^A ----------------------------- % % \subsection{A solution} % ^^A % \DescribeMacro{\@starttoc} % An easy way around this is to simply redefine \cs{@starttoc} from % \cite{package:ltsect} which reads in the \file{toc} to wrap a % \env{multicol} around it.\footnote{^^A % Thanks to Frank Mittelbach for reminding me of this.}^^A % $^{,}$^^A % \footnote{^^A % \raggedright % Version~1.00 of this package provided a more elaborate solution % to this using \cs{immediateaddtocontents}; this is no longer needed. % But the commands from version~1.00 are still provided (see % section~\ref{sec:sec:version100}).} % % % ^^A ----------------------------- % % \section{Parameters} % ^^A % \DescribeMacro{\multicolumntoc} % \DescribeMacro{\multicolumnlot} % \DescribeMacro{\multicolumnlof} % The number of columns for the table of contens, list of figures and % list of tables can be set by redefining the commands % \cs{multicolumntoc}, \cs{multicolumnlot} and \cs{multicolumnlof}. % The default is two columns. % % % ^^A ----------------------------- % % \section{Options} % ^^A % The package has the following options: % \nopagebreak % \begin{description} % \item[\normalfont\option{toc}] % The table of contents is set in \cs{multicolumntoc} columns. % \item[\normalfont\option{lof}] % The list of figures is set in \cs{multicolumnlof} columns. % \item[\normalfont\option{lot}] % The list of tables is set in \cs{multicolumnlot} columns. % \end{description} % % % ^^A ----------------------------- % % \section{Required packages} % ^^A % The package requires the \package{multicol} and the % \package{ifthen} packages. % % % ^^A ----------------------------- % % \StopEventually{^^A % % % ^^A ----------------------------- % % \begin{thebibliography}{1} % \raggedright % \bibitem{package:ltfiles} % Johannes Braams, David Carlisle, Alan Jeffrey, Leslie Lamport, % Frank Mittelbach, Chris Rowley and Rainer Sch\"opf. % \newblock \package{ltfiles.dtx}. % \newblock \texttt{CTAN: tex-archive/macros/latex/base/ltfiles.dtx}. % \newblock \LaTeXe{} kernel. % \bibitem{package:ltsect} % Johannes Braams, David Carlisle, Alan Jeffrey, Leslie Lamport, % Frank Mittelbach, Chris Rowley, Tobias Oetiker and Rainer Sch\"opf. % \newblock \package{ltsect.dtx}. % \newblock \url{CTAN: tex-archive/macros/latex/base/ltsect.dtx}. % \newblock \LaTeXe{} kernel. % \bibitem{KnuthTeXa} % Donald~E.\ Knuth. % \newblock \emph{The {\TeX}Book}, volume~A of \emph{Computers % and Typesetting}. % \newblock Addison-Wes\-ley, 1986. % \newblock Eleventh printing, revised, May 1991. % \bibitem{package:doc} % Frank Mittelbach. % \newblock The \package{doc} and \package{shortvrb} package. % \newblock \url{CTAN: tex-archive/macros/latex/base/doc.dtx}. % \newblock \LaTeXe{} package. % \bibitem{package:count1to} % Martin Schr\"oder. % \newblock The \package{count1to} package. % \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/ms/count1to.dtx}. % \newblock \LaTeXe{} package. % \end{thebibliography} % % } % % % ^^A ----------------------------- % % \section{The Implementation} % ^^A % \setlength{\parindent}{0pt} % \begin{macrocode} %<*package> % \end{macrocode} % % We need the \package{multicol} and the \package{ifthen} packages. % \begin{macrocode} \RequirePackage{multicol} \RequirePackage{ifthen} % \end{macrocode} % % % ^^A ----------------------------- % % \subsection{The parameters} % ^^A % \begin{macro}{\multicolumntoc} % \begin{macro}{\multicolumnlot} % \begin{macro}{\multicolumnlof} % \mbox{} % \begin{macrocode} \newcommand{\multicolumntoc}{2} \newcommand{\multicolumnlot}{2} \newcommand{\multicolumnlof}{2} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % ^^A ----------------------------- % % \subsection{Initial Code} % ^^A % \begin{macro}{@multitoc@toc} % \changes{v2.00}{1998/08/23}{new} % \cs{if@multitoc@toc} is used to flag the use of the \option{toc} % otion. % \begin{macrocode} \newboolean{@multitoc@toc} % \end{macrocode} % \end{macro} % % \begin{macro}{@multitoc@lot} % \changes{v2.00}{1998/08/23}{new} % \cs{if@multitoc@lot} is used to flag the use of the \option{lot} % otion. % \begin{macrocode} \newboolean{@multitoc@lot} % \end{macrocode} % \end{macro} % % \begin{macro}{@multitoc@lof} % \changes{v2.00}{1998/08/23}{new} % \cs{if@multitoc@lof} is used to flag the use of the \option{lof} % otion. % \begin{macrocode} \newboolean{@multitoc@lof} % \end{macrocode} % \end{macro} % % % ^^A ----------------------------- % % \subsection{The options} % ^^A % The options simply set the corresponding flags. % \changes{v2.00}{1998/08/23}{Redesign} % \changes{v1.00}{1998/08/09}{\cs{clearpage}} % \begin{macrocode} \DeclareOption{toc}{\setboolean{@multitoc@toc}{true}} \DeclareOption{lot}{\setboolean{@multitoc@lot}{true}} \DeclareOption{lof}{\setboolean{@multitoc@lof}{true}} % \end{macrocode} % % % ^^A ----------------------------- % % \subsection{Executing options} % ^^A % There are no default options. % \begin{macrocode} \ProcessOptions\relax % \end{macrocode} % % % ^^A ----------------------------- % % \subsection{Redefining \cs{@starttoc}} % ^^A % \begin{macro}{\@starttoc} % From \cite{package:ltsect}: % \begin{quote} % The |\@starttoc|\marg{ext} command is used to define the commands:\\ % |\tableofcontents|, |\listoffigures|, etc. % % For example: % |\@starttoc{lof}| is used in |\listoffigures|. This command % reads the |.|\meta{ext} file and sets up to write the new % |.|\meta{ext} file. % % \begin{oldcomments} % \@starttoc{EXT} == % BEGIN % \begingroup % \makeatletter % read file \jobname.EXT % IF @filesw = true % THEN open \jobname.EXT as file \tf@EXT % FI % @nobreak :=G FALSE %% added 24 May 89 % \endgroup % END % \end{oldcomments} % \end{quote} % We store the current definition in \cs{@multitoc@starttoc} % and wrap it in a \env{multicol} environment if the right % option has been selected. % We also have to determine the number of columns to use.\footnote{^^A % This could probably be coded more effeciently, but this code % works\ldots} % \begin{macrocode} \let\@multitoc@starttoc\@starttoc \renewcommand*{\@starttoc}[1]{% \ifthenelse{\boolean{@multitoc@toc}\and\equal{#1}{toc}}{% \begin{multicols}{\multicolumntoc}% \@multitoc@starttoc{#1}% \end{multicols}% }{}% \ifthenelse{\boolean{@multitoc@lot}\and\equal{#1}{lot}}{% \begin{multicols}{\multicolumnlot}% \@multitoc@starttoc{#1}% \end{multicols}% }{}% \ifthenelse{\boolean{@multitoc@lof}\and\equal{#1}{lof}}{% \begin{multicols}{\multicolumnlof}% \@multitoc@starttoc{#1}% \end{multicols}% }{}% } % \end{macrocode} % \end{macro} % % % ^^A ----------------------------- % % \subsection{Code from Version~1.00\label{sec:sec:version100}} % ^^A % The first version of this package took a different approach to % solving the problem mentioned in section~\ref{sec:sec:problem} and % provided the commands \cs{protected@write@immediate} and % \cs{immediateaddtocontents}. % Their code has been retained here for compatibilty reasons. % % \DescribeMacro{\immediateaddtocontents} % \cs{immediateaddtocontents} is a version of \cs{addtocontents} which % does just what the name implies: Write the information \cs{immediate}. % % \begin{macro}{\protected@write@immediate} % This is a changed version of \cs{protected@write} % from~\cite{package:ltfiles}. % It takes three arguments: an output stream, some initialization % code, and some text to write. % It then writes this \emph{immediately}, with % appropriate handling of |\protect| and |\thepage|. % \changes{v2.00}{1998/09/06}{retained} % \begin{macrocode} \newcommand*{\protected@write@immediate}[3]{% \begingroup \let\thepage\relax #2% \let\protect\string \edef\reserved@a{\immediate\write#1{#3}}% \reserved@a \endgroup \if@nobreak\ifvmode\nobreak\fi\fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\immediateaddtocontents} % This is a changed version of \cs{addtocontents} % from~\cite{package:ltsect}. % The |\immediateaddtocontents{|\meta{table}|}{|\meta{text}|}| command % \emph{immediately} adds \meta{text} to the |.|\meta{table} file, % with no page number. % \changes{v2.00}{1998/09/06}{retained} % \begin{macrocode} \newcommand*{\immediateaddtocontents}[2]{% \protected@write@immediate\@auxout {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}% {\string\@writefile{#1}{#2}}} % \end{macrocode} % \end{macro} % % \begin{macrocode} % % \end{macrocode} % % ^^A ----------------------------- % % \Finale % % \PrintIndex\PrintChanges % ^^A Make sure that the index is not printed twice % ^^A (ltxdoc.cfg might have a second \PrintIndex command) % \let\PrintChanges\relax % \let\PrintIndex\relax