%% %% This file was generated by the docstrip utility from varindex.dtx. %% You may distribute this file only together with the source varindex.dtx %% (and if possible with varindex.ins) and only if these files are unmodified. %% %% Author: %% %% M. V\"ath martin@mvath.de %% \ifx\typeout\undefined \def\vx@tmp{\immediate\write17} \else \let\vx@tmp\typeout \fi\vx@tmp{varindex.sty by M. Vaeth: Release 2.3} \ifx\ProvidesPackage\undefined\else \ProvidesPackage{varindex}[2001/05/06 v2.3] \fi \ifx\RequirePackage\undefined \ifx\toolboxDef\undefined \input toolbox.sty \fi \ifx\toolboxNewifFalse\undefined \errmessage{varindex.sty requires toolbox.sty version 3.1 or higher} \fi \else \RequirePackage{toolbox}[2001/05/06] \fi %% %% The file starts with the documented (sample) macros with their "sub"macros: %% \ifx\newcommand\undefined\else \newcommand{\varindextwoScan}{} \newcommand{\varindextwo}{} \newcommand{\vxtAddmyStar}{} \newcommand{\vxtMakemyFormat}{} \fi \def\varindextwoScan{% \varindexNewFlag _\vxtSpaceA \varindexNewFlag -\vxtDashA \varindexNewFlag .\vxtDotA \varindexNewFlag <\vxtOmitA \varindexNewFlag /\vxtNoTildeA \varindexNewFlag `\vxtNopropA \varindexNewFlag P\vxtNopropA% Now obsolete; only for backward compatibility \varindexNewFlag ^\vxtBreakifyA \varindexNewFlag ,\vxtCommaB \varindexNewFlag ~\vxtSpaceB \varindexNewFlag +\vxtDashB \varindexNewFlag ;\vxtDotB \varindexNewFlag >\vxtOmitB \varindexNewFlag !\vxtTildeB \varindexNewFlag ?\vxtNoTildeB \varindexNewFlag p\vxtNopropB% Now obsolete; only for backward compatibility \varindexNewFlag '\vxtNopropB \varindexNewFlag =\vxtDashifyB \varindexNewFlag :\vxtOmitifyB \varindexMakeSplitExpand{+}{vxtSplitAtMagic}% + is the magic symbol } \def\varindextwo{% \let\vxtStarFormat\undefined \def\vxtexecute{\let\vxtmyFormat\varindexFormatDefault}% \ifcase\varindexCount % We have 0 entries (this cannot happen: {} generates one (empty) entry) \or% 1 entry: \def\vxtexecute{% \toolboxDef\vxtmyFormat{1}% \toolboxDef\vxtStarFormat{\varindexOutputString 1}}% \or% 2 entries: \def\vxtentryAa{1}% \def\vxtentryAb{2}% \def\vxtentryBa{2}% \def\vxtentryBb{1}% \let\vxtexecute\vxtMakemyFormat \or% 3 entries: \def\vxtentryAa{1}% \ifx\vxtNopropA\undefined \def\vxtentryAb{23}% \else \def\vxtentryAb{3}% \fi \def\vxtentryBa{3}% \ifx\vxtNopropB\undefined \def\vxtentryBb{12}% \else \def\vxtentryBb{1}% \fi \let\vxtexecute\vxtMakemyFormat \or% 4 entries: \def\vxtentryAa{1}% \ifx\vxtNopropA\undefined \def\vxtentryAb{24}% \else \def\vxtentryAb{4}% \fi \def\vxtentryBa{4}% \ifx\vxtNopropB\undefined \def\vxtentryBb{13}% \else \def\vxtentryBb{1}% \fi \let\vxtexecute\vxtMakemyFormat \else% more than 4 entries: \def\vxtexecute{\let\vxtmyFormat\varindexFormatDefault}% \fi \ifvarindexExplicitFormat% the optional format string was given: \expandafter\vxtSplitAtMagic\expandafter{\varindexFormat}\vxttmp\vxttmpa \ifx\vxttmpa\undefined % If the Magic symbol does not occur, we do nothing \else% Otherwise: % We generate our format and insert it at the place of the Magic symbol: \vxtexecute \toolboxDef\varindexFormat{\vxttmp\vxtmyFormat\vxttmpa}% \vxtAddmyStar \fi \else% without an optional format string, we generate our own format \vxtexecute \let\varindexFormat\vxtmyFormat \vxtAddmyStar \fi } \toolboxNewiftrue{varindextwoCommaTilde} \toolboxNewiftrue{varindextwoDashTilde} \toolboxNewiffalse{varindextwoDashSpace} \def\vxtAddmyStar{% \ifvarindexStar% With the * flag, and \ifx\vxtStarFormat\undefined\else% if we have our own StarFormat: \varindexStarfalse% <- No further prepending of `*' desired afterwards \expandafter\varindexSplitAtOutput\expandafter{\varindexFormat}% \vxttmp\vxttmp \ifx\vxttmp\undefined% Did no `*' occur in the format string yet? \ifx\varindexFormat\toolboxEmpty% Empty format means: Only the * part: \let\varindexFormat\vxtStarFormat \else%Normally, we prepend our *-format and a space \toolboxDef\varindexFormat{% \vxtStarFormat\varindexIndexString\varindexFormat}% \fi \fi \fi \fi } \def\vxtMakemyFormat{% \let\vxtstarseparator\toolboxEmpty \ifx\vxtBreakifyA\undefined \ifx\vxtSpaceA\undefined \ifx\vxtDashA\undefined \ifx\vxtDotA\undefined \vxtExclamSeparator \else \let\vxtseparator\varindexOmitString \let\vxtstarseparator\vxtseparator \fi \else \let\vxtseparator\varindexDashString \let\vxtstarseparator\vxtseparator \fi \else \let\vxtseparator\toolboxEmpty \fi \else% With ^ \ifx\vxtDotA\undefined \let\vxtstarseparator\varindexDashString \ifx\vxtDashA\undefined% -^ \ifvarindextwoDashTilde \vxtExclamSeparator \toolboxAppend\vxtseparator\vxtstarseparator \else \toolboxDef\vxtseparator{\varindexExclamString\vxtstarseparator}% \fi \else% Plain ^ \vxtExclamSeparator \ifvarindextwoDashSpace \toolboxDef\vxtseparator{\vxtstarseparator\vxtseparator}% \else \toolboxDef\vxtseparator{% \vxtstarseparator\vxtseparator\varindexOmitString}% \fi \fi \else% .^ \let\vxtstarseparator\varindexOmitString \vxtExclamSeparator \toolboxAppend\vxtseparator\vxtstarseparator \fi \fi \ifx\vxtOmitA\undefined % We define now the string "\vxtentryAa?\vxtentryAb" where % ? is determined by the flags. \toolboxDef\vxtmyFormat{\vxtentryAa\vxtseparator\vxtentryAb}% \else \let\vxtmyFormat\toolboxEmpty \fi % The *-format is calculated similarly: \toolboxDef\vxtStarFormat{\varindexOutputString \vxtentryAa\vxtstarseparator\vxtentryAb}% \ifx\vxtOmitB\undefined \let\vxtappend\toolboxEmpty \ifx\vxtSpaceB\undefined \ifx\vxtDashB\undefined \ifx\vxtDotB\undefined \ifx\vxtCommaB\undefined \let\vxtseparator\varindexExclamString \let\vxtappend\varindexTildeAString \else \let\vxtseparator\varindexCommaString \ifvarindextwoCommaTilde \let\vxtappend\varindexTildeAString \fi \fi \ifx\vxtDashifyB\undefined \ifx\vxtOmitifyB\undefined\else \toolboxDef\vxtappend{\varindexOmitString\vxtappend}% \fi \else \toolboxDef\vxtappend{\varindexDashString\vxtappend}% \fi \else \let\vxtseparator\varindexOmitString \fi \else \let\vxtseparator\varindexDashString \fi \else \let\vxtseparator\toolboxEmpty \fi \ifx\vxtTildeB\undefined\else \let\vxtappend\varindexTildeAString \fi \ifx\vxtNoTildeB\undefined\else \let\vxtappend\toolboxEmpty \fi % In all cases, we prepend now the string "\vxtentryBa?\vxtentryBb??" % where ? and ?? are determined by the flags \ifx\vxtmyFormat\toolboxEmpty% If the previous string was empty: no space \toolboxDef\vxtmyFormat{\vxtentryBa\vxtseparator\vxtentryBb\vxtappend}% \else \toolboxAppend\vxtmyFormat{% \varindexIndexString\vxtentryBa\vxtseparator\vxtentryBb\vxtappend}% \fi \fi } \def\vxtExclamSeparator{% \ifx\vxtNoTildeA\undefined \toolboxDef\vxtseparator{\varindexExclamString\varindexTildeAString}% \else \let\vxtseparator\varindexExclamString \fi} %% -------------------------------------------------------------------- %% %% Now the implementation of \varindex. %% \ifx\varindexCount\undefined \newcount\varindexCount \fi \toolboxIf\undefined\def\varindexPlaceholderAText{$\sim$} \toolboxIf\undefined\let\varindexPlaceholderASort\toolboxEmpty \toolboxIf\undefined\def\varindexPlaceholderBText{$\approx$} \toolboxIf\undefined\let\varindexPlaceholderBSort\toolboxEmpty \toolboxNewiftrue{varindexUsePlaceholderA} \toolboxNewiftrue{varindexUsePlaceholderB} \toolboxNewiftrue{varindexLeadingPlaceholderA} \toolboxNewiftrue{varindexLeadingPlaceholderB} \toolboxNewiftrue{varindexCommaLeads} \toolboxNewiftrue{varindexCommaExpand} \toolboxNewiffalse{varindexPreviousAText} \toolboxNewiffalse{varindexPreviousASort} \toolboxNewiffalse{varindexPreviousBText} \toolboxNewiffalse{varindexPreviousBSort} \toolboxNewiftrue{varindexEliminateInnerBrace} \toolboxNewiftrue{varindexEliminateOuterBrace} \ifx\newcommand\undefined\else \newcommand{\varindex}{} \newcommand{\varindexNewFlag}{} \newcommand{\varindexTestAndExec}{} \newcommand{\varindexSkipAndExec}{} \newcommand{\varindexSkipDefault}{} \newcommand{\varindexSkipTricky}{} \newcommand{\varindexMakeVarSplit}{} \newcommand{\varindexMakeSplitExpand}{} \newcommand{\varindexSetWordString}{} \newcommand{\varindexSetSortString}{} \newcommand{\varindexSetPlainString}{} \newcommand{\varindexSetIndexString}{} \newcommand{\varindexSetOutputString}{} \newcommand{\varindexSetTildeAString}{} \newcommand{\varindexSetTildeBString}{} \newcommand{\varindexSetSpaceString}{} \newcommand{\varindexSetSpaceTokString}{} \newcommand{\varindexSetOmitString}{} \newcommand{\varindexSetCommaString}{} \newcommand{\varindexSetDashString}{} \newcommand{\varindexSetExclamString}{} \newcommand{\varindexSetStringForNr}{} \newcommand{\varindexedef}{} \newcommand{\varindexArgumentSpace}{} \newcommand{\varindexNewFormat}{} \newcommand{\varindexTokensOut}{} \newcommand{\varindexTokensOutExpand}{} \newcommand{\varindexAddNumber}{} \newcommand{\varindexAddComma}{} \newcommand{\varindexAddTildeA}{} \newcommand{\varindexAddTildeB}{} \newcommand{\varindexAddExclam}{} \newcommand{\varindexAddSpace}{} \newcommand{\varindexAddSpTok}{} \newcommand{\varindexAddOmit}{} \newcommand{\varindexAddDash}{} \newcommand{\varindexDoConvert}{} \newcommand{\varindexNoConvert}{} %% Obsolete names (only provided for backward compatibility): \newcommand{\varindexdef}{} \newcommand{\varindexspace}{} \newcommand{\varindexDropBrace}{} \newcommand{\varindexMakeSplit}{} \newcommand{\varindexLet}{} \newcommand{\varindexWithNr}{} \fi \let\varindexdef\toolboxDef \let\varindexspace\toolboxSpace \let\varindexDropBrace\toolboxDropBrace \let\varindexMakeSplit\toolboxMakeSplit \let\varindexLet\toolboxLet \let\varindexWithNr\toolboxWithNr \def\varindex{\begingroup \toolboxNewifFalse{varindexStar}% \toolboxNewifFalse{varindexExplicitFormat}% \toolboxNewifFalse{vx@atespace}% \toolboxNewifFalse{vx@savespace}% \toolboxNewifFalse{vx@ffound}% \toolboxNewifTrue{varindexIndexMode}% \toolboxNewifFalse{varindexSpaceText}% \toolboxNewifFalse{varindexSpaceSort}% \toolboxNewifTrue{vx@firstiter}% \toolboxNewifFalse{vx@tildeLead}% \toolboxNewifFalse{vx@commaTextLead}% \toolboxNewifFalse{vx@commaSortLead}% \varindexCount=0\relax \let\varindexStyle\toolboxEmpty \let\varindexAppend\toolboxEmpty \let\vx@text\toolboxEmpty \let\vx@mainprogram\undefined \let\vx@formatA\undefined \let\vx@formatAstar\undefined \let\varindexFormat\undefined \let\varindexFormatDefault\undefined \varindexNewFlag 1\varindexOneEntry \varindexNewFlag *\varindexStarPos \varindexTestAndExec(%optional formatA) \vx@ReadFormatA%else \vx@TestTextStyle} \def\vx@ReadFormatA(#1){% \def\vx@formatA{#1}% \varindexTestAndExec(%optional formatAstar) \vx@ReadFormatAstar%else \vx@SkipAndReadScan} \def\vx@ReadFormatAstar(#1){% \def\vx@formatAstar{#1}\vx@SkipAndReadScan} \def\vx@SkipAndReadScan{\varindexSkipAndExec\vx@ReadScan} \def\vx@ReadScan#1{#1\toolboxEmpty\varindexSkipAndExec\vx@ReadProgram} \def\vx@ReadProgram#1{\def\vx@mainprogram{#1}\vx@TestTextStyle} \def\vx@TestTextStyle{% \varindexTestAndExec[%textstyle] \vx@ReadTextStyle%else \vx@TestFlags} \def\vx@ReadTextStyle[#1]{% \def\varindexStyle{#1}% \varindexTestAndExec[%pagestyleA] \vx@ReadPageStyleA%else \vx@TestFlags} \def\vx@ReadPageStyleA[#1]{\def\varindexAppend{#1}\vx@TestFlags} \def\vx@TestFlags{% \varindexCount=0\relax \varindexEndOfFlag} \varindexCount=0\relax \expandafter \def\expandafter\varindexEndOfFlag\expandafter{% \csname vx@TestFlag\the\varindexCount\endcsname} \expandafter \def\varindexEndOfFlag{\varindexSkipAndExec\vx@ReadMain}% \def\varindexNewFlag#1#2{% \let#2\undefined \expandafter \def\expandafter\vx@tmp\expandafter{% \csname vx@TestFlag\the\varindexCount\endcsname #1#2}% \advance\varindexCount by 1\relax \expandafter \toolboxSurround\expandafter{% \csname vx@TestFlag\the\varindexCount\expandafter\endcsname \csname vx@ReadFlag\the\varindexCount\endcsname}{}\vx@tmp \varindexTestAndExec[%program] \vx@ReadFlagProgram%else {\vx@MakeFlagProgram\varindexEndOfFlag}% } \def\vx@ReadFlagProgram[#1]{\vx@MakeFlagProgram{#1}} \def\vx@MakeFlagProgram#1{\expandafter\vx@MakeNewFlag\vx@tmp{#1}} \def\vx@MakeNewFlag#1#2#3#4#5#6{% \def\varindexEndOfFlag{#1}% \def#1{\varindexTestAndExec#4{#2}{#3}}% \def#2#4{\expandafter \def\expandafter#5\expandafter{\the\varindexCount}% \advance\varindexCount by 1\relax \varindexSkipAndExec{#6}}% } \long\def\vx@ReadMain#1{\def\vx@text{#1}% \ifx\vx@formatA\undefined \def\vx@exec{\varindexSkipAndExec\vx@ReadFormatB}% \else \def\vx@exec{% \varindexTestAndExec[%FormatB] \vx@ReadOptFormatB%else {\ifvx@atespace\vx@savespacetrue\fi\vx@TestAppend}}% \fi \vx@exec} \def\vx@ReadFormatB#1{\def\varindexFormat{#1}\vx@TestAppend} \def\vx@ReadOptFormatB[#1]{\def\varindexFormat{#1}\vx@TestAppend} \def\vx@TestAppend{% \varindexTestAndExec[%Append] {\vx@savespacefalse\vx@ReadAppend}%else {\ifvx@atespace\vx@savespacetrue\fi\vx@Main}} \def\vx@ReadAppend[#1]{\def\varindexAppend{#1}\vx@Main} \def\varindexTestAndExec#1#2#3{% \varindexSkipAndExec{% \ifx\varindexNextToken#1% \def\vx@exec{#2}% \else \def\vx@exec{#3}% \fi \vx@exec}} \def\varindexSkipAndExec#1{% \vx@atespacefalse \def\vx@skipexec{#1}% \varindexArgumentSpace} \def\varindexSkipDefault{\futurelet\varindexNextToken\vx@skipexec} \def\varindexSkipTricky{% \vx@MakeSpaceOther\futurelet\varindexNextToken\vx@SkipLoopTest} \def\vx@SkipLoopTest{% \vx@MakeSpaceSpace \ifx\varindexNextToken\vx@spaceothertok \def\vx@skipnext{\vx@gobblespace a}% \else \let\vx@skipnext\vx@skipexec \fi \vx@skipnext} \def\vx@gobblespace a#1{\vx@atespacetrue\varindexSkipTricky} \def\vx@Main{% \ifx\varindexStarPos\undefined \varindexStarfalse \else \varindexStartrue \fi \ifx\vx@formatA\undefined \let\varindexFormatDefault\toolboxEmpty \else \ifvarindexStar \ifx\vx@formatAstar\undefined \let\varindexFormatDefault\vx@formatA \else \let\varindexFormatDefault\vx@formatAstar \fi \else \let\varindexFormatDefault\vx@formatA \fi \fi \toolboxDef\vx@toparse{\vx@text\vx@word\vx@endparse}% \ifx\varindexOneEntry\undefined \varindexCount=0\relax \let\vx@NextLoop\vx@TextLoop \vx@TextLoop \else \varindexCount=1\relax \ifvarindexEliminateOuterBrace \toolboxDropBrace\vx@text \fi \expandafter\vx@TextEntry\expandafter{\vx@text}% \fi \expandafter \def\expandafter\varindexLastEntry\expandafter{\the\varindexCount}% \varindexedef\varindexFormatDefault{\varindexFormatDefault}% \ifx\varindexFormat\undefined \varindexExplicitFormatfalse \let\varindexFormat\varindexFormatDefault \else \varindexExplicitFormattrue \varindexedef\varindexFormat{\varindexFormat}% \fi \ifx\vx@mainprogram\undefined\else \vx@mainprogram \varindexedef\varindexFormat{\varindexFormat}% \fi \ifvarindexStar \expandafter\varindexSplitAtOutput\expandafter{\varindexFormat}\vx@fa\vx@fb \ifx\vx@fb\undefined \expandafter\varindexSplitAtIndex\expandafter{\varindexFormat}% \vx@fa\vx@fb \ifx\vx@fb\undefined \let\vx@fa\undefined \fi \ifx\vx@fa\toolboxEmpty \toolboxDef\varindexFormat{\varindexOutputString\varindexFormat}% \else \toolboxDef\varindexFormat{% \varindexOutputString\varindexIndexString\varindexFormat}% \fi \fi \fi \ifx\varindexFormat\varindexOutputString \toolboxDef\varindexFormat{\varindexOutputString\varindexIndexString}% \fi \ifx\varindexFormat\toolboxEmpty \vx@FormatAll \else \toolboxDef\vx@toparse{\varindexFormat\varindexIndexString\vx@endparse}% \let\vx@NextLoop\vx@FormLoop \vx@FormLoop \fi \ifvx@savespace\aftergroup\space\fi \endgroup} \def\vx@endparse{\vx@endparse} \def\vx@TextLoop{% \ifx\vx@toparse\vx@endparse \let\vx@NextLoop\toolboxEmpty \else \advance\varindexCount by 1\relax \expandafter\vx@SplitAtWord\expandafter{\vx@toparse}% \vx@textentry\vx@toparse \ifvarindexEliminateOuterBrace \toolboxDropBrace\vx@textentry \fi \expandafter\vx@TextEntry\expandafter{\vx@textentry}% \fi \vx@NextLoop} \def\vx@FormLoop{% \ifx\vx@toparse\vx@endparse \let\vx@NextLoop\toolboxEmpty \else \expandafter\varindexSplitAtIndex\expandafter{\vx@toparse}\vx@fa\vx@fb \expandafter\varindexSplitAtOutput\expandafter{\vx@fa}\vx@fa\vx@fc \ifx\vx@fa\toolboxEmpty \ifvx@firstiter%% In the first iteration, %% \ifx\vx@fc\undefined% if 'space' is the very first sign, %% \vx@FormatAll% we output everything %% \fi \else \vx@FormatAll \fi \else \expandafter\vx@Format\expandafter{\vx@fa}% \fi \vx@firstiterfalse \ifx\vx@fc\undefined \varindexIndexModetrue \let\vx@toparse\vx@fb \else \varindexIndexModefalse \expandafter \varindexSplitAtOutput\expandafter{\vx@toparse}\vx@fa\vx@toparse \fi \fi \vx@NextLoop} \def\vx@FormatAll{% \vx@FormatInit \expandafter \def\expandafter\vx@Count\expandafter{\the\varindexCount}\relax \varindexCount=0\relax \let\vx@NextFormatAllLoop\vx@FormatAllLoop \vx@FormatAllLoop \expandafter\varindexCount\expandafter=\vx@Count\relax \vx@Write} \def\vx@FormatAllLoop{% \advance\varindexCount by 1\relax \expandafter \varindexAddNumber\expandafter{\the\varindexCount}% \expandafter \ifnum\varindexLastEntry=\varindexCount \let\vx@NextFormatAllLoop\toolboxEmpty \fi \vx@NextFormatAllLoop} \def\vx@AppendWithCount#1#2{% \toolboxLet\vx@tmp{#2\the\varindexCount}% \ifx#1\toolboxEmpty \let#1\vx@tmp \else \ifx\vx@tmp\toolboxEmpty\else\toolboxAppend#1{\toolboxSpace\vx@tmp}\fi \fi} \def\vx@Format#1{% \vx@FormatInit \def\vx@fparse{#1}% \toolboxAppend\vx@fparse\vx@endparse \let\vx@FormatNextLoop\vx@FormatLoop \vx@FormatLoop \vx@Write } \def\vx@FormatInit{% \let\vx@outputlist\toolboxEmpty \let\vx@textlist\toolboxEmpty \let\vx@sortlist\toolboxEmpty \let\vx@textlistBefore\toolboxEmpty \let\vx@sortlistBefore\toolboxEmpty \let\vx@tildeAText\varindexPlaceholderAText \let\vx@tildeASort\varindexPlaceholderASort \let\vx@tildeBText\varindexPlaceholderBText \let\vx@tildeBSort\varindexPlaceholderBSort \vx@tildeLeadtrue \ifvarindexCommaExpand \vx@commaTextLeadtrue \vx@commaSortLeadtrue \else \vx@commaTextLeadfalse \vx@commaSortLeadfalse \fi \varindexNoNextSpace } \def\vx@FormatLoop{% \vx@ffoundfalse \ifx\vx@fparse\vx@endparse \let\vx@FormatNextLoop\toolboxEmpty \else \vx@HandleFormat \ifvx@ffound\else \expandafter\vx@ErrorFormat\vx@fparse \let\vx@FormatNextLoop\toolboxEmpty \fi \fi \vx@FormatNextLoop } \def\vx@condexec#1#2{\ifvx@ffound\else \expandafter #1\expandafter{\vx@fparse}\vx@fparseA\vx@fparseB \ifx\vx@fparseB\undefined\else \ifx\vx@fparseA\toolboxEmpty \let\vx@fparse\vx@fparseB \vx@ffoundtrue #2% \fi \fi \fi} \let\vx@HandleFormat\toolboxEmpty \def\varindexNewFormat#1#2{% \toolboxSurround{\vx@condexec{#1}{#2}}{}\vx@HandleFormat} %% This macro is executed near the end of this file. \def\varindexAddOmit{% The name is a fake: The macro redefines this macro \vx@NewStdFormat\varindexSplitAtSpace{Space}% \vx@NewStdFormat\varindexSplitAtSpaceTok{SpTok}% \vx@NewStdFormat\varindexSplitAtOmit{Omit}% \varindexNewFormat\varindexSplitSpace{}% Spaces in inner format are ignored \varindexNewFormat\varindexSplitAtDash\varindexAddDash \varindexNewFormat\varindexSplitAtTildeB\varindexAddTildeB \varindexNewFormat\varindexSplitAtTildeA\varindexAddTildeA \varindexNewFormat\varindexSplitAtComma\varindexAddComma \varindexNewFormat\varindexSplitAtExclam\varindexAddExclam \let\vx@NewStdFormat\undefined% We do not need this generic macro anymore } \def\vx@NewStdFormat#1#2{% \expandafter \varindexNewFormat\expandafter#1\csname varindexAdd#2\endcsname \expandafter \def\expandafter\vx@tmp\expandafter{% \csname varindexPreceeds#2\expandafter\endcsname \expandafter \varindexTokensOutExpand \csname varindexOutText#2\expandafter\endcsname \csname varindexOutSort#2\expandafter\endcsname \csname varindexFollows#2\endcsname} \expandafter\let\csname varindexAdd#2\endcsname\vx@tmp} \def\varindexAddNumber#1{% \ifnum\varindexCount<#1% \expandafter\vx@ErrorNumber\expandafter{\the\varindexCount}{#1}% \fi \ifvarindexIndexMode \toolboxLet\vx@adda{varindexEntry#1}% \toolboxLet\vx@addb{varindexSort#1}% \else \toolboxLet\vx@adda{varindexPlain#1}% \fi \vx@Addit\varindexSpaceTexttrue\varindexSpaceSorttrue} \def\varindexAddDash{% \varindexPreceedsDash \ifx\vx@sortlist\toolboxEmpty \varindexTokensOutExpand\varindexOutTextDash\varindexOutSortDashBeg \else \varindexTokensOutExpand\varindexOutTextDash\varindexOutSortDash \fi \varindexFollowsDash} \def\varindexAddComma{% \ifvarindexCommaLeads \vx@tildeLeadtrue \fi \ifvarindexCommaExpand \let\vx@tildeAText\vx@textlist \let\vx@tildeBText\vx@textlist \ifvarindexIndexMode \let\vx@tildeASort\vx@sortlist \let\vx@tildeBSort\vx@sortlist \fi \fi \varindexPreceedsComma \varindexTokensOutExpand\varindexOutTextComma\varindexOutSortComma \vx@flushToBefore \ifvarindexCommaExpand \vx@commaTextLeadtrue\vx@commaSortLeadtrue \fi \varindexFollowsComma} \def\vx@flushToBefore{% \ifvarindexCommaExpand \toolboxAppend\vx@textlistBefore\vx@textlist \let\vx@textlist\toolboxEmpty \ifvarindexIndexMode \toolboxAppend\vx@sortlistBefore\vx@sortlist \let\vx@sortlist\toolboxEmpty \fi \fi} \def\varindexAddTildeA{% \ifvarindexUsePlaceholderA \ifvx@tildeLead \ifvarindexLeadingPlaceholderA \vx@AddingTildeA \fi \else \vx@AddingTildeA \fi \fi} \def\vx@AddingTildeA{% \ifvarindexPreviousAText \let\vx@adda\vx@tildeAText \else \let\vx@adda\varindexPlaceholderAText \fi \ifvarindexPreviousASort \let\vx@addb\vx@tildeASort \else \let\vx@addb\varindexPlaceholderASort \fi \vx@Addit\varindexSpaceTexttrue\varindexSpaceSorttrue} \def\varindexAddTildeB{% \ifvarindexUsePlaceholderB \ifvx@tildeLead \ifvarindexLeadingPlaceholderB \vx@AddingTildeB \fi \else \vx@AddingTildeB \fi \fi} \def\vx@AddingTildeB{% \ifvarindexPreviousBText \let\vx@adda\vx@tildeBText \else \let\vx@adda\varindexPlaceholderBText \fi \ifvarindexPreviousBSort \let\vx@addb\vx@tildeBSort \else \let\vx@addb\varindexPlaceholderBSort \fi \vx@Addit\varindexSpaceTexttrue\varindexSpaceSorttrue} \def\varindexNextSpace{\varindexSpaceTexttrue\varindexSpaceSorttrue} \def\varindexNoNextSpace{\varindexSpaceTextfalse\varindexSpaceSortfalse} \long\def\varindexTokensOut#1#2{\def\vx@adda{#1}\def\vx@addb{#2}\vx@Addit{}{}} \def\varindexTokensOutExpand#1#2{\let\vx@adda#1\let\vx@addb#2\vx@Addit{}{}} \def\vx@Addit#1#2{% \ifx\vx@adda\toolboxEmpty\else \vx@tildeLeadfalse \ifvarindexSpaceText \varindexSpaceTextfalse \ifvx@commaTextLead \toolboxAppend\vx@textlistBefore\toolboxSpace \let\vx@textlist\vx@adda \else \toolboxAppend\vx@textlist{\toolboxSpace\vx@adda}% \fi \else \toolboxAppend\vx@textlist\vx@adda \fi \vx@commaTextLeadfalse #1% \fi \ifvarindexIndexMode \ifx\vx@addb\toolboxEmpty\else \ifvarindexSpaceSort \varindexSpaceSortfalse \ifvx@commaSortLead \toolboxAppend\vx@sortlistBefore\toolboxSpace \let\vx@sortlist\vx@addb \else \toolboxAppend\vx@sortlist{\toolboxSpace\vx@addb}% \fi \else \toolboxAppend\vx@sortlist\vx@addb \fi \vx@commaSortLeadfalse #2% \fi \fi} \def\varindexAddExclam{% \ifvarindexIndexMode \vx@Flush \toolboxAppend\vx@outputlist\varindexOutExclam \else \errmessage{\string\varindex: % Subitem can only be used for index, not for running text}% \fi \varindexFollowsExclam } \expandafter \def\expandafter\vx@ErrorFormat\expandafter#\expandafter 1\vx@endparse {\errmessage{\string\varindex: Error in format `#1'}} \def\vx@ErrorNumber#1#2{\errmessage{\string\varindex: % Entry `#2' does not exist (only #1 entries)}} \def\vx@Write{% \vx@Flush \ifvarindexIndexMode \toolboxAppend\vx@outputlist\varindexAppend \vx@MakeHarmless\vx@outputlist \expandafter \varindexIndex\expandafter{\vx@outputlist}% \else \expandafter \varindexStyle\expandafter{\vx@outputlist}% \fi} \def\vx@Flush{% \vx@tildeLeadtrue \vx@commaTextLeadtrue \vx@commaSortLeadtrue \let\vx@tildeAText\vx@textlist \let\vx@tildeBText\vx@textlist \ifvarindexIndexMode \let\vx@tildeASort\vx@sortlist \let\vx@tildeBSort\vx@sortlist \toolboxDef\vx@textlist{\vx@textlistBefore\vx@textlist}% \toolboxDef\vx@sortlist{\vx@sortlistBefore\vx@sortlist}% \ifx\vx@textlist\vx@sortlist \toolboxAppend\vx@outputlist\vx@textlist \else \toolboxAppend\vx@outputlist{\vx@sortlist\vx@otherat\vx@textlist}% \fi \let\vx@sortlistBefore\toolboxEmpty \let\vx@sortlist\toolboxEmpty \else \toolboxAppend\vx@outputlist{\vx@textlistBefore\vx@textlist}% \fi \let\vx@textlistBefore\toolboxEmpty \let\vx@textlist\toolboxEmpty} \def\vx@TextEntry#1{% \vx@SplitAtSort{#1}\vx@textEntryA\vx@textEntryB \expandafter\vx@SplitAtPlain\expandafter{\vx@textEntryA}% \vx@textEntryA\vx@textEntryC \vx@LetEliminated{varindexEntry}\vx@textEntryA \ifx\vx@textEntryB\undefined \vx@LetEliminated{varindexSort}\vx@textEntryA \ifx\vx@textEntryC\undefined \vx@LetEliminated{varindexPlain}\vx@textEntryA \else \vx@LetEliminated{varindexPlain}\vx@textEntryC \fi \else \ifx\vx@textEntryC\undefined \expandafter\vx@SplitAtPlain\expandafter{\vx@textEntryB}% \vx@textEntryB\vx@textEntryC \fi \vx@LetEliminated{varindexSort}\vx@textEntryB \ifx\vx@textEntryC\undefined \vx@LetEliminated{varindexPlain}\vx@textEntryA \else \vx@LetEliminated{varindexPlain}\vx@textEntryC \fi \fi } \def\vx@LetEliminated#1#2{% \let\vx@tmp#2% \ifvarindexEliminateInnerBrace \toolboxDropBrace\vx@tmp \fi \toolboxWithNr{\the\varindexCount}\let{#1}\vx@tmp} \def\varindexMakeVarSplit#1#2#3{\varindexedef#1{#2}\expandafter \toolboxMakeSplit\expandafter{#1}{#3}} \def\varindexMakeSplitExpand#1#2{\varindexMakeVarSplit\vx@tmp{#1}{#2}} \def\varindexSetWordString#1{\def\vx@word{#1}% \toolboxMakeSplit{#1}{vx@SplitAtWord}} \def\varindexSetSortString#1{% \toolboxMakeSplit{#1}{vx@SplitAtSort}} \def\varindexSetPlainString#1{% \toolboxMakeSplit{#1}{vx@SplitAtPlain}} \def\vx@tmp#1{% \expandafter \def\expandafter\vx@adda\expandafter##\expandafter 1\expandafter{% \expandafter \varindexMakeVarSplit\csname varindex#1String\endcsname {##1}{varindexSplitAt#1}}% \expandafter \let\csname varindexSet#1String\endcsname\vx@adda} \vx@tmp{Index} \vx@tmp{Output} \vx@tmp{TildeA} \vx@tmp{TildeB} \vx@tmp{Space} \vx@tmp{SpaceTok} \vx@tmp{Omit} \vx@tmp{Comma} \vx@tmp{Dash} \vx@tmp{Exclam} \def\varindexSetStringForNr#1#2{% \edef\vx@adda{#1}% \expandafter \vx@AddToHandleNrs\csname varindexSplitAtNr\vx@adda\endcsname \expandafter \varindexMakeVarSplit\csname varindexNr\vx@adda String\endcsname {#2}{varindexSplitAtNr\vx@adda}} \def\vx@AddToHandleNrs#1{% \ifx#1\relax \expandafter \varindexNewFormat\expandafter#1\expandafter{\expandafter \varindexAddNumber\expandafter{\vx@adda}}% \fi} \def\varindexedef#1#2{% \let\vx@tildemerk~% \let~\vx@nicetilde \edef#1{#2}% \let~\vx@tildemerk} \def\varindexDoConvert{\let\vx@MakeHarmless\toolboxMakeHarmless} \def\varindexNoConvert{\def\vx@MakeHarmless##1{}} \def\vx@tmp{\catcode`\~=13\relax} \catcode`\~=11\relax\def\vx@nicetilde{~}\vx@tmp \def\vx@MakeSpaceOther{\catcode`\ =13\relax} \def\vx@MakeSpaceSpace{\catcode`\ =10\relax} \vx@MakeSpaceOther%<- This % is important \let\vx@spaceothertok= %<- This ` %' is important \vx@MakeSpaceSpace \def\varindexArgumentSpace#1{\def\vx@otherat{#1}} \ifx\makeatother\undefined\catcode`\@=12\relax\else\makeatother\fi \varindexArgumentSpace{@} \let\varindexArgumentSpace\varindexSkipDefault \toolboxIf\undefined\def\varindexIndex{\index} \varindexDoConvert \toolboxIf\undefined\def\varindexOutExclam{!} \toolboxIf\undefined\let\varindexFollowsExclam\varindexNoNextSpace \toolboxIf\undefined\def\varindexOutTextComma{,} \toolboxIf\undefined\def\varindexOutSortComma{,} \toolboxIf\undefined\let\varindexFollowsComma\varindexNextSpace \toolboxIf\undefined\let\varindexPreceedsComma\varindexNoNextSpace \toolboxIf\undefined\def\varindexOutTextSpace{ } \toolboxIf\undefined\def\varindexOutSortSpace{ } \toolboxIf\undefined\let\varindexFollowsSpace\toolboxEmpty \toolboxIf\undefined\let\varindexPreceedsSpace\varindexNoNextSpace \toolboxIf\undefined\def\varindexOutTextSpTok{\space} \toolboxIf\undefined\def\varindexOutSortSpTok{ } \toolboxIf\undefined\let\varindexFollowsSpTok\toolboxEmpty \toolboxIf\undefined\let\varindexPreceedsSpTok\varindexNoNextSpace \toolboxIf\undefined\def\varindexOutTextDash{-} \toolboxIf\undefined\def\varindexOutSortDash{-} \toolboxIf\undefined\let\varindexOutSortDashBeg\toolboxEmpty \toolboxIf\undefined\let\varindexFollowsDash\toolboxEmpty \toolboxIf\undefined\let\varindexPreceedsDash\varindexNoNextSpace \toolboxIf\undefined\let\varindexOutTextOmit\toolboxEmpty \toolboxIf\undefined\let\varindexOutSortOmit\toolboxEmpty \toolboxIf\undefined\let\varindexFollowsOmit\toolboxEmpty \toolboxIf\undefined\let\varindexPreceedsOmit\varindexNoNextSpace %% It is important that the following is after all \toolboxIf\undefined... \varindexAddOmit% Execute the fake macro and redefine \varindexAddOmit \toolboxMakeSplit{ }{varindexSplitSpace} \varindexSetWordString{ } \varindexSetSortString{@} \varindexSetPlainString{!} \varindexSetIndexString{ } \varindexSetOutputString{*} \varindexSetTildeAString{~} \varindexSetTildeBString{=} \varindexSetSpaceString{_} \varindexSetSpaceTokString{s} \varindexSetOmitString{.} \varindexSetCommaString{,} \varindexSetDashString{-} \varindexSetExclamString{!} \varindexSetStringForNr{10}{0} \varindexSetStringForNr 9{9} \varindexSetStringForNr 8{8} \varindexSetStringForNr 7{7} \varindexSetStringForNr 6{6} \varindexSetStringForNr 5{5} \varindexSetStringForNr 4{4} \varindexSetStringForNr 3{3} \varindexSetStringForNr 2{2} \varindexSetStringForNr 1{1} \ifx\makeatletter\undefined\catcode`\@=11\relax\else\makeatletter\fi \endinput %% %% End of file `varindex.sty'.