% \def\fileversion{2.3}\def\filedate{2001/05/06}\def\docdate{2013/11/26} %\iffalse These lines are necessary for the doc and docstrip utilities %<*asciidocu> %%# %%# Author: %%# %%# M. V\"ath martin@mvath.de %%# %%# This package bases on ideas of indextwo.sty which was written jointly with %%# %%# O. Karch karch@informatik.uni-wuerzburg.de %%# H.-C. Wirth wirth@informatik.uni-wuerzburg.de %%# The package may be distributed and/or modified under the conditions of %%# the LaTeX Project Public License (version 1.3c or later). %%############################################################################# %%# %%# This LaTeX package provides a luxury front-end for the \index command. %%# For example, it allows to generate multiple \index entries in %%# almost any form by a single command. Extremely customizable. %%# Works with all versions of LaTeX and probably most other TeX formats, too. %%# This package requires the toolbox package at least in version 3.1. %%# %%############################################################################# %%# %%# This package was tested with LaTeX 2.09 and LaTeX 2e and should work %%# with all other (future) versions of LaTeX and friends, too. %%# It should even run with other (non-LaTeX) formats if an \index command %%# with LaTeX-Syntax is provided. %%# % If you have access to (reasonable new) docstrip TeXfiles, you should run % tex/latex on the file % `varindex.ins' % to produce the files `varindex.sty', `varindex.txt' and `varindex.tex'. % (In case `varindex.ins' is lost: You can find its content in the last % few lines of the file you are currently reading between the % lines %<*insfile> and %; % BTW: You should name this file here `varindex.dtx' before you run tex % on varindex.ins). % % The file `varindex.txt' contains a `brief' (but complete) ascii % documentation. If you have additionally access to LaTeX2e, you may run % latex on the generated file `varindex.tex' to produce `varindex.dvi' which % contains a more luxury documentation. (If you want an index or % implementation details in the documentation read the comments in % `varindex.tex' before running it through latex). % % If you do not have access to the docstrip TeXfiles you may simply % copy/rename this file here into % `varindex.sty' % to use the package and read the ascii documentation in this file. % The ascii documentation (the content of `varindex.txt') consists of all % lines in this file which start with %%# (this is the above block and another % (very large) block which follows soon). % % But I do not recommended this, because TeX will need more time to read this % longer file, and because there might be a (very slight) incompatibility if % you use it (namely if you load `varindex.sty' with some *extremely* strange % catcodes). % I recommend in this case instead to generate the file `varindex.sty' as % anything between the lines %<*package> and % by hand. % (This is not precisely the file which you get with the docstrip TeXfiles, % but a reasonable good substitute. To speed up loading, you may also % eliminate all lines starting with `% ' in `varindex.sty'). % For your information: The file `varindex.tex' produced by the docstrip % TeXfiles is anything between the lines %<*driver> and % % (with a line containing \endinput and two comment lines appended) % % % In any case, you end up with the file `varindex.sty'. % % If you can generate `varindex.tex', you will probably want to stop % reading now and instead read the `luxury' documentation in `varindex.dvi'. % % Otherwise, you have to make due with the following ascii documentation. % % % \fi\catcode\#14\relax\iffalse (This line is needed for the doc utility) % %%# To use varindex, you have to put `varindex.sty' in a path where TeX looks %%# for its input files. You must also have the file `toolbox.sty' of the %%# toolbox package in your path. The TeX documents using varindex need the %%# following modifications in their header: %%# %%# a) If you use LaTeX2.09, use varindex as a style option, e.g. %%# \documentstyle[varindex]{article} %%# or %%# \documentstyle[varindex,12pt]{article} %%# b) If you use LaTeX2e, put in the preamble the command %%# \usepackage{varindex} %%# c) If you use some other (non-LaTeX) format, you will probably have to %%# insert a line like %%# \catcode`\@=11\input varindex.sty\catcode`\@=12\relax %%# %%# For TeX insiders: LaTeX-specific commands used in `varindex.sty' are only: %%# %%# \makeatother %%# \makeatletter %%# \typeout %%# \RequirePackage %%# \newcommand (only in the form \newcommand{\command}{} to ensure that %%# \command was not defined before) %%# \ProvidesPackage %%# %%# The above commands are used only if they are defined (otherwise, %%# natural substitutes are used (\newcommand and \Provides package are %%# then not used at all)) %%# %%# I strongly recommend to have additionally a look at the documentation %%# of the "toolbox" package, in particular the \toolboxMakeDef command %%# (provided since toolbox v3.1) which supplements \varindex. %%# %%# %%# The \varindex command is highly customizable. %%# So the following examples can only give you a rough impression of what %%# you can actually do with it. You do not need to understand them now: %%# The general usage is explained later. (Maybe you want to look up the %%# examples afterwards). %%# %%# %%# 1. Typical example of usage (using the \varindextwo macros): %%# %%# %%# %%# Suppose the following customization of the \varindex command was defined: %%# \def\Index{\varindex(){\varindextwoScan}{\varindextwo}[\emph]} %%# Since we used the \varindextwo macros here, by default %%# TWO index entries are generated with a single command: %%# %%# \Index{ring with $1$@one} %%# %%# ring %%# ~ with $1$ [sorted like: "with one"] %%# %%# $1$ [sorted like: "one" ] %%# ring with ~ [sorted like: "ring with" (without " ~") ] %%# %%# DIFFERENT entries may be generated by your own rules. E.g.: %%# %%# \Index{Hausdorff measure of noncompactness}[4,23 2!~34!1= ] %%# %%# generates THREE index entries: %%# %%# noncompactness, measure of ~ (sorted like "noncompactness, measure of") %%# %%# measure %%# ~ of noncompactness %%# Hausdorff = (here, = stands for the $\approx$ symbol) %%# %%# Hausdorff measure of noncompactness %%# %%# The last of these entries occurs only, because the last character in %%# the format argument [...] was a space. %%# %%# If you want only slight modification(s) of the default, you need also just %%# slight modifications of the command, e.g. %%# %%# \Index*,{ring with $1$@one} is as above, just that the second entry reads %%# %%# $1$, ring with ~ [sorted like "one, ring with" ] %%# %%# Moreover, since the `*' occured in the previous command, additionally %%# %%# \emph{ring with $1$} %%# %%# appears in the running text. Praxis shows that changes in the entries as %%# above have to be made frequently in the `fine tuning' of the index of a %%# book. Note that with the original \index the command would have to be %%# changed completely for the above entries, because we have a "sort" entry %%# for which a different rule applies if we use a subitem instead of a ",". %%# (BTW: \varindex produces sort entries only if they are necessary). %%# %%# Of course, you may combine the default with your own format: %%# %%# \Index{internal integrable function}[23,1~ +] generates %%# %%# integrable function, internal ~ %%# %%# internal %%# ~ integrable function %%# %%# function %%# internal integrable ~ %%# %%# %%# 2. A simple example without the \varindextwo macros: %%# %%# \varindex*{topology of a normed space}{5!4~!1= 45,12}[|see{norm}] %%# %%# produces the two index entries: %%# %%# space %%# normed ~ %%# topology = %%# %%# normed space, topology of %%# %%# In both entries not the pagenumber is cited, but the text "see also norm". %%# Additionally, the tokens {topology of a normed space} are %%# inserted into the running text (this would not happen if %%# \varindex is used in place of \varindex*). %%# Only in the first of the above entries, an `@' part will be added to the %%# *.idx file: This entry is sorted as if " ~" resp. " =" would not exist. %%# %%# %%# 3. Another example without the \varindextwo macros: %%# %%# \varindex[\emph][|textbf]% %%# {$\sigma$@sigma!$(\sigma-)$ finite {measure space}}% %%# {*1.23 23 23,1- 1-23} %%# %%# generates the three index entries: %%# %%# finite measure space %%# %%# finite measure space, $\sigma$- (sorted as "finite measure space, sigma-") %%# %%# $\sigma$-finite measure space (sorted as "sigma-finite measure space") %%# %%# In all three entries the pages are printed using \textbf. %%# %%# Moreover, the tokens %%# \emph{($\sigma$-)finite measure space} %%# are put into the running text. %%# %%# %%# 4. A simple example using a flag (without the \varindextwo macros): %%# %%# \varindex1{$L$ and $M$@L and M}{} %%# ^ %%# %%# generates the index entry "$L$ and $M$" which is sorted like "L and M". %%# In the form %%# \varindex1*{$L$ and $M$@L and M}{} %%# or %%# \varindex*1{$L$ and $M$@L and M}{} %%# additionally, {$L$ and $M$} is output into the running text. %%# %%# Note that without the `1', the index generated were %%# "$L$ and $M$ and M" which were sorted like "$L$ and L and M". %%# %%# %%# 5. An example for very primitive customized index commands (without the %%# \varindextwo macros): %%# %%# \def\myindexA{\varindex[\emph][|textbf]*} %%# \def\myindexB{\varindex(){}{}[\emph][|textbf]} %%# %%# \myindexA{Foo1}{} %%# \myindexB{Foo2}[][] %%# \myindexB*{Foo3!{Foo 3}} %%# %%# Generates the index entries Foo1, Foo2, and Foo3. Moreover, \emph{Foo1} %%# and \emph{Foo 3} is put into the running text. The pagenumber of Foo 2 in %%# the index is printed normal, the others with \textbf. %%# %%# %%# 6. An example of a primitive customized index command (without the %%# \varindextwo macros): %%# %%# \def\myindex{\varindex(\ifnum\varindexCount=2 1!2 2,1\fi){}{}[\emph]} %%# %%# \myindex{Foo Bar} %%# generates the index entries %%# Foo %%# Bar %%# %%# Bar, Foo %%# %%# \myindex*{Foo Bar} %%# generates the same index entries as above and additionally outputs %%# \emph{Foo Bar} into the running text. %%# %%# \myindex*{other format}[21] %%# generates the index entry %%# format other %%# and outputs \emph{other format} into the running text. %%# %%# \myindex[|textbf]*{BoBo} %%# generates the index entry %%# BoBo %%# where the pagenumber is printed with \textbf. %%# Moreover, \emph{BoBo} is output into the running text. %%# %%# %%# 7. A primitive varying customized index command (without the \varindextwo %%# macros): %%# %%# \def\myindex{\varindex(\ifnum\varindexCount=2 1!2 2,1\fi)% %%# (\ifnum\varindexCount=2*2,1 1!2 2,1\fi){}{}[\emph]} %%# %%# With the same commands as in 6. the same index entries are generated, %%# but the tokens \emph{Far, Boo}, \emph{other format}, and \emph{Bobo} %%# are output into the running text. %%# %%# %%# 8. Examples with the \varindextwo macros: %%# We use a similar definition for \Index as in 1., and define an \iemph %%# macro which has `*' as a default and outputs with \emph. %%# Both sort of definitions are highly recommended for you private style. %%# %%# \def\Index{\varindex(){\varindextwoScan}{\varindextwo}[]} %%# \def\iemph{\varindex(){\varindextwoScan\def\varindexStarPos{}}% %%# {\varindextwo}[\emph]} %%# (note that \def\iemph{\varindex(){\varindextwoScan}{\varindextwo}[\emph]*} %%# is not so good as the above definition of \iemph as is explained below). %%# %%# \Index*{measure of $\gamma$-noncompactness@gamma-noncompactness!FOO} %%# %%# generates the index entries %%# %%# measure %%# ~ of $\gamma$-noncompactness (sorted as "of gamma-noncompactness") %%# %%# $\gamma$-noncompacntess %%# measure of ~ %%# %%# and outputs the tokens {measure of FOO} into the running text. %%# %%# \Index*,?_'{flic of flac} generates %%# %%# flic of flac %%# %%# flac, flic %%# %%# and outputs {flic of flac}. %%# %%# \Index^={$\sigma$@sigma algebra} generates %%# %%# $\sigma$ (sorted as "sigma") %%# ~-algebra (sorted as "algebra" resp. "-algebra", see below) %%# %%# algebra %%# $\sigma$-~ (sorted as "sigma-") %%# %%# Here, the sorting "-algebra" is chosen when you used %%# \let\varindexOutSortDashBeg\varindexOutSortDash %%# as described later. %%# %%# \Index-^>{$\sigma$@sigma algebra} generates %%# %%# $\sigma$- (sorted as "sigma-") %%# ~ algebra (sorted as "algebra") %%# %%# \Index^.,:{ultra filter} generates %%# %%# ultra %%# ~filter (no space following ~) %%# filter, ultra~ (no space in front of ~) %%# %%# \iemph[|see{recursive recursion}],_{recursive recursion} generates %%# %%# recursive recursion, \see{recursive recursion} %%# %%# recursion, recursive ~, \see{recursive recursion} %%# %%# and outputs \emph{recursive recursion}. If we would have used instead the %%# definition \def\iemph{\varindex(){\varindextwoScan}{\varindextwo}[]*}, %%# the above call were not possible, since the optional arguments [|see...] %%# must occur in front of the flag `*'. %%# %%# \Index-;*{Flip Flop} generates %%# %%# Flip-Flop %%# %%# FlopFlip %%# %%# and outputs {Flip-Flop} (!!!!!!!) %%# %%# \Index>{Flippy Flop!GO}[*2-1-2 2!1-1 1-12 +] %%# %%# generates %%# %%# Flop %%# Flippy-Flippy (no tilde!) %%# %%# Flippy-Flippy Flop %%# %%# Flippy %%# ~ Flop %%# %%# and outputs {GO-Flippy-GO} (!!!) %%# %%# \Index*_,{shape {of a} of star} generates %%# %%# shape of a star %%# %%# star, shape of ~ (sorted like "star, shape of") %%# %%# and outputs {shape of a star}. %%# %%# \Index1*{$L$ feature@L feature} %%# \Index,{No $L$@L feature} %%# generate %%# %%# $L$ feature (sorted like "L feature") %%# %%# No %%# ~ $L$ feature (sorted like "L feature") %%# %%# feature, No $L$ ~ (sorted like "feature, No L") %%# %%# and outputs {$L$ feature}. %%# %%# %%# 9. Example of a simple modification of the \varindextwo macros: %%# %%# \def\myindextwoScan{% %%# \varindextwoScan %%# \varindexNewFlag ~\vxtSpaceA %%# \varindexNewFlag 1\vxtSpaceB %%# \varindexNewFlag !\varindexOneEntry %%# \varindexMakeSplitExpand{/}{vxtSplitAtMagic}% %%# \def\varindexStarPos{}% %%# } %%# \def\myIndex{\varindex(){\myindextwoScan}{\varindextwo}[]} %%# %%# \myIndex behaves similar to the previous example with %%# the following differences: %%# 1. The flag `1' now has the previous meaning of "~". %%# 2. One may now use "~" and "_" equivalently. %%# 3. The flag `!' now has the originial meaning of the flag `1'. %%# 4. Instead of `+' in the format string, the character `/' has to be used. %%# %%# %%# Description: %%# %%# There are two possible calls: %%# %%# a) \varindex[textstyle][pagestyleA]flags{main entries}{format}[pagestyleB] %%# %%# Here, [textstyle], [pagestyleA], [pagestyleB], and flags are optional. %%# (If [textstyle] is omitted, also [pagestyleA] must be omitted). %%# %%# textstyle: describes the textstyle used for the output into the %%# running text (typically, textstyle is \emph or empty). %%# pagestyle: describes the pagestyle used for the output of the pagenumber %%# (you may also use a construct like |see{...} here). %%# If [pagestyleB] is present, this is the value used. %%# Otherwise, the value of [pagestyleA] is used (resp. nothing). %%# flags can be one (or both) of the following tokens: %%# `*': "Output into running text": %%# If no * is used in the format string (see below), %%# then the format is automatically prepended by the tokens `* ' %%# resp. `*' (depending whether format starts with ` ' or not) %%# `1': The content of {main entries} is considered as a single entry %%# (see below). %%# {main entries} and %%# {format} are explained later. %%# %%# b) \varindex(formatA)(format*A){scanprogram}{mainprogram} %%# [textstyle][pagestyleA]flags{main entries}[formatB][pagestyleB] %%# %%# Concerning [textstyle], [pagestyleA], flags, [pagestyleB], the same %%# remarks as in a) hold. Also (format*A) and (formatA) are optional. %%# (if (formatA) is omitted, also (format*A) must be omitted). %%# %%# The "default" format is formatA resp. format*A (depending whether the %%# flag "*" has been used or not). If [formatB] is given, then this is %%# used as the format (i.e. it overrides the default). %%# %%# scanprogram is executed immediately when \varindex reads it. %%# This can be used to introduce FURTHER flags (other than '*' and `1'), %%# see below. %%# mainprogram is executed AFTER the format string(s) has been expanded. %%# %%# %%# %%# It is recommended to define personal macros which contain all parameters up %%# to the place where the flags occur (either with or without some flags, %%# depending on the intention). See the examples above. %%# %%# %%# %%# %%# The main argument (called {main entries} above) has the form %%# %%# entry1[`space' entry2][`space' entry3] ... %%# %%# where each of entry1 entry2 entry3 ... in turn has the form %%# indextext@sorttext!outputtext or %%# indextext!outputtext@sorttext %%# In each of these forms, @sorttext and !outputtext are optional. %%# Here, %%# indextext is the text which is put into the index for the entry %%# sorttext is what is used as a sort criterion for the entry %%# outputtext is what is output into the running text for the entry %%# %%# Note that the symbol @ has in a sense the opposite meaning as in the %%# original \index command: %%# BEFORE that symbol, the desired text appears, and %%# AFTER the symbol the place where it has to be sorted. %%# However, we chose the symbols @ and !, because these two %%# symbols are forbidden anyway (otherwise, makeindex will become confused). %%# %%# As usual, multiple spaces are considered as ONE space and do not generate %%# empty "ghost" entries. Moreover, a space after a TeX-command like \LaTeX %%# is eliminated by TeX and thus also not considered as a separator. %%# You may use braces {...} either around a whole entry or %%# around indextext resp. sorttext resp. outputtext to allow spaces %%# which do not act as "separators" in the corresponding part. The braces %%# around these parts will vanish. In particular, you may generate an %%# empty entry with {} or ! or @ (bordered by spaces). %%# If you want that braces occur in the OUTPUT, you have to add an %%# additional pair of braces. Be aware that you write sufficiently %%# many braces, if you really should need them: For example, %%# the command \varindex{{{{A B}}}}{} produces the index entry {A B}: %%# The outermost pair of braces is eliminated immediately by TeX. The second %%# pair is eliminated, because this is a pair around a complete entry. %%# Finally, another pair is eliminated, because it is a brace around %%# indextext. %%# With the flag `1', {main entries} is considered as one single entry. %%# Nevertheless, also with this flag, an additional pair of braces around %%# main entry is eliminated. %%# %%# %%# The format string has one of the following three forms %%# indexa[`space' indexb][`space' indexc] ... [*outputa][*outputb] ... %%# [*outputa][`space' indexa][`space' indexb][*outputc] ... %%# * %%# where the order of arguments can be arbitrarily mixed (except for the first %%# indexa in the first form). indexa indexb ... outputa ... describe the %%# format of the index entries resp. of the output into the running text. %%# The output is generated in the given order (this might be important, if %%# a pagebreak occurs during the output into the running text). %%# The last case is exceptional and equivalent to `*space'. %%# The following characters/strings describe the format: %%# %%# 1-9: entry1-9 %%# 0: entry 10 %%# ~: a placeholder sign %%# =: alternative placeholder sign %%# _: a space character %%# s: The token \space (but _ is used for the sort entry) %%# .: No space will follow %%# ,: The character , (space will follow) %%# -: The character - (no space will follow) %%# !: Create a new sublevel %%# All other tokens in this argument are forbidden. %%# The token ! makes no sense for the output in the running text and thus %%# is forbidden behind *. %%# %%# By a heuristic rule, a space is automatically inserted between two entries %%# which generate non-empty text. If the heuristic rule fails, you may always %%# force a space by either "_" or "s", or forbid a space by ".". %%# %%# If a format is empty, all entries are taken in the order of input. %%# Note that TeX eliminates concatenated spaces, and so you are able to %%# produce an empty format entry only at the end or in front of a `*'. %%# If you want to force an empty OUTPUT (is this ever useful?), you may use %%# just "." as the entry. %%# %%# A sort entry is only written to the *.idx file if it differs from the %%# text entry. %%# %%# %%# Description of the \varindextwo macros: %%# %%# The macros %%# %%# \varindextwoScan \varindextwo %%# %%# can be used together as parameters {scanprogram} resp. {mainprogram} %%# for the \varindex command. %%# If \varindex is called with these macros, and no %%# explicit format argument is given, these macros generate a format %%# depending on the number of entries in {main entries}: %%# %%# a) If there is only one entry in {main entries}, %%# then the format "1" resp. "*1 1" is generated %%# (depending whether the * flag was used or not), i.e. the %%# entry is put into the index, and printed if \varindex was %%# called with the * flag. %%# %%# b) If there are two main entries like {graulty bazola}, %%# then the format becomes { 1!~2 1!2~}, i.e. the index entries %%# %%# graulty %%# ~ bazola %%# %%# bazola %%# graulty ~ %%# %%# are produced. %%# %%# You can modify the first format entry with the following flags: %%# flags format used: If used with `*' additionally: %%# _ 12 *12 %%# - 1-2 *1-2 %%# ^ 1!~-2 resp. 1!-2 *1-2 %%# -^ 1-!~.2 resp. 1-!~2 *1-2 %%# . 1.2 *1.2 %%# .^ 1!~.2 *1.2 %%# / 1!2 (without ~) *12 %%# < no entry *12 %%# %%# Here, the combinations -^ and .^ mean that both flags are used %%# (the order plays no role). %%# The output for ^ respectively -^ is determined by the switches %%# \varindextwoDashTildetrue (default) %%# \varindextwoDashTildefalse %%# \varindextwoDashSpacetrue %%# \varindextwoDashSpacefalse (default) %%# %%# You can modify the second format entry with the following flags: %%# flags format used: %%# , 2,1~ resp. 2,1 %%# ~ 21 %%# = 2!1-~ %%# ,= 2,1-~ resp. 2,1- %%# + 2-1 %%# : 2!1.~ %%# ,: 2,1.~ resp. 2,1 %%# ; 2.1 %%# > no entry %%# ! Append ~ (if not already there) %%# ? Without ~ %%# %%# Whether the first or the second alternatives in the above forms is used %%# depends on the status of the switch %%# \varindextwoCommaTildetrue (default) %%# \varindextwoCommaTildefalse %%# We point out that "\varindextwoCommaTildefalse" was in earlier versions %%# of "varindex" the default (and could not be changed). %%# Note that this switch has no effect if the ! or ? flags are used. %%# %%# HINT for remembering the symbols: The symbols _ . - for the first entry %%# are the same flags as for the output and the same flags which are used %%# in the format string. The corresponding symbols ~ : (and ;) = (and +) %%# for the second entry "look similar". The "," is only useful in the %%# second entry (and is the same symbol as in the format string). %%# The two exceptional symbols ">" and "<" can be read as "generate only %%# the forward-directed resp. backward-directed entry". %%# %%# c) If there are three main entries like {graulty of bazola}, then the %%# format becomes { 1!~23 3!12~}, i.e. the output becomes %%# %%# graulty %%# ~ of bazola %%# %%# bazola %%# graulty of ~ %%# %%# The flags have an analogous effect to b). %%# In addition, if the flags ` resp. ' are used, the second word %%# (in our example: `of') is omitted from the output in the first resp. %%# in the second index entry. If the * flag and ` are used together, the %%# second entry is also omitted from the output into the running text. %%# %%# d) If there are four main entries like {graulty of OF bazola}, then the %%# format becomes { 1!~24 4!31~}, i.e. the output becomes %%# %%# graulty %%# ~ of bazola %%# %%# bazola %%# graulty OF ~ %%# %%# i.e. we have a similar effect as in c) except that for the first entry %%# the third word is skipped, and for the second entry the second word is %%# skipped. All flags as in c) can be used with an analogous meaning. %%# Also if the * flag is used, the output into the running text is %%# analogous to c) (the third word is skipped). %%# %%# e) If there are more than four main entries, then %%# (formatA) resp. (format*A) is used. %%# %%# If an explicit format argument is provided, then this is used except %%# when it contains the symbol +. In this case, this symbol is replaced by the %%# output which would be generated "normally". If additionally the `*'-flag %%# is used, there is a special rule: %%# If the explicit format contains a `*', then no additional `*'-output is %%# produced. Otherwise, the `*'-output from a)-e) is prepended to the given %%# format string (with a space at the end, unless the format string is empty). %%# This means that `normally' you have the output from a)-e), %%# unless you write an own `*'-part in the argument. %%# %%# If you do not like the tokens chosen for the default symbols, you can %%# easily choose your own tokens by just replacing \varindextwoScan with your %%# own macro (or defining your own ``magic'' tokens after \varindextwoScan, %%# see Example 9. above). %%# %%# %%# Primitive customization: %%# %%# %%# You may use the command %%# \varindexUsePlaceholderAfalse %%# \varindexUsePlaceholderBfalse %%# to ignore the sign ~ resp. = in the format entry. %%# You can easily restore the default by %%# \varindexUsePlaceholderAtrue %%# \varindexUsePlaceholderBtrue %%# %%# If you want to switch off the placeholder only at the beginning of %%# a new entry (resp. of a new subentry), you can use the commands %%# \varindexLeadingPlaceholderAfalse %%# \varindexLeadingPlaceholderBfalse %%# The default is restored with %%# \varindexLeadingPlaceholderAtrue %%# \varindexLeadingPlaceholderBtrue %%# %%# By default, the "," in the format string is in this connection %%# treated as a symbol generating a new "subentry". You can change this %%# default with the command %%# \varindexCommaLeadsfalse %%# You may switch back with %%# \varindexCommaLeadstrue %%# %%# %%# The content of the macro %%# \varindexPlaceholderAText %%# \varindexPlaceholderASort %%# \varindexPlaceholderBText %%# \varindexPlaceholderBSort %%# is used as the placeholder ~ resp. = in the index resp. sort entry. %%# Note that if one of these entries expands empty, different rules for %%# the automatic insertion of spaces apply (for the index and sort entry %%# separately). %%# %%# You may prefer that the placeholder text resp. sort content changes at %%# run time to the context of the previous ! entry. For example, you may %%# want that the command \varindex{Gibble Gobble}{2!~2} produces the index %%# entry %%# Gibble %%# Gibble Gobble %%# (or is at least SORTED as such an entry). %%# %%# You can achieve this with the commands %%# \varindexPreviousATexttrue %%# \varindexPreviousASorttrue %%# \varindexPreviousBTexttrue %%# \varindexPreviousBSorttrue %%# for the text and sort entry and the placeholders ~ and =, respectively. %%# With these commands, the content of \varindexPlaceholderAText etc %%# is only used as the default if no previous ! entry was given. %%# You can switch back to the default mode with the respective commands %%# \varindexPreviousATextfalse %%# \varindexPreviousASortfalse %%# \varindexPreviousBTextfalse %%# \varindexPreviousBSortfalse %%# %%# By default, the ',' in the format entry is considered in this connection %%# similar to '!'. If you want to change this, use the command %%# \varindexCommaExpandfalse %%# You may switch back with %%# \varindexCommaExpandtrue %%# %%# Since version 2.2, the dash "-" occurring at the beginning of entry %%# (or after "!" or even after "," if \varindexCommaExpandtrue is in effect) %%# is ignored for sorting. You can switch off this feature with the command %%# %%# \let\varindexOutSortDashBeg\varindexOutSortDash %%# %%# To restore the new default, use %%# %%# \let\varindexOutSortDashBeg\toolboxEmpty %%# %%# %%# The commands %%# %%# \varindexSetWordString{|} % Use | as separator for entries instead %%# % of spaces. %%# \varindexSetSortString{>} % default: @ %%# \varindexSetPlainString{<} % default: ! %%# %%# set the default "magic" strings used for the main argument. %%# The argument of the above macros is intentionally NOT expanded (so that %%# you do not have troubles with active characters like ~). %%# To force expansion, use e.g. %%# \expandafter\varindexSetWordString\expandafter{\MacroToExpand} %%# or some similar construct. %%# %%# If you use a different separator than `space' for the entries, you may want %%# to change the rule how braces are eliminated. With the commands %%# \varindexEliminateOuterBracetrue %%# \varindexEliminateInnerBracetrue %%# \varindexEliminateOuterBracefalse %%# \varindexEliminateInnerBracefalse %%# you may allow resp. forbid the elimination of braces around the entries %%# resp. around {indextext} {sorttext} and {outputtext} %%# With the flag `1', {main entries} is considered as one single entry, %%# but if \varindexEliminateOuterBracetrue is set (which is the default) %%# also in this case an additional pair of braces around main entry is %%# eliminated. %%# %%# Similarly as above, %%# %%# \varindexSetIndexString{|} % default: space %%# \varindexSetOutputString{<} % default: * %%# \varindexSetTildeAString{~} % (is default) %%# \varindexSetTildeBString{=} % (is default) %%# \varindexSetSpaceString{_} % (is default) %%# \varindexSetSpaceTokString{s} % (is default) %%# \varindexSetOmitString{.} % (is default) %%# \varindexSetCommaString{,} % (is default) %%# \varindexSetDashString{-} % (is default) %%# \varindexSetExclamString{!} % (is default) %%# \varindexSetStringForNr 1{a} % default: 1 %%# \varindexSetStringForNr{11}{b}% No default! %%# %%# sets the default "magic" strings used for the format argument. %%# In contrast to before, the arguments are fully expanded (with %%# \varindexedef, see below). %%# Note that the last command provides a way to access more than 10 entries! %%# %%# If you use \varindexSetIndexString{|} (with some non-space token), %%# you may still use spaces in the format which then are just ignored. %%# %%# %%# Avoid that one string is a prefix of another string: In this case, %%# strange effects may happen, and this behavior may even change in %%# future releases of this package. %%# Note that the above effect may arise unintentionally if you use active %%# chars. For this reason, `~' is defined to expand to the letter `~', %%# before the expansion is executed. Maybe in later releases of this package %%# there will be further such redefinitions. %%# You can explicitly use this feature in your own macros by using %%# \varindexedef instead of the usual \edef, see below. %%# %%# %%# You can change the output for the text resp sort entry of the various %%# symbols used in the format string. More precisely, you can redefine %%# %%# \varindexOutExclam % Text output for ! %%# \varindexFollowsExclam % Decide whether magic space after ! is inserted %%# \varindexOutTextComma % Text output for , %%# \varindexOutSortComma % Sort output for , %%# \varindexFollowsComma % Decide whether magic space after , is inserted %%# \varindexPreceedsComma % Decide whether magic space before , is erased %%# \varindexOutTextSpace % Text output for _ %%# \varindexOutSortSpace % Sort output for _ %%# \varindexFollowsSpace % Decide whether magic space after _ is inserted %%# \varindexPreceedsSpace % Decide whether magic space before _ is erase %%# \varindexOutTextSpTok % Text output for s %%# \varindexOutSortSpTok % Sort output for s %%# \varindexFollowsSpTok % Decide whether magic space after s is inserted %%# \varindexPreceedsSpTok % Decide whether magic space before s is erased %%# \varindexOutTextDash % Text output for - %%# \varindexOutSortDash % Sort output for - %%# \varindexOutSortDashBeg% Sort output for - if nothing preceeds %%# \varindexFollowsDash % Decide whether magic space after - is inserted %%# \varindexPreceedsDash % Decide whether magic space before - is erased %%# \varindexOutTextOmit % Text output for . %%# \varindexOutSortOmit % Sort output for . %%# \varindexFollowsOmit % Decide whether magic space after . is inserted %%# \varindexPreceedsOmit % Decide whether magic space before . is erased %%# %%# The meaning is as follows: \varindexOut... should just expand to the %%# tokens which should be written into the text resp. sort output. %%# The corresponding macro \varindexFollows... is typically defined with %%# one of the following commands: %%# \let\varindexFollows...\varindexNextSpace %%# \let\varindexFollows...\varindexNoNextSpace %%# In the first case, a space is `magically' inserted in front of a %%# subsequent token (unless this token erases the magic space). %%# In the second case, no space follows, of course. %%# There is an alternative call: %%# \def\varindexFollows...{\varindexSpaceTexttrue\varindexSpaceSortfalse} %%# This definition achieves that for the text output a space should follow, %%# but not for the sort output. Of course, you can also use similarly the %%# commands \varindexSpaceTextfalse and/or \varindexSpaceSorttrue %%# in the above definition (the effect should be obvious). %%# In particular, \varindexNextSpace is equivalent to %%# \varindexSpaceTexttrue\varindexSorttrue. %%# %%# The macro \varindexPreceeds... is similarly as \varindexFollows... with %%# the difference that it is executed BEFORE the token in question is %%# output. In particular, you can ignore a previous `magic space'. %%# All of the `magic space' commands are defined by default with %%# \let\varindexFollows...\toolboxEmpty %%# \let\varindexPreceeds...\varindexNoNextSpace %%# with the following two exceptions: %%# \let\varindexFollowsExclam\varindexNoNextSpace %%# \let\varindexFollowsComma\varindexNextSpace %%# %%# Documented Features (in later versions, these will still be available, %%# and if they contain a bug now, they will be repaired to work this way): %%# %%# (In a future release, varindex will cook your coffee, too) %%# %%# %%# %%# The main argument is NOT expanded, so you can actually write macros %%# into the *.idx file. The command actually used to write the index is %%# %%# \varindexIndex %%# %%# (which by default is of course defined as \index). %%# Since some implementations of the \index command still (partially) expand %%# their argument (which might be considered as a bug), the argument of %%# \varindexIndex is translated before the actual call with the aid of %%# \toolboxMakeHarmless. %%# If you want to redefine \varindexIndex to a personal \index-output %%# function, you might want to skip the \toolboxMakeHarmless step. %%# This is arranged with the command %%# %%# \varindexNoConvert %%# %%# You can cancel the effect of this command with %%# %%# \varindexDoConvert %%# %%# Even if \varindexNoConvert is not in effect, the main argument is not %%# expanded (and in particular, the argument of \varindexIndex consists of %%# the corresponding entries in an unexpanded form). %%# %%# The whole \varindex... procedure takes place in a group, so all your %%# variables are local to a single call (unless you use \gdef... %%# (and friends) of course). %%# %%# There are no \global directives in any macro related with this package. %%# In particular, if you call the above macros in a group (or redefine %%# \varindexIndex), the effect holds only until the end of the group. %%# %%# In contrast to the main argument, the format argument is expanded %%# (with \varindexedef, see below) %%# (and also formatA resp. format*A is expanded before), %%# so you can define abbreviations (even simple conditional abbreviations) %%# for the format. Note, however, that the expansion is essentially only %%# evaluated with \edef. So, you will probably not want to use e.g. \relax, %%# since this command expands to itself (and not into nothing - use %%# \toolboxEmpty if you want the latter). %%# If you want more complex abbreviations, use {mainprogram} instead. %%# %%# In order to help you write conditional abbreviations, the %%# following variables are defined when your macro is expanded (and in %%# particular also in {mainprogram}). You may of course redefine them %%# appropriately: %%# %%# \varindexAppend The argument pagestyleA resp. pagestyleB. %%# \varindexCount a TeX counter containing the number of entries in %%# the main argument. %%# \varindexLastEntry This is a macro (NOT a counter) which is usually %%# the value of \the\varindexCount. See below. %%# \varindexEntry1-... The (index) text occuring in entry 1-... %%# \varindexSort1-... The corresponding sort entry. If no sort entry was %%# given, this is the same as the corresponding %%# \varindexEntry1-... %%# \varindexPlain1-... The text which should be output in the text. If no %%# such entry was given, this is the same as the %%# corresponding \varindexEntry1-... %%# %%# \varindexCount may be larger than 10, and correspondingly there may be %%# also more than 10 different \varindexEntry/Sort/Plain macros. %%# If you ADD entries, you have to increase \varindexCount correspondingly, %%# otherwise an error is produced if the format string contains an entry %%# larger then \varindexCount. However, your additional entries are NOT %%# output for EMPTY formats: For empty formats the number used is %%# \varindexLastEntry. So if you want to output also your additional entries %%# in empty formats, you have to set \varindexLastEntry to your modified %%# value of \varindexCount in mainprogram. You may e.g. achieve this with %%# the following lines: %%# \expandafter %%# \def\expandafter\varindexLastEntry\expandafter{\the\varindexCount}% %%# It is admissible that \varindexLastEntry is larger than \varindexCount: %%# In this case all entries until \varindexLastEntry are %%# output in empty formats without producing an error (provided, of course, %%# that the corresponding variables \varindexEntry.../Sort.../Plain... are %%# defined). %%# %%# Note that numbers in TeX command names require special handling, %%# i.e., you have to use something like %%# %%# \csname varindexPlain2\endcsname %%# %%# to access variables. To avoid this, you may want to use the macros %%# \toolboxLet and \toolboxWithNr of the toolbox package. Examples are %%# \toolboxWithNr 1\let{varindexEntry}\toolboxEmpty %%# \toolboxWithNr {10}\def{varindexSort}{Foo} %%# \toolboxLet \mymacro{varindexPlain\the\mycount} %%# These commands set \varindexEntry1 to \toolboxEmpty, \varindexSort10 to %%# Foo, and \mymacro to the content of \varindexPlain5 (if \mycount=5). %%# %%# All these variables are also available when {mainprogram} is expanded. %%# In {mainprogram} also the following functions are useful: %%# %%# \varindexFormat %%# This macro expands to the actual format string which is used. %%# The main purpose of {mainprogram} will usually be to (re)define %%# this macro. After {mainprogram} has been called, this macro is %%# modified in several ways: %%# 1. \varindexFormat is expanded (with \varindexedef, see below). %%# (thus, \varindexFormat is expanded BEFORE AND AFTER the call %%# of {mainprogram}). %%# 2. \ifvarindexStar is true (see below) a `*' resp. `* ' is prepended. %%# 3. If it is only "*", it is replaced by "* ". %%# Note that before execution of {mainprogram}, no tests on the %%# validity of the format are done: You may use your own symbols to %%# `communicate' with {mainprogram} (if {mainprogram} eliminates these %%# symbols afterwards). %%# %%# \varindexFormatDefault %%# This macro expands to formatA resp format*A (in the expanded form) %%# depending whether the * flag has been used in the call. %%# Note that this expansion was executed BEFORE the optional format %%# argument is expanded for the first time. %%# %%# \ifvarindexStar ifpart [ \else elsepart] \fi %%# If the optional * was given, the ifpart is executed, otherwise the %%# else-part. This is a TeX-if-command. In particular, by %%# \varindexStarfalse resp. \varindexStartrue %%# you may change the behavior for future if's. This can be used %%# to prevent/force that a `*' resp. `* ' is prepended to the format %%# after the execution of {mainprogram}. %%# Setting of this variable has no effect in {scanprogram} %%# %%# \ifvarindexExplicitFormat %%# This is a TeX-if-command (see above) which is true if the optional %%# format argument [formatB] was given. %%# %%# %%# To "compose" the format, you may want to use the macros %%# %%# \toolboxDef\macrotodefine{argumentlist} %%# \toolboxAppend\macrotoappend{argumentlist} %%# \varindexedef\macrotodefine{argumentlist} %%# %%# All commands work similar to \def resp. \edef with two differences: %%# %%# For \toolboxDef\macro the argumentlist is expanded precisely by one level %%# (for details, see the documentation of the toolbox package). %%# Of course, for \toolboxAppend, the new definition is appended to the old %%# definition of \macro. %%# %%# \varindexedef fully expands argumentlist. However, some active symbols %%# (currently only ~, but additional symbols might follow in a future release) %%# are deactivated before expansion, so that ~ actually expands to ~ and not %%# to a strange command sequence. %%# %%# %%# To "decompose" the format, you may want to use one of the macros %%# %%# \toolboxSplitAt{arg}{critical}{\before}{\after} %%# \toolboxMakeSplit{critical}{command} resp. %%# \varindexMakeSplitExpand{\MacrosWhichExpandToCritical}{command} %%# \varindexMakeVarSplit\variable{\MacrosWhichExpandToCritical}{command} %%# %%# The first two macros are described in the toolbox package. %%# The remaining two macros are similar to \varindexMakeSplit with the %%# difference that the argument {critical} is obtained by expanding %%# \MacrosWhichExpandToCritical with the aid of \varindexedef. %%# In the last form, additionally \variable is (re)defined to expand to %%# the value of critical. %%# %%# The following instances of a command created by \toolboxMakeSplit %%# exist (the content of "critical" should be obvious): %%# %%# \varindexSplitAtIndex (generated by \varindexSetIndexString) %%# \varindexSplitAtOutput %%# \varindexSplitAtTildeA %%# \varindexSplitAtTildeB %%# \varindexSplitAtSpace <- Here the default content of "critical" is "_" %%# \varindexSplitAtSpaceTok<- Here the default content of "critical" is "s" %%# \varindexSplitAtOmit %%# \varindexSplitAtComma %%# \varindexSplitAtDash %%# \varindexSplitAtExclam %%# \varindexSplitAtNr?? (here, ?? is the number as a string; use %%# \csname ....\endcsname to call this macro. Only those numbers are %%# admissible which have been introduced with \varindexSetStringForNr %%# (this is the case for 1-10)). %%# %%# There is also the instance %%# \varindexSplitSpace (to be distinguished from \varindexSplitAtSpace) %%# where "critical" is the space symbol. %%# %%# %%# In addition, you may use the variables %%# \varindexIndexString %%# \varindexOutputString %%# \varindexTildeAString %%# .... %%# \varindexNr??String %%# which expand to the corresponding strings. %%# %%# All the previous macros should not be redefined `by hand'. %%# They are implicitly redefined by the \varindexSet... commands. %%# %%# %%# %%# %%# To drop possible braces, use the command %%# %%# \toolboxDropBrace\variable %%# %%# of the toolbox package. %%# %%# %%# In {scanprogram} you may already want to call \toolboxMakeSplit: %%# In this way many choices for the tokens are put into {scanprogram}, %%# and in this sense, you can consider {mainprogram} as `customizable'. %%# Anyway, the main task of {scanprogram} is to introduce new flags with %%# %%# \varindexNewFlag\token\position[program\varindexEndOfFlag] %%# or %%# \varindexNewFlag\token\position[\programmacro] %%# %%# Here, \position is an (undefined) macro, and \token an arbitrary token. %%# The [program(macro)] part is optional and is explained later. %%# If token is entered in the current call of \varindex instead (or in %%# addition to) the star, then \position is defined to expand to a %%# (literally) number, namely the (last) position where token was given %%# inside the "*-argument-list" (counting from 0). For example, if %%# \varindexNewFlag ,\commapos %%# \varindexNewFlag -\minuspos %%# \varindexNewFlag .\pointpos %%# are used in \programA, then in the call %%# \varindex(){\programA}{\programB},-**-{} %%# the variable \commapos will expand in \programB to `0', while %%# \minuspos will expand to `4' (the last position is taken). Finally, %%# \pointpos is \undefined (unless you defined \pointpos differently AFTER %%# the call of \varindexNewFlag; in this case, this is the default). %%# If \varindexNewFlag is called multiple times with the same token, %%# only the LAST call with this token takes effect. %%# %%# The flags `*' and `1' are introduced in this way with %%# %%# \varindexNewFlag *\varindexStarPos %%# \varindexNewFlag 1\varindexOneEntry %%# %%# BEFORE {scanprogram} is executed. This means: %%# 1. Usually, \varindexStarPos contains the (last) position of `*' %%# (resp. is undefined). Moreover, if you define \varindexStarPos in %%# {scanprogram} or in some flag, you get the same effect as if `*' %%# had been used. %%# An analogous remark holds for \varindexOneEntry. %%# 2. If you introduce `*' with \varindexNewFlag, the `*' looses its %%# original meaning. The same holds for `1'. %%# %%# If you have added a [program(macro)] part, this part is expanded %%# whenever the flag introduced by \token is used in the call of \varindex %%# (note that it is not excluded that this happens several times within one %%# call). More precisely, program is expanded AFTER the variable \position has %%# been set to the corresponding value, so you may already use \position in %%# the program part. %%# %%# IMPORTANT: The last token expanded in program MUST be \varindexEndOfFlag. %%# This is not nice but has to do with the way TeX parses its arguments. %%# Also if you use the form \programmacro, the VERY LAST token expanded %%# must be \varindexEndOfFlag. Even a construction like %%# \def\myprogrammacro{\ifx.... %%# \CallSomeMacroWithvarindexEndOfFlagAtTheEnd %%# \fi %%# \varindexEndOfFlag} %%# is forbidden: In \CallSomeMacroWithvarindexEndOfFlagAtTheEnd an error %%# would occur at the end, since still the tokens \fi\varindexEndOfFlag %%# are in the tokenlist when EndOfFlag is reached there. %%# As a workaround, you may e.g. use %%# \def\myprogrammacro{\ifx... %%# \def\execute{....\varindexEndOfFlag}% %%# \else %%# \def\execute{\varindexEndOfFlag}% %%# \execute} %%# %%# If you use the form [\programmacro], your macro may even read additional %%# parameters. These parameters are expected in the call of \varindex BEHIND %%# the flag you have introduced. So you may actually use flags with %%# parameters. For example, if \scanprogram contains a macro like %%# \varindexNewFlag -\minuspos[\readpara] %%# and you have defined %%# \def\readpara#1{\def\merk{#1}\varindexEndOfFlag} %%# then the call \varindex(){\scanprogram}{\mainprg}*-{Foo}-{Foo 2}*{Entries} %%# is admissible, and in mainprogram, \merk will have the value Foo 2. %%# %%# If you are more familiar with TeX, you can even allow OPTIONAL arguments %%# following your flag: The value of the next (non-space) token is at the %%# call of \programmacro already saved into the variable %%# \varindexNextToken, %%# so you can just use it to test for e.g. [. In this connection, you may %%# also want to use the commands %%# \varindexTestAndExec %%# \varindexSkipAndExec %%# Please, see the program text how these commands are applied. %%# Since version 2.1 you can also hack in personal extensions of the format %%# string. To do this, use the command %%# %%# \varindexNewFormat\splitcommand{action} %%# %%# Here, \splitcommand is a command generated by \toolboxMakeSplit or %%# friends (preferably by \varindexMakeSplitExpand, because the command should %%# act on the format string which is expand with \varindexedef). %%# The string where it splits is the new string you can use %%# in the format argument after this call. For each %%# occurrence of the corresponding string in the format argument, %%# action will be executed. If \splitcommand splits at a string which already %%# had a previous meaning in the format string (or which is a prefix to %%# such a string), the old meaning of these tokens in the format string is %%# overridden. %%# %%# Typically, action will contain the following commands: %%# One action will probably be to output a desired token (sequence) via %%# %%# \varindexTokensOut{TextToken}{SortToken} %%# or %%# \varindexTokensOutExpand\MacroForTextToken\MacroForSortToken %%# %%# In the first form, TextToken resp. SortToken is the token sequence put %%# into the index or running text respectively into the sort entry of the %%# index for the corresponding format entry. The second form is similar with %%# the only difference that the arguments must be single macros which expand %%# to TextToken and SortToken, respectively. %%# %%# The variable \ifvarindexIndexMode can be used to test whether the %%# output goes into the running text or into the index (i.e. whether a `*' %%# preceeded the current entry). For output into the text, SortToken is %%# ignored, of course). %%# %%# Another action in \varindexNewFormat will probably be to take care of the %%# magic space flags. This is achieved by a call to \varindexNextSpace or %%# \varindexNoNextSpace (or separately via \varindexSpaceTexttrue/false resp. %%# \varindexSpaceTexttrue/false); see the earlier description. %%# The magic space flags are taken into account in "\varindexTokensOut". %%# Thus, if you want to ignore the previous flag for some reason you should %%# set them correspondingly before this call. %%# However, after the call you should also set them correspondingly for %%# further processing. %%# %%# Example: %%# \varindexMakeSplitExpand{:}{splitAtColon} %%# \varindexNewFormat\splitAtColon{% %%# \varindexNoNextSpace %%# \ifvarindexIndexMode %%# \varindexTokensOut{:}{}\varindexSpaceTexttrue %%# \else %%# \varindexTokensOut{---}{}\varindexNoNextSpace %%# \fi} %%# %%# defines a new format entry `:' which has the meaning that a colon %%# (automagically followed by a space) is put into the index but not into %%# the sort entry. Moreover, in the running text, the colon appears as a %%# long dash with no space followed. In any case, there is no magic space %%# output in front of the colon. %%# %%# As an alternative action in \varindexNewFormat, you can also call the %%# default commands for the format entries. The corresponding macros are %%# %%# \varindexAddSpace _ %%# \varindexAddSpTok s %%# \varindexAddOmit . %%# \varindexAddDash - %%# \varindexAddComma , %%# \varindexAddExclam ! %%# \varindexAddTildeA ~ %%# \varindexAddTildeB = %%# \varindexAddNumber{number} 0-9 (the argument is 1-...) %%# %%# The precise meaning of these macros is intentionally NOT documented, %%# because some details or side effects might change in a future release of %%# "varindex". But just for this reason, it might be advantageous to use the %%# above macros instead of writing personal substitutes which may fail to %%# have such side effects. %%# %%# Example: %%# \varindexMakeSplitExpand{~-}{splitPhrase}% It is important to expand %%# % (to have correct ~ catcode) %%# \varindexNewFormat\splitPhrase{% %%# \varindexAddTildeA %%# \let\remember\varindexPreceedsDash %%# \let\varindexPreceedsDash\toolboxEmpty %%# \varindexAddDash %%# \let\varindexPreceedsDash\remember} %%# %%# After the above command, "~" and "-" have their usual meaning in %%# the format string except when they follow immediately in the form "~-". %%# In this case, the behavior of "-" changes as if \varindexPreceedsDash %%# were empty (which has the effect that the output looks like "~ -" instead %%# of "~-". %%# Note that although "~" is a prefix to "~-", the converse is not true: %%# Thus, the above command does not change the previous meaning of "~" %%# (and of course also not of "-"). %%# %%# Some hack: %%# Tex ignores leading spaces in the argument list of a `normal' macro. %%# This has the effect that you should be able to insert spaces BETWEEN any %%# of your arguments without any trouble. %%# If this does not work the expected way, you can use the command %%# %%# \let\varindexArgumentSpace\varindexSkipTricky %%# %%# which implements an own macro which does this task. Sadly, this can only %%# be done with some catcode trickery which in turn might bring you in trouble %%# with some (VERY) exotic packages. You can restore the default with %%# %%# \let\varindexArgumentSpace\varindexSkipDefault %%# %%# %%# All above custamization commands/variables may be used anytime between %%# two \varindex calls. They take effect with the next \varindex call. %%# The macros \varindextwoScan and \varindextwo are considered as a %%# (very useful) EXAMPLE for the customization of the \varindex command. %%# If you need further customization, have a look at their definition first. % This is the end of the ascii documentation % %\fi\catcode\#6\relax % % \iffalse %<*metainfo> % \fi % \def\basename{varindex} %% \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 \~} % \CheckSum{2042} % \iffalse % \RecordChanges % \fi % \def\mypar{} % \def\ChangesTab{}\let\orichanges\changes % \def\changes#1#2#3{\orichanges{#1}{#2}{#3}% % \expandafter\def\expandafter\ChangesTab\expandafter{\ChangesTab % \item[v#1 {\mdseries(\emph{#2})}] {#3.}}} % \newcommand{\cmdcite}[1]{\texttt{\textbackslash#1}} % \changes{2.3}{2013/11/26}{Update email, add license. Date/version remains the % same since only commments and documentation are modified} % \changes{2.3}{2001/05/06}{Introduced new macros \cmdcite{varindexIndex}, % \cmdcite{varindexDoConvert}, \cmdcite{varindexNoConvert}. % The layout of the documentation was slightly improved. % Moreover, a completely new section was added (on % \cmdcite{toolboxMakeDef}).\mypar % Use \cmdcite{typeout} instead of \cmdcite{message}, % but provide a workaround for plain \TeX. Avoid error with % plain \TeX\ and \LaTeX 2.09 (because \cmdcite{newcount} is % defined there as \cmdcite{outer} which is rather annoying). % Since \texttt{toolbox} works around this problem, finally also % the local \cmdcite{if}'s now actually \emph{are} local} % \changes{2.2}{2001/05/01}{Introduced \texttt{=:\^} flags into % \cmdcite{varindextwo}. Changed sorting of entries % starting with ``\texttt{-}'' % (see \cmdcite{varindexOutSortDashBeg}).\mypar % Improved documentation, in particular of \cmdcite{varindextwo} % and \cmdcite{varindexNewFormat}. % Also new examples were added for both commands} % \changes{2.1}{2001/04/30}{Finally implemented placeholder replacement % (\cmdcite{varindexPreviousATexttrue} and friends) such that % it works also in the expected way with commas.\mypar % Introduced separated command \cmdcite{varindexCommaExpandtrue} % which was in earlier versions automatically coupled with % \cmdcite{varindexCommaLeadstrue}. Changed the default of both % values to `true'.\mypar % Introduced \cmdcite{varindexOutText...} and friends and enabled % a hook into the format string processing via % \cmdcite{varindexNewFormat}.\mypar % Reordered documentation such that the more interesting % customization parts are now mentioned earlier} % \changes{1.21}{2001/03/29}{Divided package into two: Many macros which are % of independent interest have been put into the \texttt{toolbox} % package. For the user visible is that the macros are now called % e.\,g.\ \cmdcite{toolboxMakeSplit} instead of % \cmdcite{varindexMakeSplit}. For backward compatibility, % the old (now obsolete) names are still available, although not % documented anymore} % \changes{1.20}{2001/01/13}{Changed \cmdcite{varindextwo}: % Added the \cmdcite{varindextwoCommaTilde} functionality and the % corresponding three flags \texttt{?!/}. Moreover, changed the % default to \cmdcite{varindextwoCommaTildetrue}. Note that due to % this change the generated index entries may differ from those % of earlier versions. To get a backward compatible output, % you have to use \cmdcite{varindextwoCommaTildefalse}.\mypar % Also use now the symbols \texttt{`} and \texttt{'} % instead of the (now obsolete) \texttt{P} and \texttt{p} flags. % The reason for the latter is that \texttt{P} and \texttt{p} % could not be used immediately after a command without a space} % \changes{1.19}{2000/12/07}{Eliminated a bug in the \texttt{P} flag} % \changes{1.18}{2000/11/30}{Eliminated a bug in \cmdcite{SkipTricky}} % \changes{1.17}{2000/11/21}{\cmdcite{varindexNr??String} is now defined % as documented} % \changes{1.16}{2000/11/19}{Documentation rewritten % for doc and docstrip utilities (required files are now % \texttt{varindex.dtx} and \texttt{varindex.ins})} % \changes{1.15}{2000/10/10}{Fixed harmless bug which always caused a warning} % \changes{1.14}{2000/06/01}{First version released into public % (as \texttt{varindex.sty})} % % \iffalse % % The following part is the code needed to compile the documentation. % We do some trickery here, because we want that this file here could be used % for *both*: Compiling the documentation *and* as `varindex.sty' % (if really required). % Everything between the lines %<*driver> and % % goes to the file `varindex.tex'. % % \fi \ifcat @a% If this test is positive, then `@' has letter catcode which means % that this file is loaded as a style file (or as described in the % install section of the documentation). \def\TemporaryDummy{} \else\long\def\TemporaryDummy{% % % % \iffalse % %<*driver> \documentclass{ltxdoc} \OnlyDescription%% Comment this out, or %%\AlsoImplementation%% uncomment this line, if you want to see the source. %% If you want an index, uncomment one of the following lines. %% After running latex a first time, you have to use %% makeindex -s gind.ist varindex %% Then run latex again. %%\CodelineIndex% comment this out if you want an index referring to codelines %%\PageIndex% comment this out if you want an index referring to pages %%\OldMakeindex% uncomment this line, if your MakeIndex is pre-v2.9 \setlength\hfuzz{15pt} \hbadness=7000 \begin{document} \DocInput{varindex.dtx} \end{document} % %<*metainfo> % \fi } \fi\TemporaryDummy\let\TemporaryDummy\undefined % % \iffalse % Personal macros used for the doc utility: % \fi % \MakeShortVerb{"} % \def\bracemeta#1{\texttt{\{}\meta{#1}\texttt{\}}} % \def\nocomment{} % \def\myspace{\texttt{\textvisiblespace}} % \parindent0pt % % \newenvironment{myquote}{\begin{quote}\begin{raggedright}\relax %}{\end{raggedright}\end{quote}} % \newenvironment{myindex}{\begin{myquote}}{\end{myquote}} % \def\myi{\par\hangindent 40pt\relax} % \def\mys{\myi\hspace*{20pt}} % \def\myss{\myi\hspace*{30pt}} % \def\pnoa#1{, #1} % \def\pno{\pnoa{17}} % \def\mysee#1{\pnoa{\emph{see also} #1}} % \def\sortedlike#1{\hspace*{10pt}(\emph{sorted like} #1)} % \def\sortedlikeq#1{\sortedlike{``#1''}} % \def\proz{\texttt{\%}} % \def\ppari{\proz\\\hspace*{20pt}} % \def\pari{\\\hspace*{20pt}} % \def\myquad{\mbox{$\qquad$}} % \def\macrott#1{{\mdseries\cmdcite{#1}}} % \sloppy % \title{The \texttt{varindex} package\thanks % {This package has version number \fileversion{}, last revised \filedate. % The package may be distributed and/or modified under the conditions of the % LaTeX Project Public License, either version 1.3c of this license or (at % your option) any later version. The latest version of this license is in % \texttt{http://www.latex-project.org/lppl.txt}, and version 1.3c or later % is part of all distributions of LaTeX version 2005/12/01 or later.}} % \author{Martin V\"ath\thanks{This package bases on ideas of % \texttt{indextwo.sty} which was written jointly with % O.~Karch \texttt{karch@informatik.uni-wuerzburg.de} and % H.-C.~Wirth \texttt{wirth@informatik.uni-wuerzburg.de}}\\ % {\texttt{martin@mvath.de}}} % \date{\docdate} % \maketitle % \begin{abstract} % This \LaTeX\ package provides a luxury front-end for the "\index" command. % For example, it allows to generate multiple \index entries in % almost any form by a single command. It is extremely customizable, and works % with all versions of \LaTeX\ and probably most other \TeX\ formats, too. % \end{abstract} % You may copy this package freely, as long as you distribute only unmodified % and complete versions. % \tableofcontents % \section{Changes} % % \begin{description} % \def\mypar{\par}\ChangesTab % \end{description} % % \section{Introduction} % % If you have to write an index for a larger scientific text, you will probably % sooner or later have the problem that you want to put certain texts into the % index which consist of more than one word like \emph{Theorem of Picard}. % \par % There are several reasonable ways how one might do this: One might put the % text "Theorem of Picard" in the index, or "Picard theorem". % An alternative way is "Picard, Theorem", or "Picard's Theorem" % or "Theorem!Picard" % (here, "!" is the symbol used by "makeindex" to separate a % subindex, i.\,e.\ the output will actually look like % \begin{myindex} % \myi Theorem % \mys Picard\pno % \end{myindex} % This is useful if one also has other entries starting with \emph{Theorem}). % Several other natural alternatives are also possible. % \par % One may choose some or all of the above alternatives and then code them into % \TeX. However, if more than one of these alternatives is desired in the % index, this requires several "\index" commands (which are similar but not % identical). Moreover, if later another choice of the above alternatives % is required, the index entries must be completely rewritten. % This rewriting may be very cumbersome if one makes use of subindices % for two reasons. % \par % First, it may happen that one has to change even entries which are % apparently not affected. For example, assume there were just two subindices % for the index entry \emph{Theorem}, namely "Theorem!Picard" and % "Theorem!Riemann". If the theorem of Picard is eliminated from the main % text, one not only has to delete the entry "Theorem!Picard": The single % subindex "Theorem!Riemann" does not make much sense -- one should replace % it by "Theorem, Riemann". One could write a program to do this task % automatically, but my experience shows that it is better to do such things % by hand, because there are some situations where exceptions are desirable. % \par % However, things become really cumbersome, if one also has to sort the % entries in a different way than they are written. For example, suppose % that instead of \emph{Theorem} in the above example, one has the text % \emph{$\zeta$-function} which one wants to have sorted like % \emph{zeta-function}. In this case, the "\index" % command must be changed from % \begin{verbatim} % \index{zeta-function@$\zeta$-function!Riemann}\end{verbatim} % % into % \begin{verbatim} % \index{zeta-function, Riemann@$\zeta$-function, Riemann}\end{verbatim} % % which is rather different! % \par % Moreover, one may also want to have a placeholder. For example, instead of % generating the entries % \begin{myindex} % \myi Theorem % \mys Liouville\pno % \mys Open Mapping\pno % \mys Picard\pno % \end{myindex} % One might like to have entries like % \begin{myindex} % \myi Theorem % \mys $\sim$ of Liouville\pno % \mys Open Mapping $\sim$\pno % \mys $\sim$ of Picard\pno % \end{myindex} % One might use the symbol "$\sim$" for the placeholder, but this needs of % course its own sort entry in the "\index" command (in the above example, % we sorted by \emph{Liouville}, \emph{Open Mapping}, and \emph{Picard}, % respectively, which is perhaps the most natural choice). % \par % With the package "varindex" it is rather simple to generate any of the % above "\index" entries, and it is easy to modify them, e.\,g.\ the above % placeholders can be introduced easily and then activated or deactivated by % a switch. Moreover, several "\index" entries like "Picard, Theorem of" % and "Theorem of Picard" can be generated simultaneously with a % \emph{single} command (i.\,e.\ you have to write the phrase % "Theorem of Picard" only once). In addition, it is also possible to produce % not only corresponding "\index" commands but also to output the content % into the running text. % \par % Since my experience shows that in each new book there arise new special cases % for the "\index" command, I was trying to provide a % \emph{highly customizable} solution which can be modified for all % needs (I hope). % \section{Installation} % % This package was tested with \LaTeX 2.09 and \LaTeXe\ and should work % with all other (future) versions of \LaTeX\ and friends, too. % It should even run with other (non-\LaTeX) formats if an "\index" command % (with \LaTeX-Syntax) is provided. % % To use ``varindex'', you have to put the file "varindex.sty" in a path where % \TeX\ looks for its input files. You must also have the file "toolbox.sty" % of the ``toolbox'' package in your path (toolbox~v3.1 or newer is required). % The \TeX\ documents using varindex need the % following modifications in their header: % % \begin{itemize} % \item If you use \LaTeXe, put in the preamble the command % \begin{verbatim} % \usepackage{varindex}\end{verbatim} % % \item If you use \LaTeX 2.09, use "varindex" as a style option, e.\,g.\ % \begin{verbatim} % \documentstyle[varindex]{article}\end{verbatim} % or % \begin{verbatim} % \documentstyle[varindex,12pt]{article}\end{verbatim} % % \item If you use some other (non-\LaTeX) format, you will probably have to % insert a line like % \begin{verbatim} % \catcode`\@=11\relax\input varindex.sty\catcode`\@=12\relax\end{verbatim} % % \end{itemize} % % For \TeX\ insiders: \LaTeX-specific commands used in "varindex.sty" are only: % % \begin{itemize} % \item "\makeatother" % \item "\makeatletter" % \item "\typeout" % \item "\RequirePackage" % \item "\newcommand" (used only in the form "\newcommand{"\meta{command}"}{}" % to ensure that \meta{command} was not defined before) % \item "\ProvidesPackage" % \end{itemize} % The above commands are used only if they are defined (otherwise, % natural substitutes are used ("\newcommand" and "\ProvidesPackage" are % then not used at all)).\bigskip % \section{Additional hint} % % Although this package provides a convenient way to write "\index" commands, % this may not be sufficient: Also with this package, the "\index" commands % may still be rather complex. For some books, it might be necessary to write % the same "\index" entries several times (to get various page numbers). % The first idea that one might have in this case is to define a list of the % used "\index" commands near the beginning of the document e.\,g.\ as: % \begin{verbatim} % \newcommand{\Index}{\varindex(){\varindextwoScan}{\varindextwo}[]} % \newcommand{\Riemann}{\Index{Riemann Stieltjes integral}[1-23 2,1-~3 3!1-2~]} % \newcommand{\sigmaa}{\Index-={$\sigma$@sigma algebra}}\end{verbatim} % (the first line and the usage of "\Index" is explained in later sections; % here, it is sufficient to know that "\Index" produces in the above form % several "\index" entries). % To produce the corresponding "\index" entries in the % running text, one then just needs to use "\Riemann" resp.\ "\sigmaa". % However, this method has some disadvantages: % \begin{enumerate} % \item If one has many "\index" entries, it is easy to forget that e.\,g.\ % "\sigmaa" is a command which should produce an index entry. % Then "\sigmaa" in the main text might be rather confusing. % \item One has to take care of macros already provided by \TeX, \LaTeX\ or % some packages. For example, it is not possible to use the name % "\sigma" for the above purpose. % \end{enumerate} % To avoid these problems, one may be very disciplinary and call the % involved macros systematically e.\,g.\ "\IndexRiemann" "\Indexsigmaa" etc. % However, this produces terrible long and unreadable macro names in the main % text.\par % The "toolbox" package (version 3.1 or newer) provides a more convenient % solution: You can use the command % \begin{verbatim} % \newcommand{\Index}{\varindex(){\varindextwoScan}{\varindextwo}[]} % \toolboxMakeDef{Idx}{#1}\end{verbatim} % and afterwards % \begin{verbatim} % \NewIdx{R-S}{\Index{Riemann Stieltjes integral}[1-23 2,1-~3 3!1-2~]} % \NewIdx{sigma-algebra}{\Index-={$\sigma$@sigma algebra}}\end{verbatim} % After these definitions, you can use the intuitive commands % "\Idx{R-S}" and "\Idx{sigma-algebra}" to produce the corresponding % index entries.\par % Note also the symbol ``-'' in the above names which is usually not allowed % in \TeX\ macros.\par % % If several page numbers occur for one index entry, it may be convenient for % the reader if the ``main page number(s)'' (e.\,g.\ the place(s) % where the corresponding notion is defined) is written in a different style. % Of course, this is supported by "\varindex" (as explained later). To use this % feature in connection with "\toolboxMakeDef", there are several % possibilities. A straightforward way is to add in addition to the above % commands also % \begin{verbatim} % \NewIdx{R-S*}{\Index[|textbf]% % {Riemann Stieltjes integral}[1-23 2,1-~3 3!1-2~]} % \NewIdx{sigma-algebra*}{\Index[|textbf]% % -={$\sigma$@sigma algebra}}\end{verbatim} % Then "\Idx{R-S*}" and "\Idx{sigma-algebra*}" produce index entries % with boldface page numbers. Of course, you can automatize the task of % generating macros which produce normal and boldface page numbers % e.\,g.\ as follows: % \begin{verbatim} % \newcommand{\Index}{\varindex(){\varindextwoScan}{\varindextwo}[]} % \toolboxMakeDef{Idx}{#1} % \newcommand{\MakeIdx}[2]{% % \NewIdx{#1}{\Index#2}% % \NewIdx{#1*}{\Index[|textbf]#2}} % % \MakeIdx{R-S}{{Riemann Stieltjes integral}[1-23 2,1-~3 3!1-2~]} % \MakeIdx{sigma-algebra}{-={$\sigma$@sigma algebra}}\end{verbatim} % This provides the commands "\Idx{R-S}" "\Idx{R-S*}" % "\Idx{sigma-algebra}" and "\Idx{sigma-algebra*}" with the same functionality % as explained before.\par % % The above approach has the disadvantage that the names ``$\ldots$"*"'' have % automatically a fixed meaning. Alternatively, you can also generate different % main commands. This is immediately supported by "\toolboxMakDef": % \begin{verbatim} % \newcommand{\Index}{\varindex(){\varindextwoScan}{\varindextwo}[]} % \toolboxMakeDef{Idx}{\Index#1} % \toolboxMakeDef{IdxMain}{\Index[|textbf]#1} % % \NewIdx{R-S}{{Riemann Stieltjes integral}[1-23 2,1-~3 3!1-2~]} % \NewIdxMain{R-S}{% % {Riemann Stieltjes integral}[1-23 2,1-~3 3!1-2~]}\end{verbatim} % Now you can use "\Idx{R-S}" and "\IdxMain{R-S}" to produce the % normal respectively boldface page numbers. Of course, you can also automatize % in this case the task of generating these commands: % \begin{verbatim} % \newcommand{\Index}{\varindex(){\varindextwoScan}{\varindextwo}[]} % \toolboxMakeDef{Idx}{\Index#1} % \toolboxMakeDef{IdxMain}{\Index[|textbf]#1} % \newcommand{\NewIdxBoth}[2]{% % \NewIdx{#1}{#2}% % \NewIdxMain{#1}{#2}} % % \NewIdxBoth{R-S}{{Riemann Stieltjes integral}[1-23 2,1-~3 3!1-2~]} % \NewIdxBoth{sigma-algebra}{-={$\sigma$@sigma algebra}}\end{verbatim} % After the above commands, you can use "\Idx{R-S}", "\IdxMain{R-S}", % "\Idx{sigma-algebra}" and "\IdxMain{sigma-algebra}" with their obvious % meaning.\par\bigskip % % \textbf{Summarizing}: The last of the above solutions is the one which % I recommend.\par\bigskip % % For further possibilities of the "\toolboxMakeDef" command (like making % copies of entries, redefining entries, etc.), please read the % original documentation of the "toolbox" package. % \section{Examples} % % Probably you are very impatient and want to see some examples. % So, here you are -- but be warned that the examples are not explained in % detail. You have to read the later sections to understand more precisely % why the examples work the way they do. % \par % Since the "\varindex" command is highly customizable, % the following examples can only give you a rough impression of what % you can actually do with it. % % \subsection{Typical example of usage (using the \texttt{varindextwo} macros)} % \label{s:firstex} % % Suppose the following customization of the "\varindex" command was defined: % \begin{verbatim} % \def\Index{\varindex(){\varindextwoScan}{\varindextwo}[\emph]}\end{verbatim} % % Since we used the "varindextwo" macros here, by default % \emph{two} "\index" entries are generated with a single command. % After the above definition, the command % \begin{verbatim} % \Index{ring with $1$@one}\end{verbatim} % % will produces the "\index" entries for: % % \begin{myindex} % \myi ring % \mys $\sim$ with $1$\pno\sortedlikeq{with one} % \myi $1$\sortedlikeq{one} % \mys ring with $\sim$\pno\sortedlike % {``ring with'' (without \mbox{``$\sim$''!})} % \end{myindex} % % One of the examples of the introduction can be generated with % \begin{verbatim} % \Index*{Theorem of@ Picard}\end{verbatim} % which produces the two "\index" entries for % % \begin{myindex} % \myi Theorem % \mys $\sim$ of Picard\pno\sortedlikeq{Picard} % \myi Picard % \mys Theorem of $\sim$\pno\sortedlikeq{Theorem} % \end{myindex} % In this example, the word "of" is ignored for the sorting, because we put % the symbol "@"\meta{nothing} behind it which means that it should be sorted % as the empty string (in cases like this, also the space in front of "Picard" % is automatically ignored for the sort entry). % % Since we used in the above example the form "\Index*" instead of "\Index", % additionally the text "\emph{Theorem of Picard}" is output into the running % text (the string "\emph" stems from our customization of "\Index" defined % in the beginning). % \bigskip % % \emph{Completely} different entries may be generated by your own rules. % To this end, an optional parameter "["\meta{format}"]" can be appended. % Internally, the main argument is splitted into words which are numbered % $1,2,\ldots$; in \meta{format}, you can refer to these words simply % by using the corresponding numbers. An ``empty'' entry in \meta{format} % means all words in the original order (i.\,e.\ it is essentially equivalent % to $12345\ldots$). Some other symbols besides numbers are also allowed % which are listed later. % % \begin{verbatim*} %\Index{Hausdorff measure of noncompactness}[4,23 2!~34!1= ]\end{verbatim*} % generates \emph{three} index entries: % % \begin{myindex} % \myi noncompactness, measure of\pno % \myi measure % \mys $\sim$ of noncompactness % \myss Hausdorff $\approx$\pno % \myi Hausdorff measure of noncompactness\pno % \end{myindex} % % The last of these entries occurs only, because the last character in % the \meta{format} argument "[4,23"\myspace"2!~34!1="\myspace"]" is a space % (the space following "=" tells "varindex" that another (empty) entry is % desired). % \par % % If you want only slight modification(s) of the default, you need also just % slight modification(s) of the command, e.\,g. % \begin{verbatim} % \Index*,{ring with $1$@one}\end{verbatim} % % has the same effect as in our earlier example, % just that the second entry reads % % \begin{myindex} % \myi $1$, ring with $\sim$\pno\sortedlikeq{one, ring with} % \end{myindex} % Moreover, since the `"*"' occurred in the previous command, additionally % % \begin{verbatim} % \emph{ring with $1$}\end{verbatim} % % appears in the running text. Praxis shows that changes in the entries as % above have to be made frequently in the `fine tuning' of the index of a % book. Note that with the original "\index", the command would have to be % changed completely for the above entries, because we have a ``sort'' entry % for which a different rule applies if we use a subitem (``"!"'') % instead of a ``","\myspace''. % (BTW: "\varindex" produces sort entries only if they are necessary). % \par % % Of course, you may combine the default with your own format: % \begin{verbatim*}\Index{internal integrable function}[23,1~ +]\end{verbatim*} % % generates % \begin{myindex} % \myi internal function, integrable $\sim$\pno % \myi internal % \mys $\sim$ integrable function\pno % \myi function % \mys internal integrable $\sim$\pno % \end{myindex} % In this example, the first entry is generated by the symbols "23,1~" in the % \meta{format} argument, and the last two entries are those entries which % would have been generated by the "varindextwo" macros if no \meta{format} % argument had been given -- the magic symbol "+" instructs the "varindextwo" % macros to not suppress these entries. % % % \subsection{A simple example without the \texttt{varindextwo} macros} % % As known from "\index", a "|see{...}" can be used to produce a reference to % another index entry instead of a page number. Such a command may optionally % be appended. % \begin{verbatim*} %\varindex*{topology of a normed space}{5!4~!1= 45,12}[|see{norm}] %\end{verbatim*} % \begin{myindex} % \myi space % \mys normed $\sim$ % \myss topology $\approx$\mysee{norm} % \myi normed space, topology of\mysee{norm} % \end{myindex} % (the precise appearance of ``\emph{see also} '' depends on how the "\see" % macro is defined in your style). The above command additionally inserts the % tokens "{topology of a normed space}" into the running text (this would not % happen if "\varindex" is used in place of "\varindex*"). % Only in the first of the above entries, an `"@"' part will be added to the % "*.idx" file: This entry is sorted as if ``\myspace$\sim$'' resp.\ % ``\myspace$\approx$'' would not exist. % % % \subsection{Another example without the \texttt{varindextwo} macros} % % The appearance of the cited page number and the appearance in the % running text (only available with ``"*"'') can be customized easily. % % \begin{verbatim} % \varindex[\emph][|textbf]% % {$\sigma$@sigma!$(\sigma-)$ finite {measure space}}% % {*1.23 23 23,1- 1-23}\end{verbatim} % % generates the three index entries % \begin{myindex} % \myi finite measure space\pnoa{\textbf{42}} % \myi finite measure space, $\sigma$-\pnoa{\textbf{42}}\sortedlikeq % {finite measure space, \mbox{sigma-}} % \myi $\sigma$-finite measure space\pnoa{\textbf{42}}\sortedlikeq % {sigma-finite measure space} % \end{myindex} % In all three entries the pages are printed using "\textbf". % Moreover, the tokens % \begin{verbatim} % \emph{($\sigma$-)finite measure space}\end{verbatim} % % are put into the running text. % % \subsection{A simple example using a flag % (without the \texttt{varindextwo} macros)} % % Note the token "1" in the following command: % \begin{verbatim} % \varindex1{$L$ and $M$@L and M}{}\end{verbatim} % % This command generates the index entry % \begin{myindex} % \myi $L$ and $M$\pno\sortedlikeq{L and M} % \end{myindex} % With the command % \begin{verbatim} % \varindex1*{$L$ and $M$@L and M}{}\end{verbatim} % or % \begin{verbatim} % \varindex*1{$L$ and $M$@L and M}{}\end{verbatim} % % additionally, "{$L$ and $M$}" is output into the running text. % % Note that without the `"1"', the index generated were % \begin{myindex} % \myi "$L$ and $M$ and M"\pno\sortedlikeq{"\$L\$ and L and M"} % \end{myindex} % % \subsection{An example for very primitive customized index commands % (without the \texttt{varindextwo} macros)} % % If you defined your ``default'' shortcuts appropriately, you can still % override some of your own defaults. % % \begin{verbatim} % \def\myindexA{\varindex[\emph][|textbf]*} % \def\myindexB{\varindex(){}{}[\emph][|textbf]} % % \myindexA{Foo1}{} % \myindexB{Foo2}[][] % \myindexB*{Foo3!{Foo 3}}\end{verbatim} % % Generates the index entries "Foo1", "Foo2", and "Foo3". Moreover, % "\emph{Foo1}" and "\emph{Foo 3}" is put into the running text. % The page number of "Foo 2" in the index is printed normal (i.\,e.\ "|textbf" % is overridden), the others with "\textbf". Note that by using braces, % it was possible to include a space into the text "Foo 3". % % % \subsection{An example of a primitive customized index command % (without the \texttt{varindextwo} macros)}\label{s:myindex} % % \TeX\ code can be inserted to customize the default formatting string. % \begin{verbatim} % \def\myindex{\varindex(\ifnum\varindexCount=2 1!2 2,1\fi){}{}[\emph]} % % \myindex{Foo Bar}\end{verbatim} % % generates the index entries % \begin{myindex} % \myi Foo % \mys Bar\pno % \myi Bar, Foo\pno % \end{myindex} % % \begin{verbatim} % \myindex*{Foo Bar}\end{verbatim} % % generates the same index entries as above and additionally outputs % "\emph{Foo Bar}" into the running text. % % \begin{verbatim} % \myindex*{other format}[21]\end{verbatim} % % generates the index entry % \begin{myindex} % \myi format other\pno % \end{myindex} % and outputs "\emph{other format}" into the running text. % % \begin{verbatim} % \myindex[|textbf]*{BoBo}\end{verbatim} % % generates the index entry % \begin{myindex} % \myi BoBo\pnoa{\textbf{42}} % \end{myindex} % where the page number is printed with "\textbf". % Moreover, "\emph{BoBo}" is output into the running text. % % \subsection{A primitive varying customized index command % (without the \texttt{varindextwo} macros)} % % \begin{verbatim} % \def\myindex{\varindex(\ifnum\varindexCount=2 1!2 2,1\fi)% % (\ifnum\varindexCount=2*2,1 1!2 2,1\fi){}{}[\emph]}\end{verbatim} % % With the same commands as in Section~\ref{s:myindex}, the same index entries % are generated, but the tokens "\emph{Far, Boo}", "\emph{other format}", % and "\emph{Bobo}" are output into the running text. % % % \subsection{Examples with the \texttt{varindextwo} macros} % % As mentioned earlier, if the "varindextwo" macros are used (and if % the main arguments contains at least two entries), then two % "\index" entries are generated by default. Roughly speaking, one "\index" % entry is the argument in its given order and the other is the argument in % reverse order (this is not precise, but explains the idea).\par % % For the following examples, % we use a similar definition for "\Index" as in Section~\ref{s:firstex}, % and define an "\iemph" macro which has `"*"' as a default and outputs with % "\emph". I recommend to put both sort of definitions into the preamble of % all of your files which should use "varindex" (the names are of course % subject to your personal taste). % % \begin{verbatim} % \def\Index{\varindex(){\varindextwoScan}{\varindextwo}[]} % \def\iemph{\varindex(){\varindextwoScan\def\varindexStarPos{}}% % {\varindextwo}[\emph]}\end{verbatim} % % (note that the apparently simpler definition % \begin{verbatim} % \def\iemph{\varindex(){\varindextwoScan}{\varindextwo}[\emph]*}\end{verbatim} % is not as good as the above definition of "\iemph" as is explained below). % % After the above customization, you may use the following commands. % \begin{verbatim} % \Index*{measure of $\gamma$-noncompactness@gamma-noncompactness!FOO} % \end{verbatim} % generates the index entries % \begin{myindex} % \myi measure % \mys $\sim$ of $\gamma$-noncompactness\pno\sortedlikeq % {of gamma-noncompactness} % \myi $\gamma$-noncompactness\sortedlike{gamma-noncompactness} % \mys measure of $\sim$\pno % \end{myindex} % and outputs the tokens "{measure of FOO}" into the running text. % Note the order of the words! % % \begin{verbatim} % \Index*,?_'{flic of flac}\end{verbatim} % % generates % \begin{myindex} % \myi flic of flac\pno % \myi flac, flic\pno % \end{myindex} % and outputs "{flic of flac}". Here, the two tokens "_" and "," had the % effect that a space resp.\ ``","\myspace'' was used instead of a subentry % in the first resp.\ second "\index" entry; the token "'" caused the % preposition "of" to disappear in the second entry, and the token "?" % suppressed a trailing $\sim$ in the second entry.\par % % A more realistic example is % \begin{verbatim} % \Index^={$\sigma$@sigma algebra}\end{verbatim} % % which in both entries inserts a ``-'': % % \begin{myindex} % \myi $\sigma$\sortedlikeq{sigma} % \mys $\sim$-algebra\sortedlike{``algebra'' or ``-algebra'', see below} % \myi algebra % \mys $\sigma$-$\sim$\pno\sortedlikeq{sigma-} % \end{myindex} % Here, the sorting ``-algebra'' is chosen when you used % \begin{verbatim} % \let\varindexOutSortDashBeg\varindexOutSortDash\end{verbatim} % as described later.\par % % The flag "^" in conjunction with "-" has a special meaning: % \begin{verbatim} % \Index^->{$\sigma$@sigma algebra}\end{verbatim} % Then the first entry reads instead (the second is canceled because of ">"): % % \begin{myindex} % \myi $\sigma$-\sortedlikeq{sigma-} % \mys $\sim$ algebra\pno\sortedlikeq{algebra} % \end{myindex} % % Similarly, the conjunction "^" and "." has a special meaning: % \begin{verbatim} % \Index^.,:{ultra filter}\end{verbatim} % % generates entries without a space following $\sim$ (and in view of the flag % "," no new subentry is used for the second entry but instead a ``,''): % % \begin{myindex} % \myi ultra % \mys $\sim$filter\pno\sortedlike{filter} % \myi filter, ultra$\sim$\pno\sortedlike{filter, ultra} % \end{myindex} % % For crossreferences, one may use something like % \begin{verbatim} % \iemph[|see{recursive recursion}],_{recursive recursion}\end{verbatim} % % which generates % \begin{myindex} % \myi recursive recursion\mysee{recursive recursion} % \myi recursion, recursive $\sim$\mysee{recursive recursion} % \end{myindex} % and outputs "\emph{recursive recursion}". If we would have used instead the % definition % \begin{verbatim} % \def\iemph{\varindex(){\varindextwoScan}{\varindextwo}[]*}\end{verbatim} % % the above call were not possible, since the optional arguments "[|see...]" % must occur in front of the flag `"*"'. % % \begin{verbatim} % \Index-;*{Flip Flop}\end{verbatim} % % generates % \begin{myindex} % \myi Flip-Flop\pno % \myi FlopFlip\pno % \end{myindex} % and outputs "{Flip-Flop}" (note that the symbol "-" which is caused by the % flag "-" occurs also in the output). % % One may freely create other entries: % \begin{verbatim} % \Index>{Flippy Flop!GO}[*2-1-2 2!1-1 1-12 +]\end{verbatim} % % generates % \begin{myindex} % \myi Flop % \mys Flippy-Flippy\pno\qquad\emph{(no ``$\sim$''!)} % \myi Flippy-Flippy Flop\pno % \myi Flippy % \mys $\sim$ Flop\pno % \end{myindex} % and outputs "{GO-Flippy-GO}" (note that even without an explicit "*" flag, % we were able to generate this output, just by using the "*" in % \meta{format}). % % \begin{verbatim} % \Index*_,{shape {of a} of star}\end{verbatim} % % generates % \begin{myindex} % \myi shape of a star\pno % \myi star, shape of $\sim$\pno\sortedlike{star, shape of} % \end{myindex} % and outputs "{shape of a star}". Note that for the first entry the % proposition ``"of a"'' was chosen while for the second entry the % alternative proposition "of" was chosen. % % Also with the "varindextwo" macros the other flags keep their old meaning. % For example, the flag "1" still means that the main argument is % considered as a single entry. % \begin{verbatim} % \Index1*{$L$ feature@L feature} % \Index,{No $L$@L feature}\end{verbatim} % % generate % \begin{myindex} % \myi $L$ feature\pno\sortedlikeq{"L feature"} % \myi No % \mys $\sim$ $L$ feature\pno\sortedlikeq{"L feature"} % \myi feature, No $L$ $\sim$\pno\sortedlikeq{"feature, No L"} % \end{myindex} % and outputs "{$L$ feature}". % % % \subsection{Example of a simple modification of the % \texttt{varindextwo} macros}\label{ss:expatch} % % All flags and magic tokens in "varindextwo" can be customized to fit your % own taste, just by modifying "\varindextwoScan". % % \begin{verbatim} % \def\myindextwoScan{% % \varindextwoScan % \varindexNewFlag ~\vxtSpaceA % \varindexNewFlag 1\vxtSpaceB % \varindexNewFlag !\varindexOneEntry % \varindexMakeSplitExpand{/}{vxtSplitAtMagic}% % \def\varindexStarPos{}% % } % \def\myIndex{\varindex(){\myindextwoScan}{\varindextwo}[]}\end{verbatim} % % % "\myIndex" behaves similar to the previous example with % the following differences: % \begin{enumerate} % \item The flag "1" now has the previous meaning of "~". % \item One may now use "~" and "_" equivalently. % \item The flag "!" now has the original meaning of the flag "1". % \item Instead of "+" in the format string, the character "/" has to be used. % \end{enumerate} % % \section{Main Description} % % Without additional customization, there are two possible calls for the % \DescribeMacro{\varindex}"\varindex" command: % % \begin{enumerate} % \item[a)] The first call has the form % \begin{myquote} % "\varindex["\meta{textstyle}"]["\meta{pagestyleA}"]"\meta{flags}\ppari % \bracemeta{main entries}\bracemeta{format}"["\meta{pagestyleB}"]" % \end{myquote} % Here, "["\meta{textstyle}"]", "["\meta{pagestyleA}"]", % "["\meta{pagestyleB}"]", and \meta{flags} are optional. % (But if "["\meta{textstyle}"]" is omitted, also "["\meta{pagestyleA}"]" % must be omitted). % % The meaning of the arguments is as follows: % \begin{description} % \item[\mdseries\meta{textstyle}] describes the textstyle used for the output % into the running text (typically, textstyle is "\emph" or empty). % \item[\mdseries\meta{pagestyle}] describes the pagestyle used for the output % of the page number (you may also use a construct like "|see{...}" here). % If "["\meta{pagestyleB}"]" is present, this is the value used. % Otherwise, the value of "["\meta{pagestyleA}"]" is used % (resp.\ nothing). % \item[\mdseries\meta{flags}] can be one (or both) of the following tokens: % \begin{description} % \item[\mdseries "*"] If this token appears in \meta{flag}, it has roughly % the meaning ``Output into running text''. More precisely, if no % "*" is occurs in \meta{format} (see below), then \meta{format} % is automatically prepended by the tokens ``"*"\myspace'' resp.\ % ``"*"'' (depending whether \meta{format} starts with a space % or not). % \item[\mdseries "1"] With this flag, the content of \meta{main entries} is % considered as a single entry (see below). % \end{description} % \item[\mdseries\meta{main entries}] and % \item[\mdseries\meta{format}] are explained later. % \end{description} % % \item[b)] The alternative form to call "\varindex" is % \begin{myquote} % "\varindex("\meta{formatA}")("\meta{format*A}")"\relax % \bracemeta{scan program}\ppari % \bracemeta{main program}"["\meta{textstyle}"]["\meta{pagestyleA}"]"\relax %\meta{flags}\ppari % \bracemeta{main entries}"["\meta{formatB}"]["\meta{pagestyleB}"]" % \end{myquote} % The arguments "["\meta{textstyle}"]", "["\meta{pagestyleA}"]", \meta{flags}, % and "["\meta{pagestyleB}"]" have the same meaning as in a) (in particular, % they are optional, but if "["\meta{textstyle}"]" is omitted, also % "["\meta{pagestyleA}"]" must be omitted). % % Also "("\meta{format*A}")" and "("\meta{formatA}")" are optional, % but if "("\meta{formatA}")" is omitted, also "("\meta{format*A}")" % must be omitted. % % The ``default'' value for \meta{format} is \meta{formatA} resp.\ % \meta{format*A} (depending whether the flag "*" has been used or not). % If "["\meta{formatB}"]" is given, then this is used as the format (i.\,e.\ % the optional argument \meta{formatB} can be used to override the default). % % The other values are: % \begin{description} % \item[\mdseries\meta{scan program}] is executed (i.\,e.\ expanded) % immediately when "\varindex" reads it. This parameter can be used % to introduce \emph{further} flags (other than "*" and "1"), see below. % \item[\mdseries\meta{main program}] is executed \emph{after} the % \meta{format} string(s) has been expanded. % \end{description} % \end{enumerate} % % It is recommended to define personal macros which contain all parameters up % to the place where \meta{flags} occurs (either with or without some flags, % depending on the intention). See the examples section. % \bigskip\par % % \meta{main entries} is the main argument which has the following form % % \begin{myquote} % \meta{entry1}[\myspace\meta{entry2}][\myspace\meta{entry3}]$\ldots$ % \end{myquote} % % where each of \meta{entry1} \meta{entry2} \meta{entry3} $\ldots$ % in turn has the form % \begin{myquote} % \meta{indextext}"@"\meta{sorttext}"!"\meta{outputtext} % \end{myquote} % or % \begin{myquote} % \meta{indextext}"!"\meta{outputtext}"@"\meta{sorttext} % \end{myquote} % In each of these forms, "@"\meta{sorttext} and "!"\meta{outputtext} % are optional. Here, % \begin{description} % \item[\mdseries\meta{indextext}] % is the text which is put into the index for the entry % \item[\mdseries\meta{sorttext}] % is what is used as a sort criterion for the entry % \item[\mdseries\meta{outputtext}] % is what is output into the running text for the entry % \end{description} % % Note that the symbol "@" has in a sense the opposite meaning as in the % original "\index" command: % \emph{Before} that symbol, the desired text appears, and % \emph{after} the symbol the place where it has to be sorted. % However, we chose the symbols "@" and "!", because these two % symbols are forbidden anyway (otherwise, "makeindex" will become confused). % % As usual, multiple spaces are considered as \emph{one} space and do not % generate empty ``ghost'' entries. Moreover, a space after a \TeX-command % like "\LaTeX" is eliminated by \TeX\ and thus also not considered as a % separator. You may use braces"{"$\ldots$"}" either around a whole entry or % around \meta{indextext} or \meta{sorttext} or \meta{outputtext} to allow % spaces which do not act as ``separators'' in the corresponding part. % The braces around these parts will vanish. In particular, you may generate an % empty entry with "{}" or "!" or "@" (bordered by spaces). % If you want that braces occur in the \emph{output}, you have to add an % additional pair of braces. Be aware that you write sufficiently % many braces, if you really should need them: For example, % the command "\varindex{{{{A"\myspace"B}}}}{}" produces the index entry % "{A"\myspace"B}": The outermost pair of braces is eliminated immediately % by \TeX. The second pair is eliminated, because this is a pair around a % complete entry in \meta{main entries}. Finally, another pair is eliminated, % because it is a brace around \meta{indextext}. % With the flag `"1"', \meta{main entries} is considered as one single entry. % Nevertheless, also with this flag, an additional pair of braces around % \meta{main entry} is eliminated.\bigskip % % % The \meta{format} has one of the following three forms: % \begin{myquote} % \meta{IndexA}[\myspace\meta{IndexB}][\myspace\meta{IndexC}]$\ldots$\relax %["*"\meta{OutputA}]["*"\meta{OutputB}]$\ldots$\\\relax %["*"\meta{OutputA}][\myspace\meta{IndexA}][\myspace %\meta{IndexB}]["*"\meta{OutputC}]$\ldots$\\ % "*" % \end{myquote} % where the order of arguments can be arbitrarily mixed (except for the first % \meta{IndexA} in the first form). \meta{IndexA} \meta{IndexB} $\ldots$ % \meta{OutputA} $\ldots$ describe the format of the index entries resp.\ % of the output into the running text. % The output is generated in the given order (this might be important, if % a pagebreak occurs during the output into the running text). % The last case is exceptional and equivalent to ``"*"\myspace''. % The following characters/strings are allowed in the format entries: % \par\bigskip % % \begin{tabular}[t]{ll} % token &meaning\\\hline % "1"--"9"&\meta{entry1}--\meta{entry9}\\ % "0" &\meta{entry10}\\ % "~" &a placeholder sign (default is $\sim$)\\ % "=" &a secondary placeholder sign (default is $\approx$)\\ % "_" &the space character ``\myspace''\\ % "s" &The token ``"\space"'' % (but ``\myspace'' is used for the sort entry)\\ % "." &No space will follow (see below)\\ % "," &The character ``","'' (space will follow)\\ % "-" &The character ``"-"'' (no space will follow)\\ % "!" &Create a new sublevel (subitem). % \end{tabular}\par\bigskip % % All other tokens in this argument are forbidden. (Note that the magic % symbol "+" in \meta{format} is handled by the "varindextwo" macros, and % not by "varindex").\par % The token ``"!"'' above makes no sense for the output in the running text % and thus is forbidden behind "*".\par % % By a heuristic rule, a space is automatically inserted between two entries % which generate non-empty text. If the heuristic rule fails, you may always % force a space by either ``"_"'' or ``"s"'', or forbid a space by ``"."''. % % If a format is empty, all entries are taken in the order of input. % Note that \TeX\ eliminates concatenated spaces, and so you are able to % produce an empty format entry only at the end of \meta{format} or in front % of a ``"*"''. If you want to force an empty \emph{output} % (is this ever useful?), you may use just ``"."'' as the entry.\\ % % A sort entry is only written to the "*.idx" file if it differs from the % text entry. % % \section{Description of the \texttt{varindextwo} macros} % % The macros % \DescribeMacro{\varindextwoScan} % \DescribeMacro{\varindextwo} % \begin{verbatim} % \varindextwoScan \varindextwo\end{verbatim} % % can be used together as parameters \meta{scan program} resp.\ % \meta{main program} for the "\varindex" command. % If "\varindex" is called with these macros, and no % explicit format argument is given, these macros generate a format % depending on the number of entries in \meta{main entries}: % % \begin{enumerate} % \item[a)] If there is only one entry in \meta{main entries}, then the format % ``"1"'' resp.\ ``"*1"\myspace"1"'' is % generated (depending whether the "*" flag was used or not), i.\,e.\ the % entry is put into the index, and printed if "\varindex" was % called with the "*" flag. % % \item[b)] If there are two entries in \meta{main entries}, then % \meta{format} becomes ``\myspace"1!~2"\myspace"1!2~"''. For example, if % \meta{main entries} is ``"graulty bazola"'', then the "\index" entries % % \begin{myindex} % \myi graulty % \mys $\sim$ bazola\pno % \myi bazola % \mys graulty $\sim$\pno % \end{myindex} % % are produced.\par % You can modify the first format entry with the following flags:\par % \bigskip % % \begin{tabular}[t]{lll} % flags&format used&with ``"*"'' additionally\\\hline % "_" &"12" &"*12"\\ % "-" &"1-2" &"*1-2"\\ % "^" &"1!~-2" resp.\ "1!-2" &"*1-2"\\ % "-^"&"1-!~.2" resp.\ "1-!~2"&"*1-2"\\ % "." &"1.2" &"*1.2"\\ % ".^"&"1!~.2" &"*1.2"\\ % "/" &"1!2" (without "~") &"*12"\\ % "<" &no entry &"*12" % \end{tabular}\par\bigskip % % Here, the combinations "-^" and ".^" mean that both flags are used % (the order plays no role). % The output for "^" respectively "-^" is determined by the switches % \begin{myquote} % \DescribeMacro{\varindextwoDashTildetrue}"\varindextwoDashTildetrue" % (default)\par % \DescribeMacro{\varindextwoDashTildefalse}"\varindextwoDashTildefalse" % \end{myquote} % and % \begin{myquote} % \DescribeMacro{\varindextwoDashSpacetrue}"\varindextwoDashSpacetrue"\\ % \DescribeMacro{\varindextwoDashSpacefalse}"\varindextwoDashSpacefalse" % (default) % \end{myquote} % respectively. The last entry in the above table is an additional format % entry which is generated if also the ``"*"'' flag is used.\par % % You can modify the second format entry with the following flags:\par % \bigskip % % \begin{tabular}[t]{ll} % flags&format used\\\hline % "," &"2,1~" resp.\ "2,1"\\ % "~" &"21"\\ % "=" &"2!1-~"\\ % ",="&"2,1-~" resp.\ "2,1-"\\ % "+" &"2-1"\\ % ":" &"2!1.~"\\ % ",:"&"2,1.~" resp.\ "2,1"\\ % ";" &"2.1"\\ % ">" &no entry\\ % "!" &Append "~" (if not already there)\\ % "?" &Without trailing "~" % \end{tabular}\par\bigskip % % Whether the first or the second alternatives in the above forms is used % depends on the status of the switch % \begin{myquote} % \DescribeMacro{\varindextwoCommaTildetrue}"\varindextwoCommaTildetrue" % (default)\\ % \DescribeMacro{\varindextwoCommaTildefalse}"\varindextwoCommaTildefalse" % \end{myquote} % We point out that "\varindextwoCommaTildefalse" was in earlier versions of % "varindex" the default (and could not be changed). % Note that this switch has no effect if the ! or ? flags are used.\par % % \textbf{Hint} for remembering the symbols: The symbols "_" "." "-" % for the first entry are the same flags as for the output and the same % flags which are used in the \meta{format} argument. % The corresponding symbols "~" ":" (and ";") "=" (and "+") for the second % entry ``look similar''. The "," flag is only useful in the second entry % (and is the same symbol as in the \meta{format} argument). % The two exceptional symbols ">" and "<" can be read as ``generate only the % `forward-directed' resp.\ `backward-directed entry'\,''.\par % % % \item[c)] If there are three entries in \meta{main entries}, then % \meta{format} becomes ``\myspace"1!~23"\myspace"3!12~"''. % For example, if \meta{main entries} is ``"graulty of bazola"'', then % the following two "\index" entries are produced. % % \begin{myindex} % \myi graulty % \mys $\sim$ of bazola\pno % \myi bazola % \mys graulty of $\sim$\pno % \end{myindex} % % The flags have an analogous effect to~b). % In addition, if the flags "`" resp.\ "'" are used, the second entry % (in our example: ``of'') is omitted from the output in the first % resp.\ in the second index entry. If the flags "*" and "`" % are used together, the second entry is also omitted from the output % into the running text. % % \item[d)] If there are four entries in \meta{main entries}, then % \meta{format} becomes ``\myspace"1!~24"\myspace"4!31~"''. For example, if % \meta{main entries} is ``"graulty of@ OF bazola"'', then the following % two "\index" entries are produced. % % \begin{myindex} % \myi graulty % \mys $\sim$ of bazola\pno\sortedlikeq{bazola} % \myi bazola % \mys graulty OF $\sim$\pno\sortedlikeq{graulty OF} % \end{myindex} % In other words, we have a similar effect as in~c) except that for the % first entry the third word is skipped, and for the second entry the % second word is skipped. All flags as in~c) can be used with an % analogous meaning. % Also, if the "*" flag is used, the output into the running text is % analogous to~c) (the third word is skipped). % % \item[e)] If there are more than four entries in \meta{main entries}, then % \meta{formatA} resp.\ \meta{format*A} is used. % \end{enumerate} % % If an explicit \meta{format} argument is given to "\varindex" (together with % the "\varindextwo" macro as \meta{main program}), then this format is used, % except when it contains the symbol "+". In this case, this symbol "+" is % replaced by the format which would be generated by the rules~a)--e). % If additionally the "*" flag is used, there is a special rule: % If the explicit format contains a "*", then no additional "*"-output is % produced. Otherwise, the "*"-output from~a)--e) is prepended to the given % \meta{format} (with a space at the end, unless the format string is empty). % This means that ``normally'' you have the output from a)--e), % unless you write an own explicit "*"-part in the \meta{format}. % % If you do not like the tokens chosen for the default symbols, you can % easily choose your own tokens by just replacing "\varindextwoScan" with your % own macro (or defining your own ``magic'' tokens after "\varindextwoScan", % see the example in Section~\ref{ss:expatch}). % % \section{Primitive customization} % % % You may use the command % \DescribeMacro{\varindexUsePlaceholderAfalse} % \DescribeMacro{\varindexUsePlaceholderBfalse} % \begin{verbatim} % \varindexUsePlaceholderAfalse % \varindexUsePlaceholderBfalse\end{verbatim} % to ignore the symbol "~" resp.\ "=" in the format entry. % You can easily restore the default by % \DescribeMacro{\varindexUsePlaceholderAtrue} % \DescribeMacro{\varindexUsePlaceholderBtrue} % \begin{verbatim} % \varindexUsePlaceholderAtrue % \varindexUsePlaceholderBtrue\end{verbatim} % % If you want to switch off the placeholder only at the beginning of % a new entry (resp.\ of a new subentry), you can use the commands % \DescribeMacro{\varindexLeadingPlaceholderAfalse} % \DescribeMacro{\varindexLeadingPlaceholderBfalse} % \begin{verbatim} % \varindexLeadingPlaceholderAfalse % \varindexLeadingPlaceholderBfalse\end{verbatim} % The default is restored with % \DescribeMacro{\varindexLeadingPlaceholderAtrue} % \DescribeMacro{\varindexLeadingPlaceholderBtrue} % \begin{verbatim} % \varindexLeadingPlaceholderAtrue % \varindexLeadingPlaceholderBtrue\end{verbatim} % % By default, the ``","'' in the format string is in this connection % treated as a symbol generating a new ``subentry''. You can change this % default with the command % \DescribeMacro{\varindexCommaLeadsfalse} % \begin{verbatim} % \varindexCommaLeadsfalse\end{verbatim} % You may switch back with % \DescribeMacro{\varindexCommaLeadstrue} % \begin{verbatim} % \varindexCommaLeadstrue\end{verbatim} % % % The content of the macros % \DescribeMacro{\varindexPlaceholderAText} % \DescribeMacro{\varindexPlaceholderASort} % \DescribeMacro{\varindexPlaceholderBText} % \DescribeMacro{\varindexPlaceholderBSort} % \begin{verbatim} % \varindexPlaceholderAText % \varindexPlaceholderASort % \varindexPlaceholderBText % \varindexPlaceholderBSort\end{verbatim} % is used as the placeholder "~" resp.\ "=" in the index resp.\ sort entry. % Note that if one of these entries expands empty, different rules for % the automatic insertion of spaces apply (for the index and sort entry % separately). % % You may prefer that the placeholder text resp.\ sort content changes at % run time to the context of the previous "!" entry. For example, you may % want that the command "\varindex{Gibble Gobble}{2!~2}" produces the index % entry % \begin{myindex} % \myi Gibble % \mys Gibble Gobble\pno % \end{myindex} % (or is at least \emph{sorted} as such an entry). % % You can achieve this with the commands % \DescribeMacro{\varindexPreviousATexttrue} % \DescribeMacro{\varindexPreviousASorttrue} % \DescribeMacro{\varindexPreviousBTexttrue} % \DescribeMacro{\varindexPreviousBSorttrue} % \begin{verbatim} % \varindexPreviousATexttrue % \varindexPreviousASorttrue % \varindexPreviousBTexttrue % \varindexPreviousBSorttrue\end{verbatim} % for the text and sort entry and the placeholders "~" and "=", respectively. % With these commands, the content of "\varindexPlaceholderAText" etc % is only used as the default if no previous "!" entry was given. % You can switch back to the default mode with the respective commands % \DescribeMacro{\varindexPreviousATextfalse} % \DescribeMacro{\varindexPreviousASortfalse} % \DescribeMacro{\varindexPreviousBTextfalse} % \DescribeMacro{\varindexPreviousBSortfalse} % \begin{verbatim} % \varindexPreviousATextfalse % \varindexPreviousASortfalse % \varindexPreviousBTextfalse % \varindexPreviousBSortfalse\end{verbatim} % By default, the ``","'' in the format entry is considered in this connection % similar to ``"!"''. If you want to change this, use the command % \DescribeMacro{\varindexCommaExpandfalse} % \begin{verbatim} % \varindexCommaExpandfalse\end{verbatim} % You may switch back with % \DescribeMacro{\varindexCommaExpandtrue} % \begin{verbatim} % \varindexCommaExpandtrue\end{verbatim} % % Since version 2.2, the dash ``"-"'' occurring at the beginning of entry % (or after ``"!"'' or even after ``","'' if "\varindexCommaExpandtrue" is in % effect) is ignored for sorting. % You can switch off this feature with the command % \DescribeMacro{\varindexOutSortDashBeg} % \begin{verbatim} % \let\varindexOutSortDashBeg\varindexOutSortDash\end{verbatim} % To restore the new default, use % \begin{verbatim} % \let\varindexOutSortDashBeg\toolboxEmpty\end{verbatim} % \bigskip % The commands % \begin{myquote} % \DescribeMacro{\varindexSetWordString} % "\varindexSetWordString{|}"\myquad % (Use "|" as separator for entries instead of spaces)\par % \DescribeMacro{\varindexSetSortString} % "\varindexSetSortString{>}"\myquad(default: "@")\par % \DescribeMacro{\varindexSetPlainString} % "\varindexSetPlainString{<}"\myquad(default: "!") % \end{myquote} % set the default ``magic'' strings used for \meta{main entries}. % The argument of the above macros is intentionally \emph{not} expanded (so % that you do not have troubles with active characters like "~"). % To force expansion, use e.\,g. % \begin{verbatim} % \expandafter\varindexSetWordString\expandafter{\MacroToExpand}\end{verbatim} % or some similar construct. % % If you use a different separator than ``space'' for the entries, you may % want to change the rule how braces are eliminated. With the commands % \DescribeMacro{\varindexEliminateOuterBracetrue} % \DescribeMacro{\varindexEliminateInnerBracetrue} % \DescribeMacro{\varindexEliminateOuterBracefalse} % \DescribeMacro{\varindexEliminateInnerBracefalse} % \begin{verbatim} % \varindexEliminateOuterBracetrue % \varindexEliminateInnerBracetrue % \varindexEliminateOuterBracefalse % \varindexEliminateInnerBracefalse\end{verbatim} % you may allow resp.\ forbid the elimination of braces around the entries % resp.\ around \meta{indextext} \meta{sorttext} and \meta{outputtext} % With the flag ``"1"'', \meta{main entries} is considered as one single entry, % but if "\varindexEliminateOuterBracetrue" is set (which is the default) % also in this case an additional pair of braces around main entry is % eliminated. % % Similarly as above, % \begin{myquote} % \DescribeMacro{\varindexSetIndexString} % "\varindexSetIndexString{|}" \myquad default: space\par % \DescribeMacro{\varindexSetOutputString} % "\varindexSetOutputString{<}" \myquad default: "*"\par % \DescribeMacro{\varindexSetTildeAString} % "\varindexSetTildeAString{~}" \myquad (is default)\par % \DescribeMacro{\varindexSetTildeBString} % "\varindexSetTildeBString{=}" \myquad (is default)\par % \DescribeMacro{\varindexSetSpaceString} % "\varindexSetSpaceString{_}" \myquad (is default)\par % \DescribeMacro{\varindexSetSpaceTokString} % "\varindexSetSpaceTokString{s}"\myquad (is default)\par % \DescribeMacro{\varindexSetOmitString} % "\varindexSetOmitString{.}" \myquad (is default)\par % \DescribeMacro{\varindexSetCommaString} % "\varindexSetCommaString{,}" \myquad (is default)\par % \DescribeMacro{\varindexSetDashString} % "\varindexSetDashString{-}" \myquad (is default)\par % \DescribeMacro{\varindexSetExclamString} % "\varindexSetExclamString{!}" \myquad (is default)\par % \DescribeMacro{\varindexSetStringForNr} % "\varindexSetStringForNr 1{a}" \myquad default: "1"\par % "\varindexSetStringForNr{11}{b}"\myquad No default! % \end{myquote} % set the default ``magic'' strings used for \meta{format}. % In contrast to before, the arguments are fully expanded (with % "\varindexedef", see Section~\ref{s:docufeature}). % Note that the last command provides a way to access more than $10$ entries! % % If you use "\varindexSetIndexString{|}" (with some non-space token), % you may still use spaces in the format which then are just ignored. % % % Avoid that one string is a prefix of another string: In this case, % strange effects may happen, and this behavior may even change in % future releases of this package. % Note that the above effect may arise unintentionally if you use active % chars. For this reason, ``"~"'' is defined to expand to the letter ``"~"'', % before the expansion is executed. Maybe in later releases of this package % there will be further such redefinitions. % You can explicitly use this feature in your own macros by using % "\varindexedef" instead of the usual "\edef", % see Section~\ref{s:docufeature}. % % You can change the output for the text resp sort entry of the various % symbols used in the format string. More precisely, you can redefine % % \begin{myquote} % \DescribeMacro{\varindexOutExclam} % "\varindexOutExclam" \myquad Text output for "!"\par % \DescribeMacro{\varindexFollowsExclam} % "\varindexFollowsExclam" \myquad %Decide whether magic space after "!" is inserted\par % \DescribeMacro{\varindexOutTextComma} % "\varindexOutTextComma" \myquad Text output for ","\par % \DescribeMacro{\varindexOutSortComma} % "\varindexOutSortComma" \myquad Sort output for ","\par % \DescribeMacro{\varindexFollowsComma} % "\varindexFollowsComma" \myquad %Decide whether magic space after "," is inserted\par % \DescribeMacro{\varindexPreceedsComma} % "\varindexPreceedsComma" \myquad %Decide whether magic space before "," is erased\par % \DescribeMacro{\varindexOutTextSpace} % "\varindexOutTextSpace" \myquad Text output for "_"\par % \DescribeMacro{\varindexOutSortSpace} % "\varindexOutSortSpace" \myquad Sort output for "_"\par % \DescribeMacro{\varindexFollowsSpace} % "\varindexFollowsSpace" \myquad %Decide whether magic space after "_" is inserted\par % \DescribeMacro{\varindexPreceedsSpace} % "\varindexPreceedsSpace" \myquad %Decide whether magic space before "_" is erased\par % \DescribeMacro{\varindexOutTextSpTok} % "\varindexOutTextSpTok" \myquad Text output for "s"\par % \DescribeMacro{\varindexOutSortSpTok} % "\varindexOutSortSpTok" \myquad Sort output for "s"\par % \DescribeMacro{\varindexFollowsSpTok} % "\varindexFollowsSpTok" \myquad %Decide whether magic space after "s" is inserted\par % \DescribeMacro{\varindexPreceedsSpTok} % "\varindexPreceedsSpTok" \myquad %Decide whether magic space before "s" is erased\par % \DescribeMacro{\varindexOutTextDash} % "\varindexOutTextDash" \myquad Text output for "-"\par % \DescribeMacro{\varindexOutSortDash} % "\varindexOutSortDash" \myquad Sort output for "-"\par % \DescribeMacro{\varindexOutSortDashBeg} % "\varindexOutSortDashBeg" \myquad Sort output for "-" %if nothing preceeds.\par % \DescribeMacro{\varindexFollowsDash} % "\varindexFollowsDash" \myquad %Decide whether magic space after "-" is inserted\par % \DescribeMacro{\varindexPreceedsDash} % "\varindexPreceedsDash" \myquad %Decide whether magic space before "-" is erased\par % \DescribeMacro{\varindexOutTextOmit} % "\varindexOutTextOmit" \myquad Text output for "."\par % \DescribeMacro{\varindexOutSortOmit} % "\varindexOutSortOmit" \myquad Sort output for "."\par % \DescribeMacro{\varindexFollowsOmit} % "\varindexFollowsOmit" \myquad %Decide whether magic space after "." is inserted\par % \DescribeMacro{\varindexPreceedsOmit} % "\varindexPreceedsOmit" \myquad %Decide whether magic space before "." is erased % \end{myquote} % % The meaning is as follows: "\varindexOut..." should just expand to the % tokens which should be written into the text resp.\ sort output. % The corresponding macro "\varindexFollows..." is typically defined with % one of the following commands: % \begin{verbatim} % \let\varindexFollows...\varindexNextSpace % \let\varindexFollows...\varindexNoNextSpace\end{verbatim} % In the first case, a space is `magically' inserted in front of a % subsequent token (unless this token erases the magic space). % In the second case, no space follows, of course. % There is an alternative call: % \begin{myquote} % \DescribeMacro{\varindexSpaceTexttrue} % \DescribeMacro{\varindexSpaceTextfalse} % \DescribeMacro{\varindexSpaceSorttrue} % \DescribeMacro{\varindexSpaceSortfalse} % "\def\varindexFollows...{\varindexSpaceTexttrue\varindexSpaceSortfalse}" % \end{myquote} % This definition achieves that for the text output a space should follow, % but not for the sort output. Of course, you can also use similarly the % commands "\varindexSpaceTextfalse" and/or "\varindexSpaceSorttrue" in the % above definition (the effect should be obvious). % In particular, "\varindexNextSpace" is equivalent to % "\varindexSpaceTexttrue\varindexSorttrue".\par % % The macro "\varindexPreceeds..." is similarly as "\varindexFollows..." with % the difference that it is executed \emph{before} the token in question is % output. In particular, you can ignore a previous `magic space'. % All of the `magic space' commands are defined by default with % \begin{verbatim} % \let\varindexFollows...\toolboxEmpty % \let\varindexPreceeds...\varindexNoNextSpace\end{verbatim} % with the following two exceptions: % \begin{verbatim} % \let\varindexFollowsExclam\varindexNextSpace % \let\varindexFollowsComma\varindexNextSpace\end{verbatim} % % \section{Documented Features}\label{s:docufeature} % % The title ``documented features'' means that these are hacks which allow % further customization but which are ``documented'' in the sense that these % hacks will also be available in later versions. (You use an ``undocumented'' % feature if you must use a macro name of the "varindex" package which % contains the symbol "@"). If a feature described in this section does not % work in the documented way, this is a bug and might be repaired in a % later version of "\varindex". % % (In a future release, "varindex" will cook your coffee, too).\bigskip % % % The argument \meta{main entries} is \emph{never} expanded, so you can % actually write macros into the "*.idx" file. % The command actually used to write the index is % \begin{myquote} % \DescribeMacro{\varindexIndex}"\varindexIndex" % \end{myquote} % (which by default is of course defined as "\index"). % Since some implementations of the "\index" command still (partially) expand % their argument (which might be considered as a bug), the argument of % "\varindexIndex" is translated before the actual call with the aid of % "\toolboxMakeHarmless". % If you want to redefine "\varindexIndex" to a personal "\index"-output % function, you might want to skip the "\toolboxMakeHarmless" step. % This is arranged with the command % \begin{myquote} % \DescribeMacro{\varindexNoConvert}"\varindexNoConvert" % \end{myquote} % You can cancel the effect of this command with % \begin{myquote} % \DescribeMacro{\varindexNoConvert}"\varindexNoConvert" % \end{myquote} % Even if "\varindexNoConvert" is not in effect, \meta{main entries} is not % expanded (and in particular, the argument of "\varindexIndex" consists of % the corresponding entries in an unexpanded form).\par\bigskip % % The whole "\varindex" expansion takes place in a group, so all your % variables are local to a single call (unless you use "\gdef" % (and friends) of course).\par % % There are no "\global" directives used in any macro of this package. % In particular, if you call the above macros in a group (or redefine % "\varindexIndex"), the effect holds only until the end of the group. % \par\bigskip % % In contrast to \meta{main entries}, the \meta{format} argument is expanded % (with "\varindexedef", see below) (and also \meta{formatA} resp.\ % \meta{format*A} is expanded before), so you can define abbreviations % (even simple conditional % abbreviations) for \meta{format}. % Note, however, that the expansion is essentially only evaluated with "\edef". % So, you will probably not want to use e.\,g.\ "\relax", since this command % expands to itself (and not into nothing -- use "\toolboxEmpty" if you want % the latter). % If you want more complex abbreviations, use \meta{main program} instead. % % In order to help you write conditional abbreviations, the % following variables are defined when your macro is expanded (and in % particular also in \meta{main program}). You may of course redefine them % appropriately: % % \begin{description} % \item[\macrott{varindexAppend}]\DescribeMacro{\varindexAppend} % The argument \meta{pagestyleA} resp.\ \meta{pagestyleB}. % \item[\macrott{varindexCount}]\DescribeMacro{\varindexCount} % A \TeX\ counter containing the number of entries in \meta{main entries}. % \item[\macrott{varindexLastEntry}]\DescribeMacro{\varindexLastEntry} % This is a macro (\emph{not} a counter) which is usually the value of % "\the\varindexCount". See below. % \item[\macrott{varindexEntry1} \macrott{varindexEntry2} \mdseries$\ldots$] %\DescribeMacro{\varindexEntry1-...} % The (index) text occurring in \meta{Entry1} \meta{Entry2} $\ldots$ % \item[\macrott{varindexSort1} \macrott{varindexSort2} \mdseries$\ldots$] %\DescribeMacro{\varindexSort1-...} % The corresponding sort entry. If no sort entry was given, this is % the same as the corresponding "\varindexEntry1-..." % \item[\macrott{varindexPlain1} \macrott{varindexPlain2} \mdseries$\ldots$] %\DescribeMacro{\varindexPlain1-...} % The text which should be output in the text. If no such entry was given, % this is the same as the corresponding "\varindexEntry1-..." % \end{description} % "\varindexCount" may be larger than $10$, and correspondingly there may be % also more than $10$ different "\varindexEntry"/"Sort"/"Plain" macros. % If you \emph{add} entries, you have to increase "\varindexCount" % correspondingly, otherwise an error is produced if the format string % contains an entry larger then "\varindexCount". However, your additional % entries are \emph{not} output for \emph{empty} formats: % For empty formats the entries output are $1$--"\varindexLastEntry". % So if you want to output also your additional entries % in empty formats, you have to set "\varindexLastEntry" to your modified % value of "\varindexCount" in \meta{main program}. You may e.\,g.\ achieve % this with the following lines: % \begin{myquote} % "\expandafter"\\ % "\def\expandafter\varindexLastEntry\expandafter{\the\varindexCount}"\proz % \end{myquote} % It is admissible that "\varindexLastEntry" is larger than "\varindexCount": % In this case all entries until "\varindexLastEntry" are % output in empty formats without producing an error (provided, of course, % that the corresponding variables "\varindexEntry..."/"Sort..."/"Plain..." are % defined). % % Note that numbers in \TeX\ command names require special handling, % i.\,e., you have to use something like % % \begin{verbatim} % \csname varindexPlain2\endcsname\end{verbatim} % % to access variables. To avoid this, you may want to use the macros % \DescribeMacro{\toolboxLet}"\toolboxLet" and % \DescribeMacro{\toolboxWithNr}"\toolboxWithNr" of the "toolbox" package. % Examples are % \begin{verbatim} % \toolboxWithNr 1\let{varindexEntry}\toolboxEmpty % \toolboxWithNr {10}\def{varindexSort}{Foo} % \toolboxLet \mymacro{varindexPlain\the\mycount}\end{verbatim} % These commands set "\varindexEntry1" to "\toolboxEmpty", "\varindexSort10" % to Foo, and "\mymacro" to the content of "\varindexPlain5" (if "\mycount=5"). % % All these variables are also available when \meta{main program} is expanded. % In \meta{main program} also the following functions are useful: % % \begin{description} % \item[\macrott{varindexFormat}]\DescribeMacro{\varindexFormat} % This macro expands to the actual \meta{format} which is used. % The main purpose of \meta{main program} will usually be to (re)define % this macro. After \meta{main program} has been called, this macro is % modified in several ways: % \begin{enumerate} % \item "\varindexFormat" is expanded (with "\varindexedef", see below). % (thus, "\varindexFormat" is expanded \emph{before and after} the call % of \meta{main program}). % \item "\ifvarindexStar" is true (see below) % a ``"*"'' resp.\ ``"*"\myspace'' is prepended. % \item If it is only ``"*"'', it is replaced by ``"*"\myspace''. % \end{enumerate} % Note that before execution of \meta{main program}, no tests on the % validity of the format are done: You may use your own symbols to % `communicate' with \meta{main program} (provided that \meta{main program} % eliminates these symbols afterwards). % \item[\macrott{varindexFormatDefault}]\DescribeMacro{\varindexFormatDefault} % This macro expands to \meta{formatA} resp.\ \meta{format*A} % (in the expanded form) depending whether the "*" flag has been used in % the call. Note that this expansion was executed \emph{before} % the optional format argument is expanded for the first time. % \item[\macrott{ifvarindexstar}]\DescribeMacro{\ifvarindexstar} % \meta{ifpart} [ "\else" \meta{elsepart} ] "\fi"\par % If the optional "*" was given, \meta{ifpart} is executed, otherwise % \meta{elsepart}. This is a \TeX\ "if" command. In particular, by % \DescribeMacro{\varindexStarfalse}\DescribeMacro{\varindexStartrue} % "\varindexStarfalse" resp.\ "\varindexStartrue" % you may change the behavior for future "if"'s. This can be used % to prevent/force that a ``"*"'' resp.\ ``"*"\myspace'' is prepended to % the format after the execution of \meta{main program}. % Setting of this variable has no effect in \meta{scan program}. % \item[\macrott{ifvarindexExplicitFormat}] % \DescribeMacro{\ifvarindexExplicitFormat} % This is a \TeX\ "if" command (see above) which is true if the optional % format argument \meta{formatB} was given. % \end{description} % % To ``compose'' the format, you may want to use the macros % \begin{myquote} % \DescribeMacro{\toolboxDef} % "\toolboxDef\macrotodefine"\bracemeta{argumentlist}\par % \DescribeMacro{\toolboxAppend} % "\toolboxAppend\macrotoappend"\bracemeta{argumentlist}\par % \DescribeMacro{\varindexedef} % "\varindexedef\macrotodefine"\bracemeta{argumentlist} % \end{myquote} % All commands work similar to "\def" resp.\ "\edef" with two differences: % % For "\toolboxDef\macro", \meta{argumentlist} is expanded precisely by one % level (for details, see the documentation of the "toolbox" package). % Of course, for "\toolboxAppend", the new definition is appended to the old % definition of "\macro". % % "\varindexedef" fully expands \meta{argumentlist}. However, some active % symbols (currently only "~", but additional symbols might follow in a % future release) are deactivated before expansion, so that "~" actually % expands to "~" and not to a strange command sequence. % % % To ``decompose'' the format, you may want to use one of the macros % % \begin{myquote} % \DescribeMacro{\toolboxSplitAt} % "\toolboxSplitAt"\bracemeta{arg}\bracemeta{critical}\bracemeta{command}\par % \DescribeMacro{\toolboxMakeSplit} % "\toolboxMakeSplit"\bracemeta{critical}\bracemeta{command}\par % \DescribeMacro{\varindexMakeSplitExpand} % "\varindexMakeSplitExpand"\relax %\bracemeta{macros expanding to critical}\bracemeta{command}\par % \DescribeMacro{\varindexMakeVarSplit} % "\varindexMakeVarSplit\variable"\relax %\bracemeta{macros expanding to critical}\bracemeta{command} % \end{myquote} % The first two macros are described in the "toolbox" package. % The remaining two macros are similar to "\varindexMakeSplit" with the % difference that the argument \meta{critical} is obtained by expanding % \meta{macros expanding to critical} with the aid of "\varindexedef". % In the last form, additionally "\variable" is (re)defined to expand to % \meta{critical} ("\variable" is any free name). % % The following instances of a command created by "\toolboxMakeSplit" % exist (the content of \meta{critical} should be obvious): % % \begin{myquote} % \DescribeMacro{\varindexSplitAtIndex} % "\varindexSplitAtIndex"\myquad(generated by "\varindexSetIndexString")\par % \DescribeMacro{\varindexSplitAtOutput} % "\varindexSplitAtOutput"\myquad(generated by "\varindexSetOutputString")\par % \DescribeMacro{\varindexSplitAtTildeA} % "\varindexSplitAtTildeA"\myquad(generated by "\varindexSetTildeAString")\par % \DescribeMacro{\varindexSplitAtTildeB} % "\varindexSplitAtTildeB"\myquad(generated by "\varindexSetTildeBString")\par % \DescribeMacro{\varindexSplitAtSpace} % "\varindexSplitAtSpace"\myquad(generated by "\varindexSetSpaceString"; % by default, \meta{critical} is "_")\par % \DescribeMacro{\varindexSplitAtSpaceTok} % "\varindexSplitAtSpaceTok"\myquad % (generated by "\varindexSetSpaceTokString"; % by default, \meta{critical} is "s")\par % \DescribeMacro{\varindexSplitAtOmit} % "\varindexSplitAtOmit"\myquad(generated by "\varindexSetOmitString")\par % \DescribeMacro{\varindexSplitAtComma} % "\varindexSplitAtComma"\myquad(generated by "\varindexSetCommaString")\par % \DescribeMacro{\varindexSplitAtDash} % "\varindexSplitAtDash"\myquad(generated by "\varindexSetDashString")\par % \DescribeMacro{\varindexSplitAtExclam} % "\varindexSplitAtExclam"\myquad(generated by "\varindexSetExclamString")\par % \DescribeMacro{\varindexSplitAtNr??} % "\varindexSplitAtNr1"\myquad(generated by "\varindexSetStringForNr")\par % "\varindexSplitAtNr2"\par % $\ldots$ % \end{myquote} % Note that you must use "\csname ....\endcsname" to call e.\,g.\ the macro % "\varindexSplitAtNr1". Only those numbers are admissible for % "\varindexSplitAtNr??" which have been introduced with % "\varindexSetStringForNr" (by default, this is the case for $1$--$10$). % % There is also the instance % \DescribeMacro{\varindexSplitSpace} % \begin{myquote} % "\varindexSplitSpace"\myquad % (to be distinguished from "\varindexSplitAtSpace") % \end{myquote} % where \meta{critical} is the space symbol. % % % In addition, you may use the variables % \begin{myquote} % \DescribeMacro{\varindexIndexString}"\varindexIndexString"\par % \DescribeMacro{\varindexOutputString}"\varindexOutputString"\par % \DescribeMacro{\varindexTildeAString}"\varindexTildeAString"\par % \DescribeMacro{\varindexTildeBString}"\varindexTildeBString"\par % \DescribeMacro{\varindexSpaceString}"\varindexSpaceString"\par % \DescribeMacro{\varindexSpaceTokString}"\varindexSpaceTokString"\par % \DescribeMacro{\varindexOmitString}"\varindexOmitString"\par % \DescribeMacro{\varindexCommaString}"\varindexCommaString"\par % \DescribeMacro{\varindexDashString}"\varindexDashString"\par % \DescribeMacro{\varindexExclamString}"\varindexExclamString"\par % \DescribeMacro{\varindexNr??String}\relax %"\varindexNr1String \varindexNr2String ..." % \end{myquote} % which expand to the corresponding strings.\par % % All the previous macros should not be redefined ``by hand''. % They are implicitly redefined by the "\varindexSet..." commands % (which partially also do other tasks).\par % % % % To drop possible braces, use the command % \DescribeMacro{\toolboxDropBrace} % \begin{verbatim} % \toolboxDropBrace\variable\end{verbatim} % of the "toolbox" package.\par % % In \meta{scan program} you may already want to call "\toolboxMakeSplit": % In this way, the choices for the ``magic'' tokens are made in the % (usually small) argument \meta{scan program}, and in this sense, you can % keep your (possibly rather complex) macro \meta{main program} % ``customizable'' (i.\,e.\ you can use the same macro also with a different % set of ``magic'' strings). % However, the main task of \meta{scan program} is to introduce % new flags with % % \begin{myquote} % \DescribeMacro{\varindexNewFlag} %"\varindexNewFlag"\meta{token}"\position["\meta{program}"\varindexEndOfFlag]" % \end{myquote} % or % \begin{myquote} % "\varindexNewFlag"\meta{token}"\position[\programmacro]" % \end{myquote} % Here, "\position" is an (undefined) macro, and \meta{token} an arbitrary % token. The "[program(macro)]" part is optional and is explained later. % If \meta{token} appears in \meta{flags}, then "\position" is defined to % expand to a (literally) number, namely the (last) position where token % was given inside the \meta{flags} list (counting from $0$). For example, if % \begin{verbatim} % \varindexNewFlag ,\commapos % \varindexNewFlag -\minuspos % \varindexNewFlag .\pointpos\end{verbatim} % are used in "\programA", then in the call % \begin{verbatim} % \varindex(){\programA}{\programB},-**-{}\end{verbatim} % the variable "\commapos" will expand in "\programB" to "0", while % "\minuspos" will expand to "4" (the last position is taken). Finally, % "\pointpos" is "\undefined" (unless you defined "\pointpos" differently % \emph{after} the call of "\varindexNewFlag"; in this case, this is the % default). % If "\varindexNewFlag" is called multiple times with the same token, % only the \emph{last} call with this token takes effect. % % The flags "*" and "1" are introduced in this way with % \DescribeMacro{\varindexStarPos} % \DescribeMacro{\varindexOneEntry} % \begin{verbatim} % \varindexNewFlag *\varindexStarPos % \varindexNewFlag 1\varindexOneEntry\end{verbatim} % \emph{before} \meta{scan program} is executed. This means: % \begin{enumerate} % \item Usually, "\varindexStarPos" contains the (last) position of "*" % (resp.\ is "\undefined"). Moreover, if you define "\varindexStarPos" in % \meta{scan program} or in some flag, you get the same effect as if "*" % had been used. % An analogous remark holds for "\varindexOneEntry". % \item If you introduce "*" with "\varindexNewFlag", the "*" looses its % original meaning. The same holds for "1". % \end{enumerate} % % If you have added a "[program(macro)]" part in the call of % "\varindexNewFlag", this part is expanded whenever the flag introduced % by "\token" is used in the call of "\varindex" % (note that it is not excluded that this happens several times within one % call). More precisely, program is expanded \emph{after} the variable % "\position" has been set to the corresponding value, so you may already % use "\position" in the program part. % % \textbf{Important:} The last token expanded in program \emph{must} be % \DescribeMacro{\varindexEndOfFlag}"\varindexEndOfFlag". % This is not nice but has to do with the way \TeX\ parses its arguments. % Also if you use the form "\programmacro", the \emph{very last} token expanded % must be "\varindexEndOfFlag". Even a construction like % \begin{verbatim} % \def\myprogrammacro{\ifx.... % \CallSomeMacroWithvarindexEndOfFlagAtTheEnd % \fi % \varindexEndOfFlag}\end{verbatim} % is forbidden: In "\CallSomeMacroWithvarindexEndOfFlagAtTheEnd" an error % would occur at the end, since still the tokens "\fi\varindexEndOfFlag" % are in the tokenlist when EndOfFlag is reached there. % As a workaround, you may e.\,g.\ use % \begin{myquote} % "\def\myprogrammacro{\ifx..."\pari % "\def\execute{....\varindexEndOfFlag}"\ppari % "\else"\pari % "\def\execute{\varindexEndOfFlag}"\ppari % "\execute}" % \end{myquote} % % If you use the form "[\programmacro]", your macro may even read additional % parameters. These parameters are expected in the call of "\varindex" % \emph{behind} the flag you have introduced. So you may actually use flags % with parameters. For example, if "\scanprogram" contains a macro like % \begin{verbatim} % \varindexNewFlag -\minuspos[\readpara]\end{verbatim} % and you have defined % \begin{verbatim} % \def\readpara#1{\def\merk{#1}\varindexEndOfFlag}\end{verbatim} % then the call % \begin{verbatim} % \varindex(){\scanprogram}{\mainprg}*-{Foo}-{Foo 2}*{Entries}\end{verbatim} % is admissible, and in \meta{main program}, % "\merk" will have the value ``Foo 2''. % % If you are more familiar with \TeX, you can even allow \emph{optional} % arguments following your flag: The value of the next (non-space) token is % at the call of "\programmacro" already saved into the macro % \DescribeMacro{\varindexNextToken} % \begin{verbatim} % \varindexNextToken\end{verbatim} % so you can just use it to test for e.\,g.\ ``"["''. In this connection, % you may also want to use the commands % \DescribeMacro{\varindexTestAndExec} % \DescribeMacro{\varindexSkipAndExec} % \begin{verbatim} % \varindexTestAndExec % \varindexSkipAndExec\end{verbatim} % Please, see the program text how these commands are applied.\bigskip % % Since version 2.1 you can also hack in personal extensions of the format % string. To do this, use the command % \begin{myquote} % \DescribeMacro{\varindexNewFormat} % "\varindexNewFormat\"\meta{splitcommand}\bracemeta{action} % \end{myquote} % Here, "\"\meta{splitcommand} is a command generated by "\toolboxMakeSplit" or % friends (preferably by "\varindexMakeSplitExpand", because the command should % act on the format string which is expand with "\varindexedef"). % The string where it splits is the new string you can use % in the format argument after this call. For each % occurrence of the corresponding string in the format argument, % \meta{action} will be executed. If "\"\meta{splitcommand} splits at a string % which already had a previous meaning in the format string (or which is a % prefix to such a string) the old meaning of this string in the format string % is overridden. % % Typically, action will contain the following commands: % One action will probably be to output a desired token (sequence) via % \begin{myquote} % \DescribeMacro{\varindexTokensOut} % "\varindexTokensOut"\bracemeta{text token}\bracemeta{sort token} % \end{myquote} % or % \begin{myquote} % \DescribeMacro{\varindexTokensOutExpand} % "\varindexTokensOutExpand"\meta{macro for text token}\relax %\meta{macro for sort token} % \end{myquote} % In the first form, \meta{text token} resp.\ \meta{sort token} is the token % sequence put into the index or running text respectively into the sort entry % of the index for the corresponding format entry. The second form is similar % with the only difference that the arguments must be single macros which % expand to \meta{text token} and \meta{sort token}, respectively.\par % % The variable \DescribeMacro{\ifvarindexIndexMode} % \begin{verbatim} % \ifvarindexIndexMode\end{verbatim} % can be used to test whether the output goes into the running text or into % the index (i.\,e.\ whether a ``"*"'' preceeded the current entry). % For output into the text, \meta{sort token} is ignored, of course). % % Another action in "\varindexNewFormat" will probably be to take care of % the magic space flags. This is achieved by a call of "\varindexNextSpace" or % "\varindexNoNextSpace" (or separately via "\varindexSpaceTexttrue"/"false" % resp.\ "\varindexSpaceTexttrue"/"false"); see the earlier description. % The magic space flags are taken into account in "\varindexTokensOut". % Thus, if you want to ignore the previous flag for some reason you should set % them correspondingly before this call. % However, after the call you should also set them correspondingly for % further processing.\par % % Example: % \begin{verbatim} % \toolboxMakeSplit{:}{splitAtColon} % \varindexNewFormat\splitAtColon{% % \varindexNoNextSpace % \ifvarindexIndexMode % \varindexTokensOut{:}{}\varindexSpaceTexttrue % \else % \varindexTokensOut{---}{}\varindexNoNextSpace % \fi}\end{verbatim} % defines a new format entry ``":"'' which has the meaning that a colon % (automagically followed by a space) is put into the index but not into % the sort entry. Moreover, in the running text, the colon appears as a % long dash with no space followed. In any case, there is no magic space output % in front of the colon.\bigskip % % As an alternative action in "\varindexNewFormat", you can also call the % default commands for the format entries. The corresponding macros are % \begin{myquote} % \DescribeMacro{\varindexAddSpace}"\varindexAddSpace"\myquad"_"\par % \DescribeMacro{\varindexAddSpTok}"\varindexAddSpTok"\myquad"s"\par % \DescribeMacro{\varindexAddOmit}"\varindexAddOmit"\myquad"."\par % \DescribeMacro{\varindexAddDash}"\varindexAddDash"\myquad"-"\par % \DescribeMacro{\varindexAddComma}"\varindexAddComma"\myquad","\par % \DescribeMacro{\varindexAddExclam}"\varindexAddExclam"\myquad"!"\par % \DescribeMacro{\varindexAddTildeA}"\varindexAddTildeA"\myquad"~"\par % \DescribeMacro{\varindexAddTildeB}"\varindexAddTildeB"\myquad"="\par % \DescribeMacro{\varindexAddNumber}"\varindexAddNumber"\bracemeta{number} %\myquad"0-9" (\meta{number} is "1", "2", $\ldots$) % \end{myquote} % The precise meaning of these macros is intentionally \emph{not} documented, % because some details or side effects might change in a future release of % "varindex". But just for this reason, it might be advantageous to use the % above macros instead of writing personal substitutes which may fail to % have such side effects.\par % % Example: % \begin{verbatim} % \varindexMakeSplitExpand{~-}{splitPhrase}% It is important to expand % % (to have correct ~ catcode) % \varindexNewFormat\splitPhrase{% % \varindexAddTildeA % \let\remember\varindexPreceedsDash % \let\varindexPreceedsDash\toolboxEmpty % \varindexAddDash % \let\varindexPreceedsDash\remember}\end{verbatim} % After the above command, ``"~"'' and ``"-"'' have their usual meaning in % the format string except when they follow immediately in the form ``"~-"''. % In this case, the behavior of "-" changes as if "\varindexPreceedsDash" % were empty (which has the effect that the output looks like~``$\sim$~-'' % instead of~``$\sim$-'').\par % Note that although "~" is a prefix to "~-", the converse is not true: % Thus, the above command does not change the previous meaning of~"~" % (and of course also not of~"-").\par % \bigskip % % \textbf{Some hack:} % \TeX\ ignores leading spaces in the argument list of a ``normal'' macro. % This has the effect that you should be able to insert spaces \emph{between} % any of your arguments without any trouble. % If this does not work the expected way, you can use the command % \DescribeMacro{\varindexArgumentSpace} % \DescribeMacro{\varindexSkipTricky} % \begin{verbatim} % \let\varindexArgumentSpace\varindexSkipTricky\end{verbatim} % which implements an own macro which does this task. Sadly, this can only % be done with some catcode trickery which in turn might bring you in trouble % with some (\emph{very}) exotic packages. You can restore the default with % \DescribeMacro{\varindexSkipDefault} % \begin{verbatim} % \let\varindexArgumentSpace\varindexSkipDefault\end{verbatim} % % All above customization commands/variables may be used anytime between % two "\varindex" calls. They take effect with the next "\varindex" call. % % The macros "\varindextwoScan" and "\varindextwo" are considered as a % (very useful) \emph{example} for the customization of the "\varindex" % command. If you need further customization, have a look at their % definition first. % \iffalse % % \fi % \iffalse--------------------------------------------------------------\fi % \StopEventually{\PrintChanges} % \section{Implementation} % % \iffalse-------------------------------------------------------------- % % %<*package> % \fi % \begin{macrocode} %% %% 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 % \end{macrocode} % % \subsection{The \texttt{varindextwo} (sample) macros and their ``submacros''} % \begin{macro}{\varindextwo...}\nocomment % % \begin{macrocode} %% %% 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 % \end{macrocode} % % \begin{macro}{\varindextwoScan} % The demo ``scan'' macro. It provides some new flags. % \begin{macrocode} \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 } % \end{macrocode} % \end{macro} % % \begin{macro}{\varindextwo} % The ``main'' demo macro which generates two "\index" commands % whose format depends on the number of entries in \meta{main entries} % \begin{macrocode} \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 } % \end{macrocode} % \end{macro} % Some flags used for the "varindextwo" macros. % \begin{macro}{\ifvarindextwoCommaTilde}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindextwoCommaTilde} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindextwoDashTilde}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindextwoDashTilde} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindextwoDashSpace}\nocomment % \begin{macrocode} \toolboxNewiffalse{varindextwoDashSpace} % \end{macrocode} % \end{macro} % % \begin{macro}{\vxtAddmyStar} % A submacro needed by "\varindextwo" % \begin{macrocode} \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 } % \end{macrocode} % \end{macro} % % \begin{macro}{\vxtAddmyStar} % A submacro needed by "\varindextwo" % \begin{macrocode} \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 } % \end{macrocode} % \end{macro} % \begin{macro}{\vxtAddmyStar} % A submacro needed by "\vxtMakemyFormat" % \begin{macrocode} \def\vxtExclamSeparator{% \ifx\vxtNoTildeA\undefined \toolboxDef\vxtseparator{\varindexExclamString\varindexTildeAString}% \else \let\vxtseparator\varindexExclamString \fi} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macrocode} %% -------------------------------------------------------------------- % \end{macrocode} % \subsection{The main implementation of \texttt{varindex}} % \begin{macrocode} %% %% Now the implementation of \varindex. %% % \end{macrocode} % % % Counters and default variables:\par % % We cannot use "\toolboxIf" for "\newcount", because in plain \TeX\ and % \LaTeX 2.09 the command "\newcount" is defined with the annoying "\outer" % flag. % \begin{macrocode} \ifx\varindexCount\undefined \newcount\varindexCount \fi % \end{macrocode} % \begin{macro}{\varindexPlaceholderAText}\nocomment % \begin{macrocode} \toolboxIf\undefined\def\varindexPlaceholderAText{$\sim$} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexPlaceholderASort}\nocomment % \begin{macrocode} \toolboxIf\undefined\let\varindexPlaceholderASort\toolboxEmpty % \end{macrocode} % \end{macro} % \begin{macro}{\varindexPlaceholderBText}\nocomment % \begin{macrocode} \toolboxIf\undefined\def\varindexPlaceholderBText{$\approx$} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexPlaceholderBSort}\nocomment % \begin{macrocode} \toolboxIf\undefined\let\varindexPlaceholderBSort\toolboxEmpty % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexUsePlaceholderA}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindexUsePlaceholderA} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexUsePlaceholderB}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindexUsePlaceholderB} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexLeadingPlaceholderA}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindexLeadingPlaceholderA} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexLeadingPlaceholderB}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindexLeadingPlaceholderB} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexCommaLeads}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindexCommaLeads} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexCommaExpand}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindexCommaExpand} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexPreviousAText}\nocomment % \begin{macrocode} \toolboxNewiffalse{varindexPreviousAText} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexPreviousASort}\nocomment % \begin{macrocode} \toolboxNewiffalse{varindexPreviousASort} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexPreviousBText}\nocomment % \begin{macrocode} \toolboxNewiffalse{varindexPreviousBText} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexPreviousBSort}\nocomment % \begin{macrocode} \toolboxNewiffalse{varindexPreviousBSort} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexEliminateInnerBrace}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindexEliminateInnerBrace} % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexEliminateOuterBrace}\nocomment % \begin{macrocode} \toolboxNewiftrue{varindexEliminateOuterBrace} % \end{macrocode} % \end{macro} % % % The non-local macros (they should not exist already): % % \begin{macrocode} \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 % \end{macrocode} % % \begin{macro}{\varindex} % % The essential ``flow'' is easy: % % "\varindex" reads the arguments (using lots of auxiliary macros) % and then calls "\vx@Main". % % \begin{macrocode} \def\varindex{\begingroup % \end{macrocode} % Before "toolbox" 3.1 the following "\if"'s could not be made local. % The reason is that in plain \TeX\ and \LaTeX 2.09 the command "\newif" is % "\outer". Due to this stupid restriction, we had to define them before. % "toolbox" 3.1 has now implemented its own "\newif" command for this % reason.\par\bigskip % % "\if"'s for scanning of the parameters: % % \begin{macro}{\ifvarindexStar}\nocomment % \begin{macrocode} \toolboxNewifFalse{varindexStar}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexExplicitFormat}\nocomment % \begin{macrocode} \toolboxNewifFalse{varindexExplicitFormat}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvx@atespace} % is true if a space was ate during skipping % \begin{macrocode} \toolboxNewifFalse{vx@atespace}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvx@savespace} % is true if we must ``put back'' an eaten space % \begin{macrocode} \toolboxNewifFalse{vx@savespace}% % \end{macrocode} % \end{macro} % "\if"'s for "\vx@main" and its submacros: % \begin{macro}{\ifvx@ffound}\nocomment % \begin{macrocode} \toolboxNewifFalse{vx@ffound}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexIndexMode}\nocomment % "\ifvarindexIndexMode" is true if the currently parsed format corresponds % to an index entry (in contrast to the output into the running text). % \begin{macrocode} \toolboxNewifTrue{varindexIndexMode}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexSpaceText}\nocomment % \begin{macrocode} \toolboxNewifFalse{varindexSpaceText}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvarindexSpaceSort}\nocomment % \begin{macrocode} \toolboxNewifFalse{varindexSpaceSort}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvx@firstiter}\nocomment % \begin{macrocode} \toolboxNewifTrue{vx@firstiter}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvx@tildeLead} % Decides whether we have a leading tilde % \begin{macrocode} \toolboxNewifFalse{vx@tildeLead}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvx@commaTextLead} % True if "\ifvarindexCommaExpand" is true and we have no token after comma. % \begin{macrocode} \toolboxNewifFalse{vx@commaTextLead}% % \end{macrocode} % \end{macro} % \begin{macro}{\ifvx@commaSortLead}\nocomment % True if "\ifvarindexCommaExpand" is true and we have no token after comma. % \begin{macrocode} \toolboxNewifFalse{vx@commaSortLead}% % \end{macrocode} % \end{macro} % We use "\varindexCount" also for generic flags to save counters. % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadFormatA}\nocomment % \begin{macrocode} \def\vx@ReadFormatA(#1){% \def\vx@formatA{#1}% \varindexTestAndExec(%optional formatAstar) \vx@ReadFormatAstar%else \vx@SkipAndReadScan} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadFormatAstar}\nocomment % \begin{macrocode} \def\vx@ReadFormatAstar(#1){% \def\vx@formatAstar{#1}\vx@SkipAndReadScan} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@SkipAndReadScan}\nocomment % \begin{macrocode} \def\vx@SkipAndReadScan{\varindexSkipAndExec\vx@ReadScan} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadScan}\nocomment % \begin{macrocode} \def\vx@ReadScan#1{#1\toolboxEmpty\varindexSkipAndExec\vx@ReadProgram} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadProgram}\nocomment % \begin{macrocode} \def\vx@ReadProgram#1{\def\vx@mainprogram{#1}\vx@TestTextStyle} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@TestTextStyle}\nocomment % \begin{macrocode} \def\vx@TestTextStyle{% \varindexTestAndExec[%textstyle] \vx@ReadTextStyle%else \vx@TestFlags} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadTextStyle}\nocomment % \begin{macrocode} \def\vx@ReadTextStyle[#1]{% \def\varindexStyle{#1}% \varindexTestAndExec[%pagestyleA] \vx@ReadPageStyleA%else \vx@TestFlags} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadTextStyleA}\nocomment % \begin{macrocode} \def\vx@ReadPageStyleA[#1]{\def\varindexAppend{#1}\vx@TestFlags} % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@TestFlags} % This macro starts the flag read loop. % \begin{macrocode} \def\vx@TestFlags{% % \end{macrocode} % In this loop, we use "\varindexCount" for the flag position. % \begin{macrocode} \varindexCount=0\relax \varindexEndOfFlag} % \end{macrocode} % "\varindexEndOfFlag" is the value of the `first to call' TestFlag... % (which is actually the last TestFlag... defined) % Let us first initialize it to TestFlag0: % \begin{macrocode} \varindexCount=0\relax \expandafter \def\expandafter\varindexEndOfFlag\expandafter{% \csname vx@TestFlag\the\varindexCount\endcsname} % \end{macrocode} %Initialize the `last' "\vx@TestFlag0" as a macro with the meaning %``start to read \meta{main entries}''. % \begin{macrocode} \expandafter \def\varindexEndOfFlag{\varindexSkipAndExec\vx@ReadMain}% % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@TestFlag0} % "\vx@TestFlag0" is the first macro generated by "\varindexNewFlag". % % \begin{macro}{\varindexNewFlag} % "\varindexNewFlag" calls "\vx@MakeNewFlag" with appropriate arguments: % % \begin{macrocode} \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 % \end{macrocode} % A bug in \TeX? Without this "\relax", the next "\expandafter" % is executed \emph{before} the counter is actually increased. % \begin{macrocode} \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}% } % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\vx@ReadFlagProgram}\nocomment % \begin{macrocode} \def\vx@ReadFlagProgram[#1]{\vx@MakeFlagProgram{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@MakeFlagProgram}\nocomment % \begin{macrocode} \def\vx@MakeFlagProgram#1{\expandafter\vx@MakeNewFlag\vx@tmp{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@MakeNewFlag} % Usage: % "\vx@MakeNewFlag\TestMacro\ReadMacro\PrevMacro\token\pos"\bracemeta{program} % \begin{macrocode} \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}}% } % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadMain}\nocomment % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadFormatB}\nocomment % \begin{macrocode} \def\vx@ReadFormatB#1{\def\varindexFormat{#1}\vx@TestAppend} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadOptFormatB}\nocomment % \begin{macrocode} \def\vx@ReadOptFormatB[#1]{\def\varindexFormat{#1}\vx@TestAppend} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@TestAppend}\nocomment % \begin{macrocode} \def\vx@TestAppend{% \varindexTestAndExec[%Append] {\vx@savespacefalse\vx@ReadAppend}%else {\ifvx@atespace\vx@savespacetrue\fi\vx@Main}} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ReadAppend}\nocomment % \begin{macrocode} \def\vx@ReadAppend[#1]{\def\varindexAppend{#1}\vx@Main} % \end{macrocode} % \end{macro} % % \begin{macro}{\varindexTestAndExec} % "\varindexTestAndExec\Token"\bracemeta{ifpart}\bracemeta{elsepart} % at the end of a macro: % Steps forward in the token list as long as there are spaces. % If a space is eaten, "\vx@atespace" is set true. % The next (non-space) token is put into "\varindexNextToken". % If this token is "\Token", then \meta{ifpart} is executed, otherwise % \meta{elsepart}. % \begin{macrocode} \def\varindexTestAndExec#1#2#3{% \varindexSkipAndExec{% \ifx\varindexNextToken#1% \def\vx@exec{#2}% \else \def\vx@exec{#3}% \fi \vx@exec}} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexSkipAndExec} % "\varindexSkipAndExec"\bracemeta{commands} at the end of a macro: % Steps forward in the token list as long as there are spaces. % The next (non-space) token is put into "\varindexNextToken". % Then commands are executed. % \begin{macrocode} \def\varindexSkipAndExec#1{% \vx@atespacefalse \def\vx@skipexec{#1}% \varindexArgumentSpace} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexSkipDefault}\nocomment % \begin{macrocode} \def\varindexSkipDefault{\futurelet\varindexNextToken\vx@skipexec} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexSkipTrickery}\nocomment % \begin{macrocode} \def\varindexSkipTricky{% \vx@MakeSpaceOther\futurelet\varindexNextToken\vx@SkipLoopTest} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexSkipLoopTest}\nocomment % \begin{macrocode} \def\vx@SkipLoopTest{% \vx@MakeSpaceSpace \ifx\varindexNextToken\vx@spaceothertok \def\vx@skipnext{\vx@gobblespace a}% \else \let\vx@skipnext\vx@skipexec \fi \vx@skipnext} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@gobblespace}\nocomment % \begin{macrocode} \def\vx@gobblespace a#1{\vx@atespacetrue\varindexSkipTricky} % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@Main} % This macro is called after all arguments are read into appropriate macros. % Now the macros will be parsed (possibly using the argument % \meta{mainprogram}), and then the output is produced. % Finally, the group is closed and a possible ``eaten space'' is put back. % \begin{macrocode} \def\vx@Main{% \ifx\varindexStarPos\undefined \varindexStarfalse \else \varindexStartrue \fi \ifx\vx@formatA\undefined % \end{macrocode} % The default format is empty if no default format is given % \begin{macrocode} \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 % \end{macrocode} % Now we parse \meta{main entries}: % \begin{macrocode} \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}% % \end{macrocode} % Now we expand the format(s): % \begin{macrocode} \varindexedef\varindexFormatDefault{\varindexFormatDefault}% \ifx\varindexFormat\undefined \varindexExplicitFormatfalse \let\varindexFormat\varindexFormatDefault \else \varindexExplicitFormattrue \varindexedef\varindexFormat{\varindexFormat}% \fi % \end{macrocode} % Now we execute \meta{mainprogram}, and expand "\varindexFormat" again: % \begin{macrocode} \ifx\vx@mainprogram\undefined\else \vx@mainprogram \varindexedef\varindexFormat{\varindexFormat}% \fi % \end{macrocode} % Still modify "\varindexFormat": % \begin{macrocode} \ifvarindexStar % \end{macrocode} % Prepend `"*"' resp. `"*"\myspace' % \begin{macrocode} \expandafter\varindexSplitAtOutput\expandafter{\varindexFormat}\vx@fa\vx@fb \ifx\vx@fb\undefined % \end{macrocode} % The `"*"' does not occur in "\varindexFormat" % \begin{macrocode} \expandafter\varindexSplitAtIndex\expandafter{\varindexFormat}% \vx@fa\vx@fb \ifx\vx@fb\undefined % \end{macrocode} % We did not find a `space' % \begin{macrocode} \let\vx@fa\undefined \fi \ifx\vx@fa\toolboxEmpty % \end{macrocode} % Did we find a `space' immediately at the start? % Then prepend only `"*"' % \begin{macrocode} \toolboxDef\varindexFormat{\varindexOutputString\varindexFormat}% \else % \end{macrocode} % prepend `"*"\myspace' % \begin{macrocode} \toolboxDef\varindexFormat{% \varindexOutputString\varindexIndexString\varindexFormat}% \fi \fi \fi \ifx\varindexFormat\varindexOutputString % \end{macrocode} % Replace `"*"' by `"*"\myspace' % \begin{macrocode} \toolboxDef\varindexFormat{\varindexOutputString\varindexIndexString}% \fi % \end{macrocode} % Now we interpret "\varindexFormat" and produce the output: % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@endparse} % "\vx@endparse" is the end of the string to parse: % \begin{macrocode} \def\vx@endparse{\vx@endparse} % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@TextLoop} % This is the (recursive) macro which parses \meta{main entries}. % For each entry (separated by "\vx@word"), possibly with braces % eliminated, the macro "\vx@TextEntry" is called. % % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@FormLoop} % This is the (recursive) macro which parses the \meta{format}. % For each entry (separated by space or by "*") the function % "\vx@Format" is called with "\varindexIndexMode" set correspondingly. % \begin{macrocode} \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 % \end{macrocode} % Have we reached an empty entry in the format string? % \begin{macrocode} \ifvx@firstiter%% In the first iteration, %% \ifx\vx@fc\undefined% if 'space' is the very first sign, %% \vx@FormatAll% we output everything %% \fi \else % \end{macrocode} % Later, we always output everything. % \begin{macrocode} \vx@FormatAll \fi \else % \end{macrocode} % Usually, we just work with our current entry % \begin{macrocode} \expandafter\vx@Format\expandafter{\vx@fa}% \fi \vx@firstiterfalse \ifx\vx@fc\undefined % \end{macrocode} % If the first separating sign is 'space': % \begin{macrocode} \varindexIndexModetrue \let\vx@toparse\vx@fb \else % \end{macrocode} % If the first separating sign is "*": % \begin{macrocode} \varindexIndexModefalse \expandafter \varindexSplitAtOutput\expandafter{\vx@toparse}\vx@fa\vx@toparse \fi \fi \vx@NextLoop} % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@FormatAll} % This macro is as "\vx@Format", just that everything is output: % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@FormatAllLoop}\nocomment % \begin{macrocode} \def\vx@FormatAllLoop{% \advance\varindexCount by 1\relax \expandafter \varindexAddNumber\expandafter{\the\varindexCount}% \expandafter \ifnum\varindexLastEntry=\varindexCount \let\vx@NextFormatAllLoop\toolboxEmpty \fi \vx@NextFormatAllLoop} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@AppendwithCount} % The content of the variable "#2\the\varindexCount" is appended to "#1". % If both, "#1" and "#2\the\varindexCount" are nonempty, a space % is inserted between. % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@Format} % This is the macro which parses the format string "#1" for one single % output, either into index or into running text, depending on % "\ifvarindexIndexMode". % % \begin{macrocode} \def\vx@Format#1{% \vx@FormatInit \def\vx@fparse{#1}% \toolboxAppend\vx@fparse\vx@endparse \let\vx@FormatNextLoop\vx@FormatLoop \vx@FormatLoop \vx@Write } % \end{macrocode} % \end{macro} % \begin{macro}{\vx@FormatInit}\nocomment % \begin{macrocode} \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 } % \end{macrocode} % \end{macro} % \begin{macro}{\vx@FormatLoop} % "\vx@FormatLoop" is the main loop which parses one (space-separated) entry % in the format string. The essential part here is the command % "\vx@HandleFormat" which is described below. % Essentially, "\vx@HandleFormat" is a list of subsequent calls to % "\vx@condexec" % \begin{macrocode} \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 } % \end{macrocode} % \end{macro} % \begin{macro}{\vx@condexec}\nocomment % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@HandleFormat} % "\vx@HandleFormat" is a list of commands of the form % "\vx@condexec"\bracemeta{splitcommand}\bracemeta{action}. % The idea is that if \meta{splitcommand} splits at the `current' token % of the format string then \meta{action} is executed. % For details, see "\vx@condexec". % The list "\vx@Handle" format is generated by "\varindexNewFormat". % \begin{macrocode} \let\vx@HandleFormat\toolboxEmpty % \end{macrocode} % \end{macro} % \begin{macro}{\varindexNewFormat} % \begin{macrocode} \def\varindexNewFormat#1#2{% \toolboxSurround{\vx@condexec{#1}{#2}}{}\vx@HandleFormat} % \end{macrocode} % \end{macro} % Now we initialize the default actions for the format string. However, % it is necessary to postpone the expansion of the "\vx@NewStdFormat" commands % (which call "\varindexNewFormat") until "\varindexOutExclam" etc.\ have % been initialized: In fact, the macro "\vx@NewStdFormat" uses "\csname" % and thus implicitly sets those variables to "\relax" which conflicts with % our initialization, because we define "\varindexOutExclam" and friends % only if they are "\undefined" (so that we do not override previous user % definitions of these macros).\par % \begin{macrocode} %% This macro is executed near the end of this file. \def\varindexAddOmit{% The name is a fake: The macro redefines this macro % \end{macrocode} % \begin{macro}{\varindexAddSpace} % "\varindexAddSpace" is made by a scheme from "\vx@NewStdFormat" % \begin{macrocode} \vx@NewStdFormat\varindexSplitAtSpace{Space}% % \end{macrocode} % \end{macro} % \begin{macro}{\varindexAddSpTok} % "\varindexAddSpTok" is made by a scheme from "\vx@NewStdFormat" % \begin{macrocode} \vx@NewStdFormat\varindexSplitAtSpaceTok{SpTok}% % \end{macrocode} % \end{macro} % \begin{macro}{\varindexAddOmit} % "\varindexAddOmit" is made by a scheme from "\vx@NewStdFormat" % \begin{macrocode} \vx@NewStdFormat\varindexSplitAtOmit{Omit}% % \end{macrocode} % \end{macro} % \begin{macrocode} \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 } % \end{macrocode} % \begin{macro}{\vx@NewStdFormat} % \begin{myquote} % "\vx@NewStdFormat\"\meta{splitcmd}\bracemeta{name} % \end{myquote} % calls % \begin{myquote} % "\varindexNewFormat\"\meta{splitcmd}"\varindexAdd"\meta{name} % \end{myquote} % and defines the corresponding macro "\varindexAdd"\meta{name} by % \begin{myquote} % "\def\varindexAdd"\meta{name}"{\varindexPreceeds"\meta{name}\\ % " \varindexTokensOutExpand"\\ % " \varindexOutText"\meta{name}\\ % " \varindexOutSort"\meta{name}\\ % " \varindexFollows"\meta{name}"}" % \end{myquote} % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexAddNumber}\nocomment % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexAddDash} % \begin{macrocode} \def\varindexAddDash{% \varindexPreceedsDash \ifx\vx@sortlist\toolboxEmpty \varindexTokensOutExpand\varindexOutTextDash\varindexOutSortDashBeg \else \varindexTokensOutExpand\varindexOutTextDash\varindexOutSortDash \fi \varindexFollowsDash} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexAddComma}\nocomment % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@flushToBefore}\nocomment % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexAddTildeA}\nocomment % \begin{macrocode} \def\varindexAddTildeA{% \ifvarindexUsePlaceholderA \ifvx@tildeLead \ifvarindexLeadingPlaceholderA \vx@AddingTildeA \fi \else \vx@AddingTildeA \fi \fi} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@AddingTildeA}\nocomment % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@AddTildeB}\nocomment % \begin{macrocode} \def\varindexAddTildeB{% \ifvarindexUsePlaceholderB \ifvx@tildeLead \ifvarindexLeadingPlaceholderB \vx@AddingTildeB \fi \else \vx@AddingTildeB \fi \fi} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@AddingTildeB}\nocomment % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexNextSpace}\nocomment % \begin{macrocode} \def\varindexNextSpace{\varindexSpaceTexttrue\varindexSpaceSorttrue} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexNoNextSpace}\nocomment % \begin{macrocode} \def\varindexNoNextSpace{\varindexSpaceTextfalse\varindexSpaceSortfalse} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexTokensOut}\nocomment % \begin{macrocode} \long\def\varindexTokensOut#1#2{\def\vx@adda{#1}\def\vx@addb{#2}\vx@Addit{}{}} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexTokensOutExpand}\nocomment % \begin{macrocode} \def\varindexTokensOutExpand#1#2{\let\vx@adda#1\let\vx@addb#2\vx@Addit{}{}} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@Addit} % \begin{myquote} % "\vx@Addit"\bracemeta{command A}\bracemeta{command B} % \end{myquote} % Does the following if "\vx@adda"/"\vx@addb" is nonempty: % \begin{myquote} % Add (space +) "\vx@adda"/"\vx@addb" to "\vx@textlist"/"\vx@sortlist"\\ % (Shift space to "\vx@...listBefore" if "\ifvx@comma...Lead" is true).\\ % "\vx@tildeLeadfalse" (only if "\vx@adda" is nonempty)\\ % "\varindexSpace...false"\\ % "\vx@comma...Leadfalse"\\ % Execute \meta{command A/B} % \end{myquote} % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexAddExclam}\nocomment % \begin{macrocode} \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 } % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ErrorFormat}\nocomment % "\vx@ErrorFormat" outputs the format until the content of "\vx@endparse" is % reached. % \begin{macrocode} \expandafter \def\expandafter\vx@ErrorFormat\expandafter#\expandafter 1\vx@endparse {\errmessage{\string\varindex: Error in format `#1'}} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@ErrorNumber}\nocomment % \begin{macrocode} \def\vx@ErrorNumber#1#2{\errmessage{\string\varindex: % Entry `#2' does not exist (only #1 entries)}} % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@Write} % The main output macro (either into "\index" or into running text): % % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@Flush} % Put the text buffered in "\vx@textlistBefore\vx@textlist" and % "\vx@sortlistBefore\vx@sortlist" to "\vx@outputlist" in the way appropriate % fot the output, and delete the buffers. % Moreover, prepare "\vx@tilde?Text" and friends correspondingly. % % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % % \begin{macro}{\vx@TextEntry} % "\vx@TextEntry"\bracemeta{\texttt{\#1}} defines % "\varindexEntry"/"Sort"/"Plain1-..." % with the values corresponding to entry "#1". Here, "1-..." is % "\the\varindexCount". If necessary, inner braces are eliminated % % \begin{macrocode} \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 % \end{macrocode} % No sort entry: % \begin{macrocode} \vx@LetEliminated{varindexSort}\vx@textEntryA \ifx\vx@textEntryC\undefined \vx@LetEliminated{varindexPlain}\vx@textEntryA \else \vx@LetEliminated{varindexPlain}\vx@textEntryC \fi \else % \end{macrocode} % Sort entry: % \begin{macrocode} \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 } % \end{macrocode} % \end{macro} % \begin{macro}{\vx@LetEliminated}\nocomment % \begin{macrocode} \def\vx@LetEliminated#1#2{% \let\vx@tmp#2% \ifvarindexEliminateInnerBrace \toolboxDropBrace\vx@tmp \fi \toolboxWithNr{\the\varindexCount}\let{#1}\vx@tmp} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexMakeVarSplit}\nocomment % \begin{macrocode} \def\varindexMakeVarSplit#1#2#3{\varindexedef#1{#2}\expandafter \toolboxMakeSplit\expandafter{#1}{#3}} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexMakeSplitExpand}\nocomment % \begin{macrocode} \def\varindexMakeSplitExpand#1#2{\varindexMakeVarSplit\vx@tmp{#1}{#2}} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexSetWordString} % \begin{macro}{\vx@SplitAtWord}\nocomment % \begin{macrocode} \def\varindexSetWordString#1{\def\vx@word{#1}% \toolboxMakeSplit{#1}{vx@SplitAtWord}} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetSortString} % \begin{macro}{\vx@SplitAtSort}\nocomment % \begin{macrocode} \def\varindexSetSortString#1{% \toolboxMakeSplit{#1}{vx@SplitAtSort}} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetPlainString} % \begin{macro}{\vx@SplitAtPlain}\nocomment % \begin{macrocode} \def\varindexSetPlainString#1{% \toolboxMakeSplit{#1}{vx@SplitAtPlain}} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\vx@tmp} % Temporarily, we define a generic command: % \begin{myquote} % "\vx@tmp"\bracemeta{name} % \end{myquote} % is (temporarily) a call which is equivalent to: % \begin{myquote} % "\def\varindexSet"\meta{name}"String#1{%"\\ % " \varindexMakeVarSplit"\relax %"\varindex"\meta{name}"String{#1}{varindexSplitAt"\meta{name}"}}" % \end{myquote} % \begin{macrocode} \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} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexSetIndexString} % \begin{macro}{\varindexSplitAtIndex}\nocomment % \begin{macrocode} \vx@tmp{Index} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetOutputString} % \begin{macro}{\varindexSplitAtOutput}\nocomment % \begin{macrocode} \vx@tmp{Output} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetTildeAString} % \begin{macro}{\varindexSplitAtTildeA}\nocomment % \begin{macrocode} \vx@tmp{TildeA} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetTildeBString} % \begin{macro}{\varindexSplitAtTildeB}\nocomment % \begin{macrocode} \vx@tmp{TildeB} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetSpaceString} % \begin{macro}{\varindexSplitAtSpace}\nocomment % \begin{macrocode} \vx@tmp{Space} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetSpaceTokString} % \begin{macro}{\varindexSplitAtSpaceTok}\nocomment % \begin{macrocode} \vx@tmp{SpaceTok} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetOmitString} % \begin{macro}{\varindexSplitAtOmit}\nocomment % \begin{macrocode} \vx@tmp{Omit} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetCommaString} % \begin{macro}{\varindexSplitAtComma}\nocomment % \begin{macrocode} \vx@tmp{Comma} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetDashString} % \begin{macro}{\varindexSplitAtDash}\nocomment % \begin{macrocode} \vx@tmp{Dash} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetExclamString} % \begin{macro}{\varindexSplitAtExclam}\nocomment % \begin{macrocode} \vx@tmp{Exclam} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\varindexSetStringForNr} % \begin{macro}{\varindexSplitAtNr}\nocomment % \begin{macrocode} \def\varindexSetStringForNr#1#2{% \edef\vx@adda{#1}% \expandafter \vx@AddToHandleNrs\csname varindexSplitAtNr\vx@adda\endcsname % \end{macrocode} % It is important to define the instance only \emph{after} the call of % "\vx@AddToHandleNrs" (because this macro tests the existence). % \begin{macrocode} \expandafter \varindexMakeVarSplit\csname varindexNr\vx@adda String\endcsname {#2}{varindexSplitAtNr\vx@adda}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\vx@AddToHandleNrs} % "\vx@AddToHandleNrs{\vx@HandleNr1}" % tests whether "\vx@HandleNr1" is already defined: % If not (i.\,e.\ "\relax" because we use it with "\csname") the call % \begin{myquote} % "\varindexNewFormat\varindexSplitAtNr1{\varindexAddNumber"\relax %\bracemeta{content of \cmdcite{vx@adda}}"}" % \end{myquote} % is executed. % \begin{macrocode} \def\vx@AddToHandleNrs#1{% \ifx#1\relax \expandafter \varindexNewFormat\expandafter#1\expandafter{\expandafter \varindexAddNumber\expandafter{\vx@adda}}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\varindexedef} % This macro is described in the main documentation. % \begin{macrocode} \def\varindexedef#1#2{% \let\vx@tildemerk~% \let~\vx@nicetilde \edef#1{#2}% \let~\vx@tildemerk} % \end{macrocode} % \end{macro} % % \begin{macro}{\varindexDoConvert}\nocomment % \begin{macrocode} \def\varindexDoConvert{\let\vx@MakeHarmless\toolboxMakeHarmless} % \end{macrocode} % \end{macro} % \begin{macro}{\varindexNoConvert}\nocomment % \begin{macrocode} \def\varindexNoConvert{\def\vx@MakeHarmless##1{}} % \end{macrocode} % \end{macro} % % % \par\hrule\par\null\par % Finally, some definitions which require catcode-trickery: % % % \begin{macro}{\vx@nicetilde} % "\vx@nicetilde" expands to a tilde with a nonactive catcode. % % \begin{macrocode} \def\vx@tmp{\catcode`\~=13\relax} \catcode`\~=11\relax\def\vx@nicetilde{~}\vx@tmp % \end{macrocode} % \end{macro} % \begin{macro}{\vx@spaceothertok} % \begin{macro}{\vx@MakeSpaceOther}\nocomment % \begin{macrocode} \def\vx@MakeSpaceOther{\catcode`\ =13\relax} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@MakeSpaceSpace}\nocomment % \begin{macrocode} \def\vx@MakeSpaceSpace{\catcode`\ =10\relax} \vx@MakeSpaceOther%<- This % is important \let\vx@spaceothertok= %<- This ` %' is important \vx@MakeSpaceSpace % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\vx@otherat} % "\def\vx@otherat{@}" is a bad idea, since then % "@" has the wrong catcode. So we use a temporary macro to define it: % We misuse the name "\varindexArgumentSpace" to this purpose. % Of course, we must redefine the latter afterwards. % \begin{macrocode} \def\varindexArgumentSpace#1{\def\vx@otherat{#1}} \ifx\makeatother\undefined\catcode`\@=12\relax\else\makeatother\fi \varindexArgumentSpace{@} % \end{macrocode} % \end{macro} % % Initialize default values (you should have the `usual' catcodes here. % In particular, "\makeatother" must be called before if `"@"' % is used as argument). % \begin{macro}{\varindexArgumentSpace}\nocomment % \begin{macrocode} \let\varindexArgumentSpace\varindexSkipDefault % \end{macrocode} % \end{macro} % \begin{macro}{\varindexIndex} % We use "\def" for "\varindexIndex" so that a redefinition of "\index" also % redefines our command. % \begin{macrocode} \toolboxIf\undefined\def\varindexIndex{\index} % \end{macrocode} % \end{macro} % \begin{macro}{\vx@MakeHarmless}\nocomment % \begin{macrocode} \varindexDoConvert % \end{macrocode} % \end{macro} % \begin{macrocode} \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 % \end{macrocode} % For the following macro, see the remarks in the definition of % the fake name "\varindexAddOmit" (after definition of "\varindexNewFormat") % \begin{macrocode} %% It is important that the following is after all \toolboxIf\undefined... \varindexAddOmit% Execute the fake macro and redefine \varindexAddOmit % \end{macrocode} % % \begin{macro}{\varindexSplitSpace}\nocomment % \begin{macrocode} \toolboxMakeSplit{ }{varindexSplitSpace} % \end{macrocode} % \end{macro} % % \begin{macrocode} \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 % \end{macrocode} % \iffalse % % \fi % \Finale\PrintIndex % % % % \iffalse %<*metainfo> % \fi \iffalse ------------------------------------------------------------- % % Just in case that for some reason the file `varindex.ins' got lost: % The content of this file is between the lines %<*insfile> and %: % %\iffalse % %<*insfile> \def\batchfile{varindex.ins} \input docstrip.tex \keepsilent \nopreamble \generateFile{varindex.sty}{f}{\from{varindex.dtx}{package}} \generateFile{varindex.txt}{f}{\from{varindex.dtx}{asciidocu}} \generateFile{varindex.tex}{f}{\from{varindex.dtx}{driver}} %%\generateFile{varindex.ins.dup}{f}{\from{varindex.dtx}{insfile}} \Msg{***************************************************************} \Msg{*} \Msg{* To finish the installation you have to move the} \Msg{* file 'varindex.sty' into a directory searched by TeX.} \Msg{*} \Msg{*} \Msg{* Run the file varindex.tex through LaTeX to produce the} \Msg{* documentation or read the ascii documentation in varindex.txt} \Msg{*} \Msg{*} \Msg{***************************************************************} \endbatchfile % %<*metainfo> % \fi \fi % \iffalse % % \fi \endinput %%% Local Variables: %%% mode: latex %%% TeX-master: "varindex.tex" %%% End: