%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% % This is file 'ltxtools-index.sty', version 0.0.1, December 2011. % % % % This package and accompanying files may be distributed and/or % % modified under the conditions of the LaTeX Project Public License, % % either version 1.3 of this license or any later version. The latest % % version of this license is in http://www.latex-project.org/lppl.txt % % and version 1.3 or later is part of all distributions of LaTeX % % version 2005/12/01 or later. % % % % The LPPL maintenance status of this software is 'author-maintained'. % % % % This software is provided 'as it is', without warranty of any kind, % % either expressed or implied, including, but not limited to, the % % implied warranties of merchantability and fitness for a particular % % purpose. % % % % Copyright (c) 2011 Ahmed Musa (amusa22@gmail.com). % %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% \@ifpackageloaded{ltxtools}{% \@ifpackagelater{ltxtools}{2011/12/12}{}{% \@latex@error{Loaded version of ltxtools package is not current}\@ehc }% }{% \RequirePackage{ltxtools}[2011/12/12]% } \UseNormalCatcodes \StyleFilePurpose{Macros and interfaces for index-related tasks (AM)} \StyleFileRCSInfo $Id: ltxtools-index.sty,v 0.0.1 2011/12/12 09:00:00 Ahmed Musa Exp $ \ProvidesPackage{ltxtools-index}[\StyleFileInfo] \NeedsTeXFormat{LaTeX2e}[2011/06/27] \loadifnotloaded{ltxtools-doc}[2011/12/12] \cptloadpackages{% ltxkeys||2011/12/12; xcolor|table,dvipsnames,hyperref|2007/01/21; } \ltsprovidecolorset[x](1){% green,0.00,0.59,0.00;brown,0.50,0.25,0.00; teal,0.00,0.82,0.82;magenta,0.44,0.00,0.87; purple,0.50,0.00,0.25 } \cptnewvariables{if}[LTS@]{mainidx,noidx} \ltxkeys@declarekeys*(cmd)[LTS]{ltxtools-index}[LTS@]{% stylecolor/xgreen1; cmdcolor/xmagenta1; speccolor/xteal1; texcolor/Maroon; macrocolor/blue; examplecolor/teal; } \ltxkeys@declarekeys*(bool)[LTS]{ltxtools-index}[LTS@]{% fancypages/true; } \ltxkeys@declareoption*{% \ltxkeys@getpvalnopad \ltxmsg@warn{Unknown option '\CurrentKey' with value '\InnocentVal' ignored}% } %\ltxkeys@executeoptions[LTS]{}\relax \ltxkeys@processoptions*[LTS]\relax \ltsAtBeginDocument{% \ltscolorlet{ltsmacrocolor}{\LTS@macrocolor}% \ltscolorlet{ltsspeccolor}{\LTS@speccolor}% \ltscolorlet{ltstexcolor}{\LTS@texcolor}% \ltscolorlet{ltscmdcolor}{\LTS@cmdcolor}% \ltscolorlet{ltsstylecolor}{\LTS@stylecolor}% \ltscolorlet{ltsdoccolor}{black}% } \robust@def*\ltsdonotindex#1{% \cptexpandarg{\ltsfiltermergecsv\LTS@donotindex@hook} {\detokenize{#1}}\nofilter } \ltsdonotindex{\begingroup,\endgroup,\bgroup,\egroup} \ltsdonotindex{\def,\edef,\xdef,\global,\long,\let,\newcommand} \ltsdonotindex{\expandafter,\noexpand,\unexpanded,\string,\csname} \ltsdonotindex{\if,\ifcase,\else,\fi,\or,\relax,\iftrue,\iffalse} \ltsdonotindex{draft,final,true,false} \robust@def*\ltsdollar{\ifmmode\mathdollar\else\texttt{\char`\$}\fi} \robust@def*\ltsleftbrace{\ifmmode\lbrace\else\texttt{\char`\{}\fi} \robust@def*\ltsrightbrace{\ifmmode\rbrace\else\texttt{\char`\}}\fi} \robust@def*\ltsunderscore{% \ifmmode\nfss@text{\textunderscore}\else\texttt{\char`\_}\fi } \robust@def*\ltstypeset{% \begingroup\LTS@sanitize\LTS@testcl\LTS@typeset } \robust@def*\LTS@typeset#1#2{% \edef\LTS@tempa{\detokenize{#2}}% \ifLTS@cl \edef\LTS@tempa{\s@expandarg\cptzapspaces\LTS@tempa}% \else \despacecontent\LTS@tempa \fi \texttt{\textcolor{#1}{\expandcsonce\LTS@tempa}}% \endgroup } \robust@def*\ltscmdtypeset{% \begingroup \LTS@sanitize\LTS@testcl\LTS@cmdtypeset } \robust@def*\LTS@cmdtypeset#1{% \edef\reserved@a{\ifLTS@cl!\fi}% \expandafter\endgroup\expandafter \ltstypeset\reserved@a{ltscmdcolor}{#1}% } \robust@def*\ltscmdfamily{\color{ltscmdcolor}\ttfamily} \robust@def*\ltscmdtext{\begingroup\LTS@sanitize\LTS@cmdtext} \robust@def*\LTS@cmdtext#1{\endgroup\textcolor{ltscmdcolor}{\texttt{#1}}} \new@def*\ltsheadquoted#1{\ltsneverexpand{\quoted{#1}}} \new@def*\ltsheadfx#1{\ltsneverexpand{\ltsfx{#1}}} \new@def*\ltsheadhx#1{\ltsneverexpand{\ltshx{#1}}} \new@def*\quotedfxx#1{{\NoWrapQuotes\quoted{\ftfxx{#1}}}}% \quotedFx \new@def*\quotedfx{% \begingroup \@makeother{\#}\LTS@quotedfx } \new@def*\LTS@quotedfx#1{% \NoWrapQuotes\quoted{\ltsftfx{#1}}% \endgroup } \new@def*\quotedhx{% \begingroup \@makeother{\#}\LTS@quotedhx } \new@def*\LTS@quotedhx#1{% \NoWrapQuotes\quoted{\ltsfthx{#1}}% \endgroup } \robust@def*\ltsfx{% \def\LTS@currcolor{ltscmdcolor}% \begingroup \LTS@sanitize\LTS@teststcl\LTS@fx } \robust@def\LTS@fx#1{% \edef\LTS@tempb{\detokenize{#1}}% \ifLTS@cl \let\LTS@tempa\cptzapspaces \else \ifLTS@st \let\LTS@tempa\cptzapspaces \else \let\LTS@tempa\cpttrimspace \fi \fi \cptexpanded{% \noexpand\textcolor{\LTS@currcolor}% {\noexpand\texttt{\s@expandarg\LTS@tempa\LTS@tempb}}% }% \endgroup } \robust@def*\ampfx#1#{% \def\LTS@currcolor{ltscmdcolor}% \amp@fx{#1}% } \robust@def\amp@fx#1#2{% \begingroup \edef\LTS@tempb{\detokenize{#2}}% \def\test##1##2{\ifinsetTF{##2}{##1}}% \cptifcasse\test{#1} {!}{\let\LTS@tempa\cptzapspaces} {*}{\let\LTS@tempa\cptzapspaces} \elseif \let\LTS@tempa\cpttrimspace \endif \cptexpanded{% \noexpand\textcolor{\LTS@currcolor}% {\noexpand\texttt{\s@expandarg\LTS@tempa\LTS@tempb}}% }% \endgroup } \robust@def*\ltsftfx{% \@tempswatrue \def\LTS@currcolor{ltscmdcolor}% \LTS@teststcl\LTS@footfx } \robust@def*\ltsfthx{% \@tempswatrue \def\LTS@currcolor{ltstexcolor}% \LTS@teststcl\LTS@footfx } \robust@def*\ltsftfxx{% \@tempswafalse \def\LTS@currcolor{ltscmdcolor}% \LTS@teststcl\LTS@footfx } \robust@def*\LTS@footfx#1{% \edef\LTS@tempb{\detokenize{#1}}% \ifLTS@cl \let\LTS@tempa\cptzapspaces \else \ifLTS@st \let\LTS@tempa\cptzapspaces \else \let\LTS@tempa\cpttrimspace \if@tempswa \LTS@footfxparse\LTS@tempb \fi \fi \fi \cptexpanded{% \noexpand\textcolor{\LTS@currcolor}% {\noexpand\texttt{\s@expandarg\LTS@tempa\LTS@tempb}}% }% } \robust@def*\LTS@footfxparse#1{% \begingroup \s@expandarg\cpt@pophash#1#1% \LTS@putspaceafter#1\cpt@leftbracechar \edef\x##1{##1\expandcsonce{#1}\@space\LTS@nil}% \edef\y##1{\def##1####1\@space####2\LTS@nil}% \y\y{% \ifblankTF{##2}{% \toks@\expandafter{\the\toks@##1}% }{% \if\@backslashchar\cpt@car##1x\car@nil \toks@\expandafter{\the\toks@##1}% \else \ltsgetlasttsv{##1}% \if\last\cpt@leftbracechar \toks@\expandafter{\the\toks@##1}% \else \cptexpanded{\toks@{\the\toks@\unexpanded{##1}\@space}}% \fi \fi \y##2\LTS@nil }% }% \x{\toks@{}\y}% \edef#1{\the\toks@}% \postgroupdef#1\endgroup } \robust@def\LTS@putspaceafter#1#2{% \begingroup \toks@{}% \xifinsetTF{#2}{\detokenize\expandafter{#1}}{% \edef\x##1{##1\detokenize\expandafter{#1}#2\LTS@nil}% \edef\y##1{\def##1####1#2####2\LTS@nil}% \y\y{% \ifblankTF{##2}{% \toks@\expandafter{\the\toks@##1}% }{% \cptexpanded{\toks@{\the\toks@##1#2\@space}}% \y##2\LTS@nil }% }% \x{\toks@{}\y}% }{% \toks@\expandafter{\detokenize\expandafter{#1}}% }% \edef#1{\the\toks@}% \postgroupdef#1\endgroup } \robust@def*\ltsifcsvfinal{% \ifnum\indrisnr>\@ne \iflastindris \ifLTS@pm\@space and\else,\fi\@space \else ,\@space \fi \fi } \robust@def*\ltsffx{% \LTS@teststclpm{% \def\LTS@currcolor{ltscmdcolor}% \begingroup\LTS@sanitize\expandafter\endgroup\LTS@ffx }% } \robust@def*\LTS@ffx#1{% \def\do##1{% \ltsifcsvfinal \edef\LTS@tempa{\s@expandarg\cpttrimspace{\detokenize{##1}}}% \texttt{\textcolor{\LTS@currcolor}{\LTS@tempa}}% }% \indrisloop{#1}\do } \robust@def*\ltsftffx{% \LTS@teststclpm{% \def\LTS@currcolor{ltscmdcolor}% \LTS@ftffx }% } \robust@def*\ltsfthhx{% \LTS@teststclpm{% \def\LTS@currcolor{ltstexcolor}% \LTS@ftffx }% } \robust@def*\LTS@ftffx#1{% \edef\LTS@tempa{\detokenize{#1}}% \s@expandarg\cpt@pophash\LTS@tempa\LTS@tempa \expandafter\LTS@ffx\expandafter{\LTS@tempa}% } \robust@def*\ltshx{% \def\LTS@currcolor{ltstexcolor}% \begingroup\LTS@sanitize\LTS@teststclpm\LTS@fx } \robust@def*\ltshhx{% \LTS@teststclpm{% \def\LTS@currcolor{ltstexcolor}% \begingroup\LTS@sanitize\expandafter\endgroup\LTS@ffx }% } % Indexing command syntax: % * (star) -> print #1 only in index, else print also at place of call. % ' (prime) -> zap spaces, else trim spaces. \robust@def*\LTS@fxidx#1#2#3{% \usename{LTS@mainidx#1}% \let\LTS@texttt\texttt \def\LTS@currcolor{#2}% \LTS@teststclpm{\begingroup\LTS@sanitize\usename{LTS@fxi@#3}}% } \robust@def*\ltsfxim{\LTS@fxidx{true}{ltscmdcolor}{a}} \newletcs\ltsffxim\ltsfxim \robust@def*\ltsfxi{\LTS@fxidx{false}{ltscmdcolor}{a}} \newletcs\ltsffxi\ltsfxi \robust@def*\ltsfxis{\LTS@fxidx{false}{ltscmdcolor}{b}} \robust@def*\ltshxim{\LTS@fxidx{true}{ltstexcolor}{a}} \robust@def*\ltshxi{\LTS@fxidx{false}{ltstexcolor}{a}} \robust@def*\ltshxis{\LTS@fxidx{false}{ltstexcolor}{b}} \robust@def*\LTS@zaportrim#1{% \begingroup \edef\x##1{##1{\detokenize{#1}}}% \xdef\zaportrim@res{% \ifboolTF{LTS@cl}{\x\cptzapspaces}{\x\cpttrimspace}% }% \endgroup } \robust@def*\LTS@fxi@a#1{\LTS@fxi@b{#1}{}} \robust@def*\LTS@fxi@b#1#2{% \endgroup \edef\LTS@tempb{\s@expandarg\cpttrimspace{\detokenize{#2}}}% \def\do##1{% \LTS@zaportrim{##1}% \ifLTS@st\else \ltsifcsvfinal \cptexpandsecond\textcolor {{\LTS@currcolor}{\LTS@texttt{\zaportrim@res}}}% \fi \cptexpanded{\LTS@indexentry{}{\zaportrim@res}{\LTS@tempb}}% }% \indrisloop{#1}\do } \robust@def*\ltsdummyfxim{\LTS@teststclpm\LTS@dummyfxi} \robust@def*\ltsdummyfxi{\LTS@teststclpm\LTS@dummyfxi} \robust@def*\LTS@dummyfxi#1{} \robust@def*\LTS@aidx#1#2#3{% \usename{LTS@mainidx#1}% \let\LTS@texttt\@iden \def\LTS@currcolor{#2}% \LTS@teststclpm{% \begingroup \LTS@sanitize \usename{LTS@fxi@#3}% }% } \robust@def*\ltsaidx{\LTS@aidx{false}{ltsdoccolor}{a}} \robust@def*\ltsaidxm{\LTS@aidx{true}{ltsdoccolor}{a}} % Index entries with |see reference ('s' refers to 'see'); % 'm' -> main (with \underbar): \robust@def*\ltsaidxs{\LTS@aidx{false}{ltsdoccolor}{b}} \robust@def*\ltsbidx{\LTS@aidx{false}{ltsspeccolor}{a}} \robust@def*\ltsbidxm{\LTS@aidx{true}{ltsspeccolor}{a}} \robust@def*\ltsbidxs{\LTS@aidx{false}{ltsspeccolor}{b}} % Italicize or apply something to the first word. % Because of the need to sort the entries, it is usually % more difficult to apply something to the first word. % Eg, \ltsaiidxs[\emph,Choice keys]{nominations xxx \emph{yyy}}{zzz} \robust@def*\ltsaiidx{\LTS@aiidx{false}{ltsdoccolor}{a}} \robust@def*\ltsaiidxm{\LTS@aiidx{true}{ltsdoccolor}{a}} \robust@def*\ltsaiidxs{\LTS@aiidx{false}{ltsdoccolor}{b}} \robust@def*\LTS@aiidx#1#2#3{% \usename{LTS@mainidx#1}% \def\LTS@currcolor{#2}% \LTS@teststclpm{\cpt@testopt{\usename{LTS@fxii@#3}}{}}% } \robust@def*\LTS@fxii@a[#1]#2{\LTS@fxii@b[#1]{#2}{}} \robust@def*\LTS@fxii@b[#1]#2#3{% \begingroup \def\reserved@a##1,##2,##3\LTS@nil{% \def\format{##1}\def\mainentry{##2}% }% \reserved@a#1,,\LTS@nil \def\getfirstword##1 ##2\LTS@nil{% \def\firstword{##1}\def\rmwords{##2}% }% \edef\LTS@tempb{\cpttrimspace{#3}}% \def\do##1{% \edef\LTS@tempc{\cpttrimspace{##1}}% \cptthreexp\getfirstword\expandafter\LTS@tempc\@space\LTS@nil \ifLTS@st\else \ltsifcsvfinal \cptexpandsecond\textcolor{{\LTS@currcolor}{\LTS@tempc}}% \fi \cptexpanded{\LTS@iindexentry{\mainentry}{\LTS@tempc}{\LTS@tempb}}% }% \indrisloop{#2}\do \endgroup } \robust@def*\ltsfiles{\LTS@files@a{false}{b}} \newletcs\ltsfile\ltsfiles \robust@def*\ltsfilesm{\LTS@files@a{true}{b}} \robust@def*\ltsfiless{\LTS@files@a{false}{c}} \robust@def*\LTS@files@a#1#2{% \usename{LTS@mainidx#1}% \LTS@teststclpm{% \begingroup \LTS@sanitize \cpt@testopt{\usename{LTS@files@#2}}{tex}% }% } \robust@def*\LTS@files@b[#1]#2{\LTS@files@c[#1]{#2}{}} \robust@def*\LTS@files@c[#1]#2#3{% \endgroup \def\LTS@currcolor{ltsstylecolor}% \edef\LTS@tempb{\s@expandarg\cptzapspaces{\detokenize{#1}}}% \edef\LTS@tempa{\s@expandarg\cptzapspaces{\detokenize{#2}}}% \def\do##1{% \ifLTS@st\else \ltsifcsvfinal \cptexpanded{\ltstypeset{ltsstylecolor}{##1.\LTS@tempb}}% \fi \cptexpanded{\LTS@indexentry{Files}{##1.\LTS@tempb}{#3}}% }% \indrisloop*\LTS@tempa\do } \robust@def*\ltsemphlist{% \LTS@teststpm{\begingroup\LTS@sanitize\LTS@emph\emph}% } \robust@def*\ltsquotedlist{% \LTS@teststpm{\begingroup\LTS@sanitize\LTS@emph\quoted}% } \robust@def*\LTS@emph#1#2{% \xdef\@gtempa{\ifLTS@st*\fi}% \endgroup \def\do##1{% \ltsifcsvfinal \edef\LTS@tempa{\s@expandarg\cpttrimspace{##1}}% #1{\LTS@tempa}% }% \expandafter\indrisloop\@gtempa{#2}\do } \new@def*\ltsheadpkg#1{\ltsneverexpand{\ltspkg{#1}}} \robust@def*\ltspkgnoidx{% \LTS@mainidxfalse\LTS@noidxtrue \LTS@teststclpm\LTS@pkg@a } \newletcs\ltspkgg=\ltspkgnoidx \robust@def*\ltspkg{% \LTS@mainidxfalse\LTS@noidxfalse \LTS@teststclpm\LTS@pkg@a } \robust@def*\ltspkgm{% |underbar \LTS@mainidxtrue\LTS@noidxfalse \LTS@teststclpm\LTS@pkg@a } \robust@def*\ltspkgs{% |see \LTS@mainidxfalse\LTS@noidxfalse \LTS@teststclpm\LTS@pkg@b } \robust@def*\LTS@pkg@a#1{\LTS@pkg@b{#1}{}} \robust@def*\LTS@pkg@b#1#2{% \edef\LTS@tempa{\s@expandarg\cptzapspaces{\detokenize{#1}}}% \edef\LTS@tempb{\s@expandarg\cptzapspaces{\detokenize{#2}}}% \def\LTS@currcolor{ltsstylecolor}% \def\do##1{% \ifLTS@st\else \ltsifcsvfinal \textcolor{ltsstylecolor}{\texttt{##1}}% \fi \ifLTS@noidx\else \cptexpanded{\LTS@indexentry{Packages}{##1}{\LTS@tempb}}% \fi \let\LTS@tempc\indrisnr }% \indrisloop*\LTS@tempa\do \ifLTS@st\else \ifLTS@pm\@space package\ifnum\LTS@tempc>1 s\fi\fi \fi } \robust@def*\LTS@indremovescape#1{% \ifblankTF{#1}{\cpt@isblankerr\LTS@indremovescape}{}% \let\LTS@putbs\cptswfalse \edef\LTS@tempa{\s@expandarg\cpttrimspace{\detokenize{#1}}}% \if\@backslashchar\expandafter\LTS@car\LTS@tempa x\car@nil \let\LTS@putbs\cptswtrue \edef\LTS@remscape@res{\expandafter\@gobble\LTS@tempa}% \else \let\LTS@remscape@res\LTS@tempa \fi } \robust@def*\ifindexthis#1{% \LTS@indremovescape{#1}% \xifinsetTF{,\cptoxdetok\LTS@tempa,}{,\LTS@donotindex@hook,}% \@gobble\@iden } \robust@def*\LTS@decidebackslash#1{% \if\LTS@putbs \def#1{\texttt{\symbol{'134}}}% \else \def#1{}% \fi } \ifcsdefinable\LTS@currcolor\relax \AfterStartOfDocument{% \newletcs\LTS@indexcmd\index } \robust@def*\LTS@indexentry#1#2#3{% \begingroup \ifindexthis{#2}{% \let\idxitem@a\LTS@remscape@res \ifLTS@mainidx \ifblankTF{#3}{}{% \ltxmsg@err{Main index entry can't have '|see'}\@ehc }% \fi \ifboolTF{LTS@cl}\LTS@detok@zap\despacecontent\idxitem@a \LTS@decidebackslash\idxbs@a \ifblankTF{#3}{}{% \LTS@indremovescape{#3}% \let\idxitem@b\LTS@remscape@res \LTS@decidebackslash\idxbs@b }% \let\x\noexpand \cptexpanded{% \x\LTS@indexcmd{\ifblankTF{#1}{}{#1>}% \idxitem@a=\x\textcolor{\LTS@currcolor}% {\x\texttt{\idxbs@a\idxitem@a}}% \ifLTS@mainidx|underbar\fi \ifblankTF{#3}{}{% |see{\x\texttt{\x\textcolor{\LTS@currcolor}% {\idxbs@b\idxitem@b}}}% }% }% }% }% \endgroup } \robust@def*\LTS@iindexentry#1#2#3{% \ifindexthis{#2}{% \cptexpanded{% \noexpand\LTS@indexcmd{% \ifblankTF{#1}{}{#1>}% #2=\noexpand\textcolor{\LTS@currcolor}{% \format{\firstword}% \ifx\rmwords\@empty\else\@space\rmwords\fi }% \ifLTS@mainidx|underbar\fi \ifblankTF{#3}{}{% |see{\noexpand\textcolor{\LTS@currcolor}{#3}}% }% }% }% }% } \robust@def*\LTS@helv{\fontfamily{phv}\selectfont\color{blue}} \robust@def\ltsindexpreamble#1{\long\def\LTS@idxpreamble{#1}} \cptemptify\LTS@idxpreamble \robust@def*\ltsindexpreambleformat#1{\long\def\LTS@idxpreamblefmt{#1}} \newletcs\LTS@idxpreamblefmt\relax \cptnewvariables{count}{ltsindexcolumns}[2] \AfterStartOfDocument{% \renewenvironment{theindex}{% \begin{multicols}{\ltsindexcolumns}% [\vspace{2\baselineskip}\centerline{\indexname}% \LTS@idxpreamblefmt\LTS@idxpreamble][5\baselineskip]% \addcontentsline{toc}{section}{Index}% \ifLTS@fancypages\pagestyle{fancyplain}\fi \def\indexspace{\endgraf\vskip5\p@\@plus\p@\@minus\p@}% \def\@idxitem{% \endgraf\vskip-.5\baselineskip\@plus\p@\@minus\p@ \hangindent40\p@ }% \patchcs\endtrivlist{% \if@newlist \@noitemerr \global\@newlistfalse \fi }{% \if@newlist \ltxmsg@warn{Nested center environment possibly occurred\on@line}% \global\@newlistfalse \fi }{}{}% \let\item\@idxitem \small }{% \end{multicols}% \@ignoretrue }% } \endinput