[texhax] indexing problem
Uwe Lueck
uwe.lueck at web.de
Sun May 21 23:12:42 CEST 2006
As I contributed to the thread some weeks ago --
Oleg Katsitadze <olegkat at gmail.com> schrieb am 20.05.2006 14:12:20:
>
> Hi,
>
> As nobody answered your question, I try to give you some
> clues. Hope I'm not too late.
late as well --
> Since I am a plain TeX user, I can only guess at what LaTeX
> does and why what you want is not working, but I can't give
> you a proper LaTeX solution.
>
> First of all, take a look at the file with the same basename
> as your document and the extension `.idx'. This is the
> intermediate file where LaTeX dumps all your index entries.
> This should clarify many things for you.
>
> You'll notice that in the entries from the text body, the
> macros like \pie and \ind are written "as is" (unexpanded),
> while in the entries from the footnote these macros are
> replaced by their definitions.
>
> The reason for this is as follows. Normally, when TeX reads
> an argument of a macro, each token in the argument is parsed
> and converted into internal representation. This means,
> among other things, that a string like "\ind" in the
> argument will become a single token for the macro \ind, not
> the four characters "\", "i", "n", and "d".
>
> On the other hand, LaTeX's \index macro is designed in a way
> that allows it to read the argument verbatim. That is, a
> string like "\ind" in the argument of \index remains a
> four-character string "\ind", not the single token for the
> macro \ind.
>
> The consequence of the above is that in the text body, the
> argument of \index becomes a _verbatim_ string, and you can
> see that in the .idx file. And what happens when \index is
> placed inside \footnote? Well, \footnote does not read it's
> argument verbatim, therefore all macros (like \ind) in its
> argument become single tokens, not the verbatim strings.
> This means that by the time \index inside \footnote starts
> reading it's argument, all instances of \ind, etc., have
> already been converted into single tokens, and that's what
> \index gets. When \index then writes its argument to the
> .idx file, these macros are expanded, which you can also see
> in the .idx file for the entries coming from the footnote.
>
> The outcome is that two instances of the same index entry
> appearing in the body and in the footnote are regarded by
> MakeIndex as different. Even though they result in the same
> text in LaTeX, MakeIndex doesn't know that.
>
> Another consequence is that when you, as you say, define
> \pie as a@\textbf{PROTO-INDO-EUROPEAN}, the sorting doesn't
> work. This is because, inside text body, \pie is written
> out _verbatim_ and MakeIndex doesn't see what you want it to
> see -- it sees `\pie' instead of a@\textbf{PROTO-INDO-EUROPEAN}.
... (well-explained!) ...
> One solution might be making \index parse its argument
> non-verbatim, plus expanding the first token of the argument
> (e.g., \pie).
>
> Unfortunately, I don't know how to do this in LaTeX, but in
> plain TeX you can define something like this:
>
> \let\oldindex\index
> \def\index#1{\oldindex{#1}}
>
> (Putting it after \makeindex in LaTeX seems to work, see the
> attached file.) This works because the redefined \index now
> reads and parses its argument non-verbatim before passing it
> on to the original \index, so \pie will become a token
> regardless of whether it is inside a footnote or text body;
> it will be expanded when \oldindex writes it to the .idx
> file, so MakeIndex will see, e.g.,
> a@\textbf{PROTO-INDO-EUROPEAN} instead of \pie.
>
> But keep in mind that all macros inside the argument of the
> new \index are now expanded when written to the .idx file,
> which might cause problems with some macros. Furthermore,
> \index and \oldindex read their arguments differently,
> therefore don't mix them. Finally, probably my solution is
> seriously flawed since I'm not familiar with LaTeX; and
> certainly there are better solutions around (hopefully
> someone will point them out).
... the index package (for LaTeX) provides a well-tested
solution to the problem. (At least I have been using it for
many weeks even with index in footnotes.) ...
> Hope this helps,
> Oleg
>
> PS. In the sample you provided I see lines like this:
[snip]
> PPS. I think there are packages/classes providing \footnote
> which does not read its argument at all (memoir.cls?). With
> such a package, \index would work the same both in the text
> body and in the footnote, so a better solution might be
> possible.
If I remember correctly, \vfootnote as defined in The TeXbook
is such a variant of \footnote. Maybe footmisc reimplements it.
Sorry, I am away from my PC and my manuals ...
Cheers,
Uwe.
More information about the texhax
mailing list