% \iffalse % makeindex -s gglo.ist -o aeb-minitoc.gls aeb-minitoc.glo % makeindex -s gind.ist -o aeb-minitoc.ind aeb-minitoc.idx %<*copyright> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% aeb-minitoc.sty package, %% %% Copyright (C) 2012--2018 D. P. Story %% %% dpstory@uakron.edu dpstory@acrotex.net %% %% %% %% This program can redistributed and/or modified under %% %% the terms of the LaTeX Project Public License %% %% Distributed from CTAN archives in directory %% %% macros/latex/base/lppl.txt; either version 1.2 of the %% %% License, or (at your option) any later version. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{aeb-minitoc} % [2019/10/06 v1.9 Creates a simple mini-toc] %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks,hyperindex=false,linktocpage,bookmarksnumbered]{hyperref} \usepackage{calc} \usepackage{aeb-minitoc} %\def\texorpdfstring#1#2{#1} %\pdfstringdefDisableCommands{\let\\\textbackslash} \OnlyDescription % comment out for implementation details \EnableCrossrefs \CodelineIndex \RecordChanges \gdef\brpr#1{\texttt{\char123\relax#1\char125\relax}} \let\darg\brpr \let\env\texttt \let\opt\texttt \let\app\textsf \let\pkg\textsf \def\EXCL{!} \def\visispace{\symbol{32}} \def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}} \def\meta#1{\textsl{\texttt{#1}}} \def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}} \def\CMD#1{\textbackslash#1} \makeatletter \renewcommand\theparagraph{\texorpdfstring{\protect\P\protect\ }{\textparagraph}} \renewcommand\thesubparagraph{\texorpdfstring{\protect\P\protect\P\protect\ }{\textparagraph\textparagraph}} \renewcommand{\section} {\renewcommand{\@seccntformat}[1]{\thesection\quad}% \@startsection {section}{1}{\z@}% {-3.5ex \@plus -1ex \@minus -.2ex}% {2.3ex \@plus.2ex}% {\normalfont\Large\bfseries}} \renewcommand{\paragraph} {\renewcommand{\@seccntformat}[1]{\theparagraph\unskip\,}% \@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}} \renewcommand{\subparagraph} {\renewcommand{\@seccntformat}[1]{\thesubparagraph\unskip\,}% \@startsection{subparagraph}{5}{\parindent}{6pt}{-3pt}{\bfseries}} \makeatother \InputIfFileExists{aebdocfmt.def}{\PackageWarning{aeb-minitoc}{Inputting aebdocfmt.def}} {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax \PackageInfo{aeb-minitoc}{aebdocfmt.def cannot be found}} \begin{document} \addtolength{\marginparwidth}{3pt} \GetFileInfo{aeb-minitoc.sty} \title{The \textsf{aeb-minitoc} Package} \author{D. P. Story\\ Email: \texttt{dpstory@uakron.edu}} \date{processed \today} \maketitle \setcounter{secnumdepth}{5} \setcounter{tocdepth}{5} \bgroup \value{secnumdepth}=3 \value{tocdepth}=3 \tableofcontents \egroup \DocInput{aeb-minitoc.dtx} \IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here. Execute \begin{quote}\texttt{makeindex -s gind.ist -o aeb-minitoc.ind aeb-minitoc.idx}\end{quote} on the command line and recompile \texttt{aeb-minitoc.dtx}.} \IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here. Execute \begin{quote} \texttt{makeindex -s gglo.ist -o aeb-minitoc.gls aeb-minitoc.glo} \end{quote} on the command line and recompile \texttt{aeb-minitoc.dtx}.} \end{document} % % \fi % \MakeShortVerb{|} % \InputIfFileExists{aebdonotindex.def}{\PackageInfo{web}{Inputting aebdonotindex.def}} % {\PackageInfo{web}{cannot find aebdonotindex.def}} % \begin{macrocode} %<*package> % \end{macrocode} % The \DescribeMacro{\ifMiniTocListings}\cs{ifMiniTocListings} is a Boolean switch, which when true % signals that there is a non-empty listing; otherwise, it is set to false. It is used to display % a latex warning to the user that the listing is empty. Also, globally, \cs{ifMiniTocListings} % is set to false when \IndexOpt{nominitocs}\opt{nominitocs} is taken. The other option % is \IndexOpt[\protect\EXCL]{!nominitocs}\opt{!nominitocs} is a convenience option; it is not `not' version % of \opt{nominitocs}; when \opt{!nominitocs} is specified, mini-tocs are created. This is the % same as specifiying no option at all. % \begin{macrocode} \newif\ifMiniTocListings \MiniTocListingstrue \DeclareOption{nominitocs}{\AtEndOfPackage{\MiniTocListingsfalse \let\insertminitoc\insertminitocNOT}} \DeclareOption{!nominitocs}{\MiniTocListingstrue} \ProcessOptions % \end{macrocode} % \section{Description} % A simple mini-toc package; originally designed for \textsf{web}, but now works for all standard % {\LaTeX} classes. The main user command is \cs{insertminitoc}, defined below. % % Our approach is to use each entry the \cs{jobname.toc} as the first argument of the % macro \cs{mtocCL}, a second argument keeps a running count on the number of entries. %\begin{flushleft}\small %\begin{verbatim} %\mtocCL{\contentsline{section}{\numberline{1}Section Title}{2}}{cnt} or %\mtocCL{\contentsline{section} % {\numberline{1}Section Title}{2}{section.1}}{cnt} %\end{verbatim} %\end{flushleft} %\cs{contentsline} has four arguments when \pkg{hyperref} is loaded and three otherwise. When inserting %the full table of contents, we define |\def\mtocCL#1#2{#1}| to do nothing. When we %are building a mini-toc, we \cs{let} \cs{mtocCL} to \cs{mtoc@CL@mtoc}. The effect %of this macro is to remove any entry (in \cs{jobname.toc}) that does not contain %\cs{contentsline} as it first token and to position the \texttt{cnt} argument for later use. %But by then \cs{contentsline} has already %been \cs{let} to \cs{cl@LOOKFORSEC}. Now \cs{cl@LOOKFORSEC} determines whether any %particular entry should be displayed in the current mini-toc. % % \section{Documentation and Code.} % As a demonstration of this package, we present a mini-toc for this section, % which only has \cs{paragraph} and \cs{subparagraph} section headings. % \changes{v1.2}{2018/08/29}{Created \string\texttt{aeb-minitoc.ins}} % \changes{v1.3}{2018/08/29}{Remove \string\textsf{hyperref} as a requirement} % \changes{v1.4}{2018/08/29}{Some renaming of commands} % \changes{v1.6}{2018/09/21}{Code cleanup in prepreparation for release} % % The verbatim listing for this mini-toc is %\begin{verbatim} %\TOCLevels{section}{subparagraph} %\begin{minitocfmt}{\minitocFmt} % \declaretocfmt{paragraph}{\@W{1em}\@D{0em}} % \declaretocfmt{subparagraph}{\@W{1.5em}\@D{1em}} %\end{minitocfmt} % %\begin{center}\minitocFmt %\fbox{\begin{minipage}{0.8\linewidth}\centering %\textbf{Contents of this section}\vadjust{\kern3pt}% %\insertminitoc\relax %\end{minipage}} %\end{center} %\end{verbatim} % \value{secnumdepth}=5 \value{tocdepth}=5 % \TOCLevels{section}{subparagraph} % \begin{minitocfmt}{\minitocFmt} % \declaretocfmt{paragraph}{\@W{1em}\@D{0em}} % \declaretocfmt{subparagraph}{\@W{1.5em}\@D{1em}} % \end{minitocfmt} % % \begin{center}\minitocFmt % \fbox{\begin{minipage}{0.8\linewidth}\centering % \textbf{Contents of this section}\vadjust{\kern3pt}% % \insertminitoc\relax % \end{minipage}} % \end{center} % % \noindent We begin by saving the definitions macros we modify later. % \begin{macrocode} \let\mtoc@contentsline\contentsline \let\mtoc@starttoc\@starttoc \let\mtoc@tableofcontents\tableofcontents %\let\mtoc@addtocontents\addtocontents % \end{macrocode} % Some counters and utility macros. The counter \DescribeMacro\@minitocCnt\cs{@minitocCnt} is incremented % in the redefined \cs{addtocontents} command. The command \DescribeMacro{\mtocgobble}\cs{mtocgobble} is % a `public' version of the core {\LaTeX} command \cs{@gobble}. % \begin{macrocode} \newcount\@minitocCnt \@minitocCnt=0\relax \def\csarg#1#2{\expandafter#1\csname#2\endcsname} \let\mtoc@One=1 \let\mtoc@Zero=0 \let\mtocgobble\@gobble % \end{macrocode} % % \paragraph[The top and bottom most]{The top and bottom most.} % The package assigns the top level and bottom level automatically, based upon the class being used; % the document author can override these for the whole document, or for particular mini-tocs. % \DescribeMacro{\TOPLevel}\cs{TOPLevel\darg{\ameta{name}}} is the name of the top level. It is expected % that a mini-toc will be inserted with each top level in the document, as the author's discretion. The % \DescribeMacro{\BTMLevel}\cs{BTMLevel\darg{\ameta{name}}} is the name of the bottom most level. A mini-toc % consists of all sections \emph{beneath} the top level and \emph{above} the bottom level. Thus, if % \cs{TOPLevel\darg{chapter}} and \cs{BTMLevel\darg{subsubsection}}, then the mini-toc contans all \cs{section} % and \cs{subbsection} title headings within the current chapter. % % \subparagraph[Manually set the top and bottom levels]{Manually set the top and bottom levels.} \DescribeMacro{\TOPLevel}\cs{TOPLevel\darg{\ameta{top-level}}} % and \DescribeMacro{\BTMLevel}\cs{BTMLevel\darg{\ameta{btm-level}}} are used to determine what entries are to be included in the mini-toc. % As a convenience, % \begin{quote} % \DescribeMacro{\TOCLevels}\cs{TOCLevels\darg{\ameta{top-level}}\darg{\ameta{btm-level}}} % \end{quote} % can declare both % at once. If an argument is empty, the current level is used. % \begin{macrocode} \def\TOPLevel#1{\def\x{#1}\ifx\x\@empty\else \def\mtoc@TOPLevel{#1}\edef\TOPLevelNum{\@nameuse{sl@#1}}\fi} \def\BTMLevel#1{\def\x{#1}\ifx\x\@empty\else \def\mtoc@BTMLevel{#1}\edef\BTMLevelNum{\@nameuse{sl@#1}}\fi} \def\TOCLevels#1#2{\TOPLevel{#1}\BTMLevel{#2}} % \end{macrocode} % \subparagraph[Automatically set the top and bottom levels]{Automatically set the top and bottom levels.} % We make reasonable choices for \texttt{book}, \texttt{report}, and \texttt{article}; these are the three % classes that this package supports. In the course, we define, in macro form, the levels of % each of these section names (\cs{sl@\ameta{sec-name}} and \cs{sl@\ameta{sec-name}*}). % \begin{macrocode} \@ifclassloaded{book}{% \TOCLevels{chapter}{subsection} \def\sl@part{-1}\def\sl@chapter{0} \csarg{\edef}{sl@part*}{\sl@part} \csarg{\edef}{sl@chapter*}{\sl@chapter} }{% \@ifclassloaded{report}{% \TOCLevels{chapter}{subsection} \def\sl@part{-1}\def\sl@chapter{0} \csarg{\edef}{sl@part*}{\sl@part} \csarg{\edef}{sl@chapter*}{\sl@chapter} }{% \TOCLevels{section}{subsubsection} \def\sl@part{0}\csarg{\edef}{sl@part*}{\sl@part} }% } \def\sl@section{1}\def\sl@subsection{2}\def\sl@subsubsection{3} \def\sl@paragraph{4}\def\sl@subparagraph{5}%\def\sl@all{17} \csarg{\edef}{sl@section*}{\sl@section} \csarg{\edef}{sl@subsection*}{\sl@subsection} \csarg{\edef}{sl@subsubsection*}{\sl@subsubsection} \csarg{\edef}{sl@paragraph*}{\sl@paragraph} \csarg{\edef}{sl@subparagraph*}{\sl@subparagraph} \newif\if@foundTOPLevel \@foundTOPLevelfalse % \end{macrocode} % The command \cs{insertminitoc}, just before inputting \cs{jobname.toc}, \cs{let}s \cs{contentsline} to % \DescribeMacro\cl@LOOKFORSEC\cs{cl@LOOKFORSEC}. This command then looks for lines at the top most section level, if it finds one, % and the section number matches the one set by \cs{insertminitoc} (\cs{mtoc@sec}), it sets % \cs{if@foundTOPLevel} to \texttt{true}, and stores all subsequent lines in \cs{toks@} until % another section is encountered, at which time \cs{if@foundTOPLevel} is set to \texttt{false}. There are two versions % of \cs{cl@LOOKFORSEC}: (1) \DescribeMacro\cl@LOOKFORSEC@LX\cs{cl@LOOKFORSEC@LX} for when \pkg{hyperref} is not loaded; % and (2) \DescribeMacro\cl@LOOKFORSEC@HY\cs{cl@LOOKFORSEC@HY} for % when \pkg{hyperref} is loaded.\par\medskip % \noindent % \cs{mtoc@@contentsline} takes five arguments, we save the page number (\texttt{\#3}) % the hyperref anchor (\texttt{\#4}) and the TOC entry number (\texttt{\#5}). The % definitions made within \cs{mtoc@@contentsline} are later \cs{let} to \cs{@PgNum}, % \cs{@L}, and \cs{@E}. We grab \texttt{\#5}, which is the entry count, and pass % the rest to \cs{mtoc@contentsline}. % \begin{macrocode} \def\mtoc@@contentsline#1#2#3#4#5{\def\mtoc@PgNum{#3}% \def\mtoc@HY@anchor{#4}\def\TOCEntryNum{#5}% \mtoc@contentsline{#1}{#2}{#3}{#4}} % \end{macrocode} % All but the last argument in both of these next two command are the standard % arguments for \cs{contentsline}. The last argument is one introduced by this % package; it keeps the count of the TOC entries. This last argument is used % to identify the top level section. % \begin{macrocode} \long\def\cl@LOOKFORSEC@LX#1#2#3#4{% \cl@LOOKFORSEC@HY{#1}{#2}{#3}{\@empty}{#4}} \long\def\cl@LOOKFORSEC@HY#1#2#3#4#5{\def\mt@rgi{#1}% dps \if@foundTOPLevel\ifx\mtocCL\@gobbletwo\else \edef\NUMLevel{\@nameuse{sl@#1}}% \ifnum\NUMLevel > \TOPLevelNum\relax\else \let\mtocCL\@gobbletwo \fi \fi\fi \@chkForNl#2\@nil % is it a * section \ifx\mtocCL\@gobbletwo\else \edef\mtoc@tmp{\the\mtocs@toks@}% \ifx\mt@rgi\mtoc@TOPLevel \def\SECNUM{MTOC.#5}% \set@display@protect \edef\mtoc@sec{\mtoc@sec}% \ifx\SECNUM\mtoc@sec \@foundTOPLeveltrue \else \@foundTOPLevelfalse\fi \set@typeset@protect \else \if@foundTOPLevel \ifnum\NUMLevel > \BTMLevelNum\relax\else \ifx\@nlrtn\relax \mtocs@toks@=\expandafter{\mtoc@tmp \mtoc@@contentsline{#1}{#2}{#3}{#4}{#5}}\else \mtocs@toks@=\expandafter{\mtoc@tmp \mtoc@@contentsline{#1*}{#2}{#3}{#4}{#5}}\fi \fi \fi \fi \fi } % \end{macrocode} % This version of \cs{mtoc@BTMLevel} only accepts lines that are not % \texttt{subsubsection}. % \begin{macrocode} \@ifpackageloaded{hyperref}{\let\cl@LOOKFORSEC\cl@LOOKFORSEC@HY} {\let\cl@LOOKFORSEC\cl@LOOKFORSEC@LX} % \end{macrocode} % \DescribeMacro{\@chkForNl} determines if the first token is \cs{numberline}. % \begin{macrocode} \def\@chkForNl#1#2\@nil{% check for number line \ifx#1\numberline\let\@nlrtn\relax\else \def\@nlrtn{\numberline{\hfill}}\fi} % \end{macrocode} % \paragraph{Modify \texorpdfstring{\protect\cs{tableofcontents}}{\textbackslash{tableofcontents}}} % \begin{macrocode} \def\mtoc@st@rttoc#1{\begingroup \if@filesw \expandafter\newwrite\csname tf@#1\endcsname \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax \fi\global\@nobreakfalse\endgroup} \let\mtoc@@starttoc\mtoc@One \def\mtoc@start@toc{\let\mtoc@start@next\relax \@ifundefined{aebLastPage} {% \ifx\mtoc@@starttoc\mtoc@One \global\let\mtoc@@starttoc\mtoc@Zero \def\mtoc@start@next{\mtoc@st@rttoc{toc}}\fi \mtoc@start@next }{% \ifnum\aebLastPage<\thepage\relax \def\mtoc@start@next{\mtoc@st@rttoc{toc}}\fi \mtoc@start@next }% } \AtEndDocument{\mtoc@start@toc} % \end{macrocode} % % \paragraph[Modify \texorpdfstring{\protect\cs{addtocontents}} % {\textbackslash{addtocontents}}]{Modify \cs{addtocontents}.} % (\cs{addtocontents\darg{toc}\darg{\ameta{content}}}) If the document author inserts vertical spacing, or % other formatting, that could be problems in the minitoc. So we'll try to remove it. % We begin by placing the second argument \ameta{content} as the argument of a command, % \cs{mtocCL\darg{\ameta{content}}}. Initially, \cs{mtocCL} just passes its argument into the % {\TeX} stream. Later, it will be redefined within \cs{insertminitoc}. % \begin{macrocode} \def\mtoc@TOC{toc} \def\mtocCL#1#2{#1} % \end{macrocode} % (2019/10/06) Fix the \cs{protected@file@percent} problem, the solution continues % into the definition of \cs{addtocontents@mtoc}. % \changes{v1.8}{2019/10/05}{\string\cs{LaTeX}/\string\pkg{hyperref} introduced % \string\cs{protected@file@percent}, which breaks this package. We do a fix.} % \changes{v1.9}{2019/10/06}{Additional fix to \string\cs{protected@file@percent} solution} % \begin{macrocode} \@ifundefined{add@percent@to@temptokena} {\let\protected@file@percent\@empty\def\mtoc@protect{}} {\def\mtoc@protect{\protect}} % \end{macrocode} % Here, we modify the macro \cs{addtocontents} to insert \cs{mtocCL}. % \changes{v1.7}{2018/09/29}{Delay redefinition of \string\cs{addtocontents} until beginning of document, % to avoid incompatibility with \string\pkg{siunitx}.} % \begin{macrocode} \newcommand\addtocontents@mtoc[2]{\bgroup \let\protected@file@percent\@empty \def\mt@rgi{#1}\ifx\mt@rgi\mtoc@TOC \global\advance\@minitocCnt\@ne \mtoc@addtocontents{#1}{\protect \mtocCL{#2}{\the\@minitocCnt}\mtoc@protect \protected@file@percent}\else \mtoc@addtocontents{#1}{#2}\fi\egroup} \AtBeginDocument{\let\mtoc@addtocontents\addtocontents \let\addtocontents\addtocontents@mtoc} % \end{macrocode} % Modify the \cs{tableofcontents} to \cs{mtoc@tableofcontents}. % We compensate later by executing \cs{mtoc@start@toc} at the end of the document. % \begin{macrocode} \def\tableofcontents{% \def\@starttoc##1{\makeatletter \@input{\jobname.##1}\makeatother}% \NoFmtTOCEntry \mtoc@tableofcontents \global\let\@starttoc\mtoc@starttoc} % \end{macrocode} % \leavevmode\DescribeMacro{\mtoc@CL@mtoc}\cs{mtoc@CL@mtoc} is the redefined version of \cs{mtocCL}, as described above. % We attempt to see if the first token of its argument is \cs{contentsline}, if yes % we pass it on, otherwise, we gobble it. % \begin{macrocode} \newcommand{\mtoc@CL@mtoc}[1]{\mtoc@parse#1\@nil} \def\mtoc@parse#1#2\@nil{\ifx#1\contentsline \def\mtoc@next##1{#1#2{##1}}\else \let\mtoc@next\@gobble\fi\mtoc@next} % \end{macrocode} % % \paragraph[Modify \texorpdfstring{\protect\cs{@startsection}}{\textbackslash{@startsection}} and referencing]% % {Modify \texorpdfstring{\protect\cs{@startsection}}{\textbackslash{@startsection}} and referencing.} % We redefine \cs{@startsection} to pick up the first argument (the section name) % and define \cs{@currentsecname}, which is use in a simple cross referencing system % needed for this mini-toc package. This package should be loaded after \pkg{hyperref} for sure. % \begin{macrocode} \let\@startsection@mtoc@SAVE\@startsection \def\@startsection#1{\def\@currentsecname{#1}% \@startsection@mtoc@SAVE{#1}} % \end{macrocode} %\goodbreak\noindent % The use of \DescribeMacro\mtoclabel\cs{mtoclabel} and \DescribeMacro\mtocref % \cs{mtocref} are not needed unless you redefine a section heading to a non-numerical % value. This system needs a section number. % \begin{macrocode} \def\mtoclabel#1{\label{#1}\@bsphack \protected@write\@auxout{}{\string \csarg{\string\gdef}{mtoclbl#1}{\the\@minitocCnt} }% \@esphack } \def\mtocref#1{\@nameuse{mtoclbl#1}} % \end{macrocode} % % \paragraph[\texorpdfstring{\protect\cs{insertminitoc}}{\textbackslash{insertminitoc}}: % The main command]{\protect\cs{insertminitoc}: The main command.} % \DescribeMacro{\insertminitoc}\cs{insertminitoc} is the main user command for this package, it places % a ``minitoc'' for a section (\cs{mtoc@TOPLevel}) of a document, listing only the subsections within that section. % It takes an optional argument for indicating the section number, the subsections of which are to % be displayed. The default is the current section, \texttt{\cs{@nameuse\darg{the\cs{mtoc@TOPLevel}}}}. % \par\medskip\noindent % \DescribeMacro{\if@minitoc} This Boolean is set to true, in a group, when \cs{insertminitoc} is expanded. % This is to support a feature for formatting a mini-toc entry; % \cs{miniorfulltoc} is used for this purpose. \cs{miniorfulltoc} is % inserted in the optional argument of a section command: %\begin{verbatim} % \subsection[\protect % \miniorfulltoc{\textbf}{Subsection Entry}]{Subsection Entry} %\end{verbatim} %\DescribeMacro\miniorfulltoc\hskip-\marginparsep\texttt{\darg{\ameta{fmt}}\darg{\ameta{entry}}} %The first argument of \cs{miniorfulltoc} is passed to the second entry; for example, %|{\textbf{Subsection Entry}}| as an argument and in a group. Thus, the first argument %can be a command with one argument, or a command with not arguments. % \begin{macrocode} \newif\if@minitoc \@minitocfalse \newif\if@MiniTocListings \@MiniTocListingstrue \def\NoFmtTOCEntry{\@minitocfalse} \def\FmtTOCEntry{\@minitoctrue} \def\miniorfulltoc#1#2{\if@minitoc {{#1{#2}}}\else{#2}\fi} % \end{macrocode} % \leavevmode\DescribeMacro\insertminitoc\hskip-\marginparsep\texttt{[\ameta{label-name}]} % After the above preliminaries, we get to \cs{insertminitoc}. % The default value of the optional parameter is |MTOC.\the\@minitocCnt|; thus, we use the most % recent value of \cs{@minitocCnt}. An explicit argument is needed when the mini-toc is placed % somewhere else (after \cs{\@minitocCnt} has been incremented). You can also say % \cs{insertminitoc[\ameta{label-name}]}, where \ameta{label-name} is a label name set by % the \cs{mtoclabel} command. % \begin{macrocode} \newcommand{\insertminitoc}[1][]{% \def\mtoc@rgi{#1}\ifx\mtoc@rgi\@empty \edef\mtoc@rgi{MTOC.\the\@minitocCnt}\else \edef\mtoc@rgi{MTOC.\mtocref{#1}}\fi \ifnum\TOPLevelNum > \BTMLevelNum \PackageError{aeb-minitoc}{% The top level (\mtoc@TOPLevel) must be\MessageBreak must be higher on the hierarchy then at bottom level} {Try switching the two}\fi \begingroup \edef\mtoc@sec{\mtoc@rgi}\mtocs@toks@={}% % \end{macrocode} % \cs{let} \cs{contentsline} to \cs{cl@LOOKFORSEC} % \begin{macrocode} \let\contentsline\cl@LOOKFORSEC % \end{macrocode} % \cs{let} \cs{mtocCL} to \cs{mtoc@CL@mtoc} % \begin{macrocode} \let\mtocCL\mtoc@CL@mtoc \@foundTOPLevelfalse \let\mtoc@numberline\numberline % \end{macrocode} % Insert formatting ($\cs{Pg}=\cs{sl@@sNumFmt}$) for the page number here. % \begin{macrocode} \def\numberline##1{\makebox[\mtoc@numBoxWidth][l]% {\sl@@sNumFmt{##1}}\sl@@EntryFmt}% \makeatletter\InputIfFileExists{\jobname.toc}% {\PackageInfo{aeb-minitoc}{TOC file read}} {\PackageInfo{aeb-minitoc}{TOC file not available}}% \edef\x{\the\mtocs@toks@}\ifx\x\@empty \global\@MiniTocListingsfalse\else \global\@MiniTocListingstrue\fi % \end{macrocode} % \textbf{Insertion point.} This is where the mini-toc entries are entered % into the latex stream to be typeset. % \begin{macrocode} \the\mtocs@toks@\par\makeatother \if@MiniTocListings\else \PackageWarning{aeb-mintoc}{No mini-toc built here}\fi \endgroup } % \end{macrocode} % When the \opt{nominitocs} option is in effect, we \cs{let} the command % \cs{insertminitoc} to \DescribeMacro\insertminitocNOT\cs{insertminitocNOT}, which absorbs all its arguments. % \begin{macrocode} \newcommand{\insertminitocNOT}[1][]{} % \end{macrocode} % \leavevmode\DescribeMacro{\numBoxWidth}\hskip-\marginparsep\texttt{\darg{\ameta{length}}} % The \cs{mtoc@numBoxWidth} determines the width of the \cs{hbox} that contains the section number. % It is conveniently set using \cs{numBoxWidth}. The default declaration is % \cs{numBoxWidth\darg{2.5em}}. The \ameta{length} should be measured in em units. Within % the \env{minitocfmt}, \cs{@W} is \cs{let} to \cs{numBoxWidth}. % \begin{macrocode} \def\numBoxWidth#1{\def\mtoc@numBoxWidth{#1}} \numBoxWidth{2.5em} % \end{macrocode} % In its ``raw'' expansion, \cs{insertminitoc} may not be what you want; in this case, % enclose it in some appropriate environment. % The following is an example of how to use this command. % This can be part of a command that inserts code just after every \cs{section}. %\begin{verbatim} %\begin{center}\minitocFmt %\begin{tabular}{c}\toprule %\begin{minipage}[c]{0.8\linewidth} %\insertminitoc\relax %\end{minipage}\\\bottomrule %\end{tabular} %\end{center} %\end{verbatim} %where \cs{minitocFmt} is a command that expands to some formatting, see demo files. % %\paragraph[The mini-toc format environment: \texttt{minitocfmt}]% % {The mini-toc format environment: \texttt{minitocfmt}.} % To help facilitate designing and declaring the mini-toc format, we define % the \texttt{minitocfmt} environment. The environment defines a command % (\ameta{\cs{cmd}}) that contains all the formatting information for % the mini-toc. The body of the environment consists of a series of % \cs{declaretocfmt\darg{\ameta{toc-fmt}}} declarations. Within argument % of \cs{declaretocfmt}, \cs{@W} is an alias for \cs{numBoxWidth} and % \cs{@D} is an alias for \cs{sl@dots}. If \cs{@D} % appears ($\texttt{@D} = \texttt{@dottedtocline}$, a dotted line is created in the usual % {\LaTeX} manner. \cs{@N} is an alias \cs{sl@sNumFmt} and \cs{@P} is an alias for % \cs{sl@pNumFmt}. All are optional. \def\MP#1{\marginpar{\raggedleft\small\itshape#1}} %\begin{description} % \item[\cs{@A\darg{\ameta{various}}}]\hskip-.5em\relax\space is a command that is not used very % often, but is available when needed. The argument \ameta{various} is % various commands to support the min-toc being generated. %\begin{description} % \item[\cs{@PW\darg{\ameta{length}}}] Within\MP{pg num box width} the argument of % \cs{@A}, insert \cs{@PW\darg{\ameta{length}}} to set % the width of the box that contains the page number % (\cs{@pnumwidth}). The value set by {\LaTeX} is % \texttt{1.55em}. % \item[\cs{@DS\darg{\ameta{num}}}] The \ameta{num}\MP{dots separation} determines the % separation between dots for a TOC entry that uses a dotted rule % line. This command is only recognized within the argument of % \cs{@A}. The default is 4.5. % \item[\cs{@R\darg{\ameta{length}}}]\hskip-.5em\relax\space is a\MP{right margin of title} % convenience command, it takes its argument and defines the % {\LaTeX} command \cs{@tocrmarg}, which sets the right margin % for the sec-title. The length set by {\LaTeX} is % \texttt{2.55em}. The \ameta{length} of \cs{@R} should be \emph{larger % than} the \ameta{length} set by \cs{@PW}. %\end{description} % % \item[\cs{declaretocfmt\darg{\ameta{sec-name}}\darg{\ameta{various}}}]\hskip-.5em\relax\space % formats all \ameta{sec-name} (section, subsection, etc.) entries. % % A `typical' table of contents entry has the form: %\begin{quote}\ttfamily %\ameta{sec-num} \ameta{title-heading}\dotfill\ameta{pg-num} %\end{quote} %Within the \ameta{various} argument, there are a number of commands that %are recognized: %\begin{description} % \item[\cs{@W\darg{\ameta{length}}}]\hskip-.5em\relax\space is\MP{sec % num box width} the width of the box that encloses % \ameta{sec-num}. Normally, all lengths are measured in % \texttt{em} units (\cs{@W\darg{\ameta{num}em}}). The default % length is \texttt{2.5em} % \item[\cs{@D\darg{\ameta{length}}}]\hskip-.5em\relax\space is\MP{use dots} the % amount to indent prior to \ameta{sec-num}. Again, \texttt{em} % units preferred (\cs{@D\darg{\ameta{num}em}}). When the \cs{@D} % command is present in the argument, a dotted line is % to be used for the entry (this is the norm). If \cs{@D} not % present, there is an opportunity within the \ameta{various} % argument to create a custom entry. % \item[\cs{@B\darg{\ameta{length}}}] Same as \cs{@D}\MP{no dots}, but no dotted leaders are created. % \item[\cs{@N\darg{\ameta{fmt}}}]\hskip-.5em\relax\space is\MP{fmt sec num} the % formatting for \ameta{sec-num}. You can pass a command with one % argument that will operate on the section number; for example, % \cs{@N\darg{\cs{textbf}}}, \cs{@N\darg{\cs{color\darg{blue}}}}, % or \cs{@N\darg{\cs{color\darg{blue}}\cs{textbf}}}. Note that % changing the style to bold might require a corresponding change % in \cs{@W}. % \item[\cs{@F\darg{\ameta{fmt}}}]\hskip-.5em\relax\space is\MP{fmt title} the formatting % for the title heading of the current section; for example, \cs{@F\darg{\string\bfseries}} % turns all heading, for this \ameta{sec-name}, bold. % \item[\cs{@P\darg{\ameta{fmt}}}]\hskip-.5em\relax\space is the\MP{fmt pg num} % formatting for the page number (\ameta{pg-num}). You can pass a % command with one argument that will operate on the page number % When \pkg{hyperref} is loaded with the \opt{colorlinks} option, % we cannot change the color of the page number (see the discussion % of \cs{@A} above), but \cs{@P\darg{\string\textit}} changes the % numbers to italics. If \pkg{hyperref} is not loaded, % \cs{@P\darg{\string\color\darg{red}\string\textit}} changes page % numbers to a red italic. % \item[\cs{@R\darg{\ameta{length}}}]\hskip-.5em\relax\space is\MP{right margin of title} a convenience % command, it takes its argument and defines the {\LaTeX} command % \cs{@tocrmarg}, which sets the right margin for the sec-title. % The length set by {\LaTeX} is \texttt{2.55em}. Setting \cs{@R} % within the \ameta{various} argument of \cs{declaretocfmt} affects % the current section level as well as all lower section levels. If % you want to make this `local' change, you need to put \cs{@R} % back to its default of \texttt{2.55em} locally for other % declarations. % \item[\cs{@E}] Within\MP{TOC number} the \env{minitocfmt} environment, the command % \cs{@E} expands to the current TOC entry number of the TOC entry % being read in. % \item[\cs{@L}] This\MP{link anchor} macro expands to the \pkg{hyperref} anchor of the % page entry reference, it is empty if \pkg{hyperref} is not % loaded. % \item[\cs{@Pg}] This\MP{pg number} macro expands to the page number this entry % references. %\end{description} %\end{description} % Usually, the \ameta{length} argument is measured in \texttt{em} units (\texttt{\ameta{num}em}). % \begin{macrocode} \newtoks\mtoc@toks \newtoks\mtocs@toks@ % \end{macrocode} % Within the \env{minitocfmt}, \cs{@D} is \cs{let} to \cs{sl@dots}. % \begin{macrocode} \def\sl@dots#1{\def\sl@@dots{% \@dottedtocline{\sl@current}{#1}{\mtoc@numBoxWidth}}} \let\sl@@dots\@gobble \def\sl@nodots#1{\def\sl@@dots{% \no@dottedtocline{\sl@current}{#1}{\mtoc@numBoxWidth}}} \let\sl@@nodots\@gobble % \end{macrocode} % Within the \env{minitocfmt}, \cs{@F} is \cs{let} to \cs{\sl@EntryFmt}. % \begin{macrocode} \def\sl@EntryFmt#1{\def\sl@@EntryFmt{#1}} % dps \let\sl@@EntryFmt\relax % dps % \end{macrocode} % Within the \env{minitocfmt}, \cs{@N} is \cs{let} to \cs{sl@sNumFmt}. % \begin{macrocode} \def\sl@sNumFmt#1{\def\sl@@sNumFmt{#1}} \let\sl@@sNumFmt\relax % \end{macrocode} % Within the \env{minitocfmt}, \cs{@P} is \cs{let} to \cs{sl@pNumFmt}. % \begin{macrocode} \def\sl@pNumFmt#1{\def\sl@@pNumFmt{#1}} \let\sl@@pNumFmt\relax \def\sl@tocrmarg#1{\def\@tocrmarg{#1}} \def\sl@dotsep#1{\def\@dotsep{#1}} \def\mtoc@star#1*#2\@nil{\def\@rgii{#2}\ifx\@rgii\@empty \let\mtoc@@star\mtoc@Zero\else\let\mtoc@@star\mtoc@One\fi} % \end{macrocode} % \subparagraph[The \texorpdfstring{\protect\cs{declaretocfmt}}{\textbackslash{declaretocfmt}} command defined]% % {The \texorpdfstring{\protect\cs{declaretocfmt}}{\textbackslash{declaretocfmt}} command defined.} % The \cs{declaretocfmt} is used to designed how a mini-toc entry is displayed. % % \begin{macro}{\declaretocfmt}\hskip-\marginparsep\texttt{\darg{\ameta{sec-name}}\darg{\ameta{various}}} % The \pkg{aeb-mintoc} way of declaring the formatting for a toc \ameta{sec-name} entry. The % \ameta{various} argument consists of various combinations of \cs{@W}, \cs{@D}, \cs{@N}, and \cs{@P}. % \begin{macrocode} \long\def\declaretocfmt#1#2{% \xdef\sl@current{\@nameuse{sl@#1}}% \global\@namedef{\mtoc@CmdName @l@#1}##1##2{% \normalfont\normalcolor\let\@E\TOCEntryNum \let\@L\mtoc@HY@anchor\let\@Pg\mtoc@PgNum \let\sl@@dots\@empty\let\sl@@sNumFmt\relax \let\sl@@pNumFmt\relax\let\sl@@EntryFmt\relax \let\@W\numBoxWidth\let\@R\sl@tocrmarg\let\@D\sl@dots \let\@B\sl@nodots\let\@F\sl@EntryFmt\let\@N\sl@sNumFmt \let\@P\sl@pNumFmt #2\ifx\sl@@dots\@empty\let\sl@next\relax\else \mtoc@star#1*\@nil % dps \ifx\mtoc@@star\mtoc@Zero \def\sl@next{\sl@@dots{##1}{\sl@@pNumFmt{##2}}}\else \def\sl@next{\sl@@dots{\sl@@EntryFmt##1}{\sl@@pNumFmt{##2}}}\fi \fi\sl@next}% \edef\x{\expandafter\noexpand\csname l@#1\endcsname}% \edef\y{\expandafter\noexpand\csname\mtoc@CmdName @l@#1\endcsname}% \edef\mtoc@@tmp{\the\mtoc@toks\let\expandafter\noexpand\x= \expandafter\noexpand\y} \global\mtoc@toks=\expandafter{\mtoc@@tmp}} \def\mtoc@getCmdName#1{\edef\mtoc@CmdName{\expandafter \@gobble\string#1}} % \end{macrocode} % \end{macro} % % \subparagraph[The \texttt{minitocfmt} environment defined]% % {The \texttt{minitocfmt} environment defined.} Is a `simplified' way of % designing toc entries. % \begin{environment}{minitocfmt}\hskip-\marginparsep\texttt{\darg{\cs{\ameta{cmdName}}}} % The definition of the environment. The argument is a command that will hold the expanded % content of the environment. The body of the environment consists of one or more % \cs{declaretocfmt} commands. % \begin{macrocode} \newenvironment{minitocfmt}[1]{\makeatletter \gdef\@mtoc@cmd@@{#1}\let\@A\mtoc@addto % \end{macrocode} % The \cs{mtoc@getCmdName} returns the \texttt{cmdName} (without backslash). \texttt{cmdName} % is used the creating command sequences, using to this definition. % \begin{macrocode} \mtoc@getCmdName{#1}\mtoc@toks={\let\@PW\mtoc@PW\let\@DS\sl@dotsep \let\@R\sl@tocrmarg}% % \end{macrocode} % The body of the environment consists of one or more \cs{declaretocfmt} commands, these % commands contribute to \cs{mtoc@toks}. \cs{mtoc@toks} consists of all the formatting % declarations requested. % \begin{macrocode} }{\expandafter\xdef\@mtoc@cmd@@{\the\mtoc@toks}} % \end{macrocode} % \end{environment} % \leavevmode\DescribeMacro\mtoc@addto is a macro to add to the declarations. Within % \env{minitocfmt} is \cs{@A} is \cs{let} to \cs{mtoc@addto}. % \begin{macrocode} \def\mtoc@addto#1{\edef\mtoc@@tmp{\the\mtoc@toks}% \global\mtoc@toks=\expandafter{\mtoc@@tmp #1}} \def\mtoc@PW#1{\def\@pnumwidth{#1}} % \end{macrocode} % Here is code from \texttt{latex.ltx} for \cs{@dottedtocline}, we modify it so there % are no leaders. % \begin{macrocode} \def\no@dottedtocline#1#2#3#4#5{% \ifnum #1>\c@tocdepth \else \vskip \z@ \@plus.2\p@ {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip \parindent #2\relax\@afterindenttrue \interlinepenalty\@M \leavevmode \@tempdima #3\relax \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip {#4}\nobreak % \leaders\hbox{$\m@th % \mkern \@dotsep mu\hbox{.}\mkern \@dotsep % mu$}\hfill % Insert an \hfill \hfill \nobreak \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}% \par}% \fi} % \end{macrocode} % \begin{macrocode} % % \end{macrocode} %\Finale