PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Index, Untereinträge nicht als solchen Darstellen wenn es nur einen gibt



0815georg
18-04-2013, 12:39
Hallo!

Gibt es eine Möglichkeit dass Untereinträge im Index nicht als solche dargestellt werden falls es nur einen Untereintrag gibt zu diesem Haupteintrag im ganzen Dokument?

Beispiel: Ich habe zwei Textteile:
- Textteil1 enthält \index{tight!measure}

- Textteil2 enthält \index{tight!set of measures}

Wenn in einem Dokument beide Textteile eingebunden werden dann steht im Index (die Punkte sind durch Leerzeichen zu ersetzen, ich (der editor) hab es nicht geschafft Leerzeichen darzustellen)

tight
.... measure, 5
.... set of measures, 3

Gut so. Wenn ich aber ein Dokument hab in dem nur der erste Textteil eingebunden wird, dann steht im Index

tight
<spaces> .... measure, 5

Da es hier nur einen Untereintrag zu "tight" gibt hätte ich dann aber lieber

tight measure, 5

stehen! Und das natürlich *ohne* \index{tight!measure} auf \index{tight measure} zu ändern, da ja beide Dokumente parallel funktionieren sollen.

danke, Georg</spaces>

rais
20-04-2013, 19:37
Hallo und Herzlich Willkommen :)


Gibt es eine Möglichkeit dass Untereinträge im Index nicht als solche dargestellt werden falls es nur einen Untereintrag gibt zu diesem Haupteintrag im ganzen Dokument?

etwa so vllt:


\documentclass{article}
\usepackage{makeidx}
\makeindex
\newwrite\myout
\makeatletter
\InputIfFileExists{\jobname.mix}{}{%
\typeout{\jobname.mix doesn't exist yet.}%
\typeout{Another LaTeX run may be required before trying MakeIndex.}%
}%
\immediate\openout\myout=\jobname.mix
\AtEndDocument{\immediate\closeout\myout}%
\newcommand*\my@index{}
\newcommand*\my@iindex{}
\def\my@iindex#1[#2][#3]{%
\ifx\relax#2\relax
\index{#1}%
\else
\ifx\relax#3\relax
\@ifundefined{my@sub@#1}{%
\index{#1 #2}%
}{%
\index{#1!#2}%
}%
\else %
\@ifundefined{my@ssub@#1@#2}{%
\@ifundefined{my@sub@#1}{%
\index{#1 #2 #3}%
}{%
\index{#1!#2 #3}%
}%
}{%
\@ifundefined{my@sub@#1}{%
\index{#1 #2!#3}%
}{%
\index{#1!#2!#3}%
}%
}%
\@ifundefined{my@ssub@tmp@#1@#2}{}{%
\immediate\write\myout{\string\@namedef{my@ssub@#1 @#2}{#3}}%
}%
\@namedef{my@ssub@tmp@#1@#2}{#3}%
\fi
\@ifundefined{my@sub@tmp@#1}{}{%
\immediate\write\myout{\string\@namedef{my@sub@#1} {#2}}%
}%
\@namedef{my@sub@tmp@#1}{#2}%
\fi
}
\def\my@index#1[#2]{%
\@ifnextchar[%]
{\my@iindex{#1}[#2]}{\my@iindex{#1}[#2][]}%
}
\newcommand*\myindex[1]{%
\@ifnextchar[%]
{\my@index{#1}}{\my@index{#1}[]}%
}
\makeatother
\begin{document}
bla\myindex{tight}[measure]
\myindex{foo}[a]
\myindex{foo}[b]
\myindex{blubb}
\myindex{drei}[zwei][eins]
\myindex{drei}[zwei][zwei]
\myindex{vier}[null][nichtig]
\myindex{x}[y]
\myindex{x}[y][z]
\printindex
\end{document}

erfordert mindestens zwei LaTeX-Läufe vorm MakeIndex-Aufruf.

MfG

0815georg
22-04-2013, 19:30
Vielen Dank, ich bin beeindruckt ;-)

Obwohl so ganz wie gewünscht funktioniert es noch nicht, im Fall

\myindex{tight}[measure]

ensteht zwar richtigerweise

tight measure, 1

und im Falll

\myindex{tight}[measure]
\myindex{tight}[set of measures]

tight,
... measure, 1
... set of measures, 1

also genau das was ich wollte, aber im Fall

\myindex{tight}
\myindex{tight}[measure]

kommt

tight, 1
tight measure, 1

raus, und da wäre dann doch

tight, 1
... measure, 1

schöner.

vielen Dank, das sollte eigentlich standard in makeidx sein,

Georg

rais
22-04-2013, 21:36
im Fall

\myindex{tight}
\myindex{tight}[measure]

kommt

tight, 1
tight measure, 1

raus, und da wäre dann doch

tight, 1
... measure, 1

schöner.

warum?

Das entspräche in etwa, bei einem Abschnitt genau einen Unterabschnitt setzen zu wollen.
Dazu sage ich erstmal nur: wer A sagt, muss auch B sagen ...

MfG

0815georg
23-04-2013, 15:45
Finde ich nicht, wenn "tight" auch einzeln vorkommt, dann macht

tight, 1
... measure, 5

durchaus Sinn, ist in Büchern so zu finden und entspricht auch dem standard Output wenn man

\index{tight}
\index{tight!measure}

schreibt, würd ich mir sehr wünschen dass diese Eigenschaft auch bei \myindex erhalten bleibt (ohne auch B sagen zu müssen ;-))

Wenn ich dieses kryptische Tex verstehen würde, dann würd ich mir das selber "schnell" umprogrammieren, leider fehlt mir im Moment die Zeit mich mit den Tex Interna zu beschäftigen, wäre dir deshalb unendlich dankbar, wenn sich das machen lassen würde.

Im Prinzip wäre es überhaupt schön das Ganze ins Packet makeidx zu integrieren. Wenn du mir das schreibst, dann mach ich mir dafür die Arbeit (in einigen Monaten, wenn ich mit der Diss fertig bin) die Autoren von makeidx zu überzeugen dieses Feature einzubauen.

vielen Dank nochmal, Georg

rais
25-04-2013, 17:53
Moin moin,

Finde ich nicht, wenn "tight" auch einzeln vorkommt, dann macht

tight, 1
... measure, 5

durchaus Sinn, ist in Büchern so zu finden und entspricht auch dem standard Output wenn man

\index{tight}
\index{tight!measure}

nun, wenn man nach einer \section nur eine \subsection angibt, erhält man auch, was man erwartet -- das heißt imho nicht, daß man es tun sollte.

schreibt, würd ich mir sehr wünschen dass diese Eigenschaft auch bei \myindex erhalten bleibt (ohne auch B sagen zu müssen ;-))

wenn Du es unbedingt willst:


\documentclass{article}
\usepackage{makeidx}
\makeindex
\newwrite\myout
\makeatletter
\InputIfFileExists{\jobname.mix}{}{%
\typeout{\jobname.mix doesn't exist yet.}%
\typeout{Another LaTeX run may be required before trying MakeIndex.}%
}%
\immediate\openout\myout=\jobname.mix
\AtEndDocument{\immediate\closeout\myout}%
\newcommand*\my@index{}
\newcommand*\my@iindex{}
\def\my@iindex#1[#2][#3]{%
\ifx\relax#2\relax
\index{#1}%
\else
\ifx\relax#3\relax
\@ifundefined{my@sub@#1}{%
\index{#1 #2}%
}{%
\index{#1!#2}%
}%
\else %
\@ifundefined{my@ssub@#1@#2}{%
\@ifundefined{my@sub@#1}{%
\index{#1 #2 #3}%
}{%
\index{#1!#2 #3}%
}%
}{%
\@ifundefined{my@sub@#1}{%
\index{#1 #2!#3}%
}{%
\index{#1!#2!#3}%
}%
}%
\fi
\@ifundefined{my@ssub@tmp@#1@#2}{}{%
\immediate\write\myout{\string\@namedef{my@ssub@#1 @#2}{#3}}%
}%
\@namedef{my@ssub@tmp@#1@#2}{#3}%
\fi
\@ifundefined{my@sub@tmp@#1}{}{%
\immediate\write\myout{\string\@namedef{my@sub@#1} {#2}}%
}%
\@namedef{my@sub@tmp@#1}{#2}%
}
\def\my@index#1[#2]{%
\@ifnextchar[%]
{\my@iindex{#1}[#2]}{\my@iindex{#1}[#2][]}%
}
\newcommand*\myindex[1]{%
\@ifnextchar[%]
{\my@index{#1}}{\my@index{#1}[]}%
}
\makeatother
\begin{document}
bla\myindex{tight}[measure]
\myindex{foo}[a]
\myindex{foo}[b]
\myindex{blubb}
\myindex{drei}[zwei][eins]
\myindex{drei}[zwei][zwei]
\myindex{vier}[null][nichtig]
\myindex{x}[y]
\myindex{x}[y][z]
\myindex{y}
\myindex{y}[z]
\myindex{z}[a][b]
\myindex{z}[a]
\printindex
\end{document}

MfG

0815georg
26-04-2013, 16:26
Großartig, vielen Dank!

Den Einwand versteh ich zwar nicht, ist aber auch nicht wichtig.
Das einzige was ich eigentlich wollte (und jetzt auch habe) ist, dass sich

\index{tight!measure}

unter bestimmten Umständen so verhält wie als hätte man

\index{tight measure}

geschrieben, und zwar genau dann und nur dann wenn sonst kein weiteres "tight" im Dokument vorkommt (weder ohne Subjekt oder mit einem anderen Subjekt als "measure").

Wenn ich das von Anfang an klarer formuliert hätte, dann wäre es vermutlich auch gar nicht zu der Diskussion gekommen, aber an den Einzelfall (ohne Subjekt) hatte ich eben noch nicht gedacht.

Sobald ich wieder etwas mehr Freiraum habe werd ich den makeidx Entwicklern entsprechenden Vorschlag mit einem gut durchdachten Beispiel schicken.

Danke nochmal und schöne Grüße, Georg

0815georg
26-04-2013, 23:24
Hallo nochmal,

sorry dass ich so lästig bin, aber ein kleines Problem gibts nun doch noch:

! Missing \endcsname inserted.
<to be read again>
\sigma
l.10300 ...ndex{generator}[of a $\sigma$-algebra].

wär praktisch wenn solche Sachen auch noch funktionieren würden, beim normalen "\index" Befehl gehts auch,

danke, Georg

rais
30-04-2013, 09:13
Moin moin,


! Missing \endcsname inserted.
<to be read again>
\sigma
l.10300 ...ndex{generator}[of a $\sigma$-algebra].

wär praktisch wenn solche Sachen auch noch funktionieren würden, beim normalen "\index" Befehl gehts auch,

der normale \index-Befehl versucht auch nicht, aus seinem Argument einen Befehlsnamen zu basteln.:o
Da muss wohl eine andere Taktik her:


\documentclass{article}
\usepackage{makeidx}
\makeindex
\newwrite\myout
\newif\ifmyfound
\makeatletter
\newcommand*\my@index{}
\newcommand*\my@iindex{}
\newcommand*\my@tmpa{}
\newcommand*\my@tmpb{}
\newcommand*\my@list{}
\newcommand*\my@lookup{}

\newcommand*\mycheck[4]{%
\myfoundfalse
\edef\my@tmpa{#2}%
\edef\my@list{\csname#1\endcsname}%
\@for\my@lookup:=\my@list\do{%
\edef\my@tmpb{\my@lookup}%
\ifx\my@tmpa\my@tmpb
\myfoundtrue
\fi
}%
\ifmyfound
#3% gefunden
\else
#4% nicht gefunden
\fi
}%\mycheck{Liste}{Was}{wenn gefunden}{wenn nicht gefunden}
\newcommand*\myaddtolist[2]{%
\@ifundefined{#1}{% wenn Liste bisher undefiniert
\expandafter\edef\csname#1\endcsname{#2}% erster Listeneintrag
}{%
\mycheck{#1}{#2}{% wenn `Was' bereits in Liste
% nichts tun;-)
}{% sonst Liste um Eintrag `Was' ergänzen:
\expandafter\edef\csname#1\endcsname{\csname#1\end csname,#2}%
}%
}%
}% \myaddtolist{Liste}{Was}

\newcommand*\myprintlist[1]{% Testausgabe der Liste
\@ifundefined{#1}{Liste `#1' existiert nicht.\par}{%
Liste `#1':\par\medskip
\edef\my@list{\csname#1\endcsname}%
\@for\my@lookup:=\my@list\do{%
(\my@lookup)\par
}%
\bigskip
}%
}%\myprintlist{Liste}

\InputIfFileExists{\jobname.mix}{}{%
\typeout{\jobname.mix doesn't exist yet.}%
\typeout{Another LaTeX run may be required before trying MakeIndex.}%
}%
\immediate\openout\myout=\jobname.mix
\AtEndDocument{\immediate\closeout\myout}%

\def\my@iindex#1[#2][#3]{%
\ifx\relax#2\relax % wenn es kein zweites Argument gibt
\index{#1}% eh nur auf Hauptebene im Index
\else % es gibt ein zweites Argument
\ifx\relax#3\relax % wenn es kein drittes Argument gibt,
\mycheck{my@sub}{#1}{% prüfe, ob es den selben Haupteintrag an anderer Stelle gibt
\index{#1!#2}% wenn ja, ist das zweite Argument ein Subeintrag
}{%
\index{#1 #2}% wenn nicht, dann das zweite Argument an den Haupteintrag hängen
}%
\else % es gibt auch ein drittes Argument
\mycheck{my@ssub}{#1@#2}{% prüfe, ob es den selben Untereintrag an anderer Stelle gibt
\mycheck{my@sub}{#1}{% wenn ja: prüfe, ob es den selben Haupteintrag an anderer Stelle gibt
\index{#1!#2!#3}% Haupteintrag + Subeintrag + Subsubeintrag
}{% kein passender Haupteintrag woanders:
\index{#1 #2!#3}% das zweite Argument mit an den Haupteintrag hängen, damit wird das dritte Argument zu einem Subeintrag
}%
}{% kein gleichlautender Subeintrag an anderer Stelle zu finden
\mycheck{my@sub}{#1}{% wenn es einen passenden Haupteintrag gibt
\index{#1!#2 #3}% wird das dritte Argument Teil des Subeintrags
}{% sonst
\index{#1 #2 #3}% werden beide optionalen Argumente Teil des Haupteintrags
}%
}%
\fi % drittes Argument nichtexistent oder doch
\mycheck{my@ssub@tmp}{#1@#2}{% wenn es den selben Subeintrag bereits (zur Laufzeit) gegeben hat
\immediate\write\myout{\string\myaddtolist{my@ssub }{#1@#2}}% dies in der Liste `Subeinträge gesamt' vermerken
}{}%
\myaddtolist{my@ssub@tmp}{#1@#2}% den momentanen Subeintrag in der Liste `Subeintrage zur Laufzeit' ergänzen
\fi % zweites Argument nichtexistent oder doch
\mycheck{my@sub@tmp}{#1}{% wenn es den selben Haupteintrag bereits (zur Laufzeit) gegeben hat
\immediate\write\myout{\string\myaddtolist{my@sub} {#1}}% diesen Haupteintrag in der Liste `Haupteinträge gesamt' ergänzen
}{}% und unabhängig davon
\myaddtolist{my@sub@tmp}{#1}% den momentanen Haupteintrag in der Liste `Haupteinträge zur Laufzeit' erganzen
}%\my@iindex{Eintrag}[Subeintrag][Subsubeintrag], eckige Klammern hier nicht optional
\def\my@index#1[#2]{% sammelt das zweite optionale Argument für \myindex ein
\@ifnextchar[%]
{\my@iindex{#1}[#2]}{\my@iindex{#1}[#2][]}%
}
\newcommand*\myindex[1]{%
\@ifnextchar[%]
{\my@index{#1}}{\my@index{#1}[]}%
}%\myindex{Eintrag}[Subeintrag][Subsubeintrag], eckige Klammern samt Inhalt hier optional
\makeatother
\begin{document}
bla\myindex{tight}[measure]
\myindex{foo}[a]
\myindex{foo}[b]
\myindex{blubb}
\myindex{drei}[zwei][eins]
\myindex{drei}[zwei][zwei]
\myindex{vier}[null][nichtig]
\myindex{x}[y]
\myindex{x}[y][z]
\myindex{y}
\myindex{y}[z]
\myindex{z}[a][b]
\myindex{z}[a]
\myindex{generator}[of a $\sigma$-algebra]
\printindex
\end{document}

MfG

klops
30-04-2013, 10:07
der normale \index-Befehl versucht auch nicht, aus seinem Argument einen Befehlsnamen zu basteln.
Ich habe mir jetzt nicht angeschaut, was Du da im Detail machst. Aber bei solchen Aktionen hat sich bei mir \detokenize schon oft als hilfreich erwiesen. Seit e-TeX-Features bei LaTeX vorausgesetzt werden dürfen, verwende ich die zunehmen erfolgreich.

rais
30-04-2013, 15:38
Ich habe mir jetzt nicht angeschaut, was Du da im Detail machst. Aber bei solchen Aktionen hat sich bei mir \detokenize schon oft als hilfreich erwiesen. Seit e-TeX-Features bei LaTeX vorausgesetzt werden dürfen, verwende ich die zunehmen erfolgreich.
prima Idee, Danke!

Das sähe damit etwa so aus:


\documentclass{article}
\usepackage{makeidx}
\makeindex
\newwrite\myout
\makeatletter
\InputIfFileExists{\jobname.mix}{}{%
\typeout{\jobname.mix doesn't exist yet.}%
\typeout{Another LaTeX run may be required before trying MakeIndex.}%
}%
\immediate\openout\myout=\jobname.mix
\AtEndDocument{\immediate\closeout\myout}%
\newcommand*\my@index{}
\newcommand*\my@iindex{}
\def\my@iindex#1[#2][#3]{%
\ifx\relax#2\relax
\index{#1}%
\else
\ifx\relax#3\relax
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2}%
}{%
\index{#1!#2}%
}%
\else %
\@ifundefined{\detokenize{my@ssub@#1@#2}}{%
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2 #3}%
}{%
\index{#1!#2 #3}%
}%
}{%
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2!#3}%
}{%
\index{#1!#2!#3}%
}%
}%
\fi
\@ifundefined{\detokenize{my@ssub@tmp@#1@#2}}{}{%
\immediate\write\myout{\string\@namedef{\string\de tokenize{my@ssub@#1@#2}}{#3}}%
}%
\@namedef{\detokenize{my@ssub@tmp@#1@#2}}{#3}%
\fi
\@ifundefined{\detokenize{my@sub@tmp@#1}}{}{%
\immediate\write\myout{\string\@namedef{\string\de tokenize{my@sub@#1}}{#2}}%
}%
\@namedef{\detokenize{my@sub@tmp@#1}}{#2}%
}
\def\my@index#1[#2]{%
\@ifnextchar[%]
{\my@iindex{#1}[#2]}{\my@iindex{#1}[#2][]}%
}
\newcommand*\myindex[1]{%
\@ifnextchar[%]
{\my@index{#1}}{\my@index{#1}[]}%
}
\makeatother
\begin{document}
bla\myindex{tight}[measure]
\myindex{foo}[a]
\myindex{foo}[b]
\myindex{blubb}
\myindex{drei}[zwei][eins]
\myindex{drei}[zwei][zwei]
\myindex{vier}[null][nichtig]
\myindex{x}[y]
\myindex{x}[y][z]
\myindex{y}
\myindex{y}[z]
\myindex{z}[a][b]
\myindex{z}[a]
\myindex{generator}[of a $\sigma$-algebra]
\myindex{$\alpha$}[$\beta$]
\myindex{$\alpha$}[$\gamma$]
\printindex
\end{document}

zumindest braucht man damit nicht bei jedem Eintrag zwei Listen zu durchforsten.;-)

MfG

0815georg
30-04-2013, 21:47
Hallöchen,

das nächste seltsame Problem ist aufgetreten, wenn man nämlich genau einen der beiden Befehle

\myindex{tight}[measure]
\myindex{tight}[set of measures]

in einer ams theorem umgebung steht und der andere ausserhalb, dann funktioniert das ganze erst wieder nicht, siehe folgender Code:


\documentclass{amsart}
\newtheorem{theorem}{Theorem}

\makeindex
\newwrite\myout
\makeatletter
\InputIfFileExists{\jobname.mix}{}{%
\typeout{\jobname.mix doesn't exist yet.}%
\typeout{Another LaTeX run may be required before trying MakeIndex.}%
}%
\immediate\openout\myout=\jobname.mix
\AtEndDocument{\immediate\closeout\myout}%
\newcommand*\my@index{}
\newcommand*\my@iindex{}
\def\my@iindex#1[#2][#3]{%
\ifx\relax#2\relax
\index{#1}%
\else
\ifx\relax#3\relax
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2}%
}{%
\index{#1!#2}%
}%
\else %
\@ifundefined{\detokenize{my@ssub@#1@#2}}{%
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2 #3}%
}{%
\index{#1!#2 #3}%
}%
}{%
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2!#3}%
}{%
\index{#1!#2!#3}%
}%
}%
\fi
\@ifundefined{\detokenize{my@ssub@tmp@#1@#2}}{}{%
\immediate\write\myout{\string\@namedef{\string\de tokenize{my@ssub@#1@#2}}{#3}}%
}%
\@namedef{\detokenize{my@ssub@tmp@#1@#2}}{#3}%
\fi
\@ifundefined{\detokenize{my@sub@tmp@#1}}{}{%
\immediate\write\myout{\string\@namedef{\string\de tokenize{my@sub@#1}}{#2}}%
}%
\@namedef{\detokenize{my@sub@tmp@#1}}{#2}%
}
\def\my@index#1[#2]{%
\@ifnextchar[%]
{\my@iindex{#1}[#2]}{\my@iindex{#1}[#2][]}%
}
\newcommand*\myindex[1]{%
\@ifnextchar[%]
{\my@index{#1}}{\my@index{#1}[]}%
}
\makeatother
\begin{document}

\begin{theorem}
\myindex{tight}[measure]
\end{theorem}

\myindex{tight}[set of measures]

\printindex
\end{document}


Dann steht im Index

tight measure, 1
tight set of measures, 1

Wenn beide Befehle entweder innerhalb oder ausserhalb stehen, dann funktionierts wie gewünscht!!??

Tex ist wirklich mit Abstand jene Sprache wo die im wahrsten Sinne des Wortes wunderbarsten Dinge passieren.

vielen Dank weiterhin und schöne Grüße, Georg

rais
30-04-2013, 22:29
Moin moin,


Tex ist wirklich mit Abstand jene Sprache wo die im wahrsten Sinne des Wortes wunderbarsten Dinge passieren.

das wunderbare daran ist, daß man auf anderen Rechnern das Problem auch nachvollziehen kann;-)
Setze einfach jeweils ein \global vor die beiden \@namedef-Befehle (die nicht in einem \write stehen), dann passt es auch mit gemischten Aufrufen innerhalb/außerhalb einer Umgebung (\@namedef wirkt lokal auf die jeweilige Gruppe bzw. Umgebung).

MfG

0815georg
01-05-2013, 18:50
Vielen Dank!

Funktioniert gut, jetzt wäre nur noch Eines ;-)
und das mittlerweile mit einem leicht ironischem Unterton.

Wenn

\myindex{tight}[measure]

und eine (oder mehrere) Seiten später wieder

\myindex{tight}[measure]

vorkommt, und sonst kein anderes "tight" im ganzen Dokument, dann sollte

tight measure, 1, 2

rauskommen, und nicht

tight
...measure, 1, 2

wie es zur Zeit noch rauskommt.
Diese Konstellation macht durchaus Sinn, in meinem Fall zwar nicht mit "tight" und "measure", aber mit anderen Wörtern.
Ich habs selber probiert hinzukriegen, aber in Tex nur 2 Strings miteinander zu vergleichen ist ja schon eine Wissenschaft für sich, zwei Makros geht gut mit \ifx, aber einen String (der noch Sonderzeichen enthält) mit dem Wert eines Makros, uuuffff...,
ich hab auch probiert ein zweites Makro zu definieren und das dann mit dem schon bestehenden zu vergleichen, aber das hat natürlich auch nicht funktioniert.

danke, Georg

0815georg
01-05-2013, 19:55
...und noch was ist mir grad aufgefallen, nämlich das \myindex eventuell nachfolgende Leerzeichen frisst, was nicht schön ist (\index macht das auch nicht).
Gibt es eine elegantere Methode das zu vermeiden als {\myindex{.}} zu schreiben?

danke, Georg

rais
02-05-2013, 10:21
Funktioniert gut, jetzt wäre nur noch Eines ;-)
und das mittlerweile mit einem leicht ironischem Unterton.

das heißt ja erstmal nur, daß bisher keiner von uns beiden diesen Fall berücksichtigt hat.


Wenn

\myindex{tight}[measure]

und eine (oder mehrere) Seiten später wieder

\myindex{tight}[measure]

vorkommt, und sonst kein anderes "tight" im ganzen Dokument, dann sollte

tight measure, 1, 2

rauskommen, und nicht

tight
...measure, 1, 2

wie es zur Zeit noch rauskommt.
Diese Konstellation macht durchaus Sinn, in meinem Fall zwar nicht mit "tight" und "measure", aber mit anderen Wörtern.
Ich habs selber probiert hinzukriegen, aber in Tex nur 2 Strings miteinander zu vergleichen ist ja schon eine Wissenschaft für sich, zwei Makros geht gut mit \ifx, aber einen String (der noch Sonderzeichen enthält) mit dem Wert eines Makros, uuuffff...,
ich hab auch probiert ein zweites Makro zu definieren und das dann mit dem schon bestehenden zu vergleichen, aber das hat natürlich auch nicht funktioniert.

Warum natürlich? Das wäre hier doch ein möglicher Ansatz?


\documentclass{article}
\usepackage{makeidx}
\makeindex
\newwrite\myout
\makeatletter
\InputIfFileExists{\jobname.mix}{}{%
\typeout{\jobname.mix doesn't exist yet.}%
\typeout{Another LaTeX run may be required before trying MakeIndex.}%
}%
\immediate\openout\myout=\jobname.mix
\AtEndDocument{\immediate\closeout\myout}%
\newcommand*\my@index{}
\newcommand*\my@iindex{}
\newcommand*\my@tmpa{}
\newcommand*\my@tmpb{}
\def\my@iindex#1[#2][#3]{%
\ifx\relax#2\relax
\index{#1}%
\else
\ifx\relax#3\relax
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2}%
}{%
\index{#1!#2}%
}%
\else %
\@ifundefined{\detokenize{my@ssub@#1@#2}}{%
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2 #3}%
}{%
\index{#1!#2 #3}%
}%
}{%
\@ifundefined{\detokenize{my@sub@#1}}{%
\index{#1 #2!#3}%
}{%
\index{#1!#2!#3}%
}%
}%
\fi
\@ifundefined{\detokenize{my@ssub@tmp@#1@#2}}{}{%
\edef\my@tmpa{\@nameuse{\detokenize{my@ssub@tmp@#1 @#2}}}%
\edef\my@tmpb{#3}%
\ifx\my@tmpa\my@tmpb\relax\else
\immediate\write\myout{\string\@namedef{\string\de tokenize{my@ssub@#1@#2}}{#3}}%
\fi
}%
\global\@namedef{\detokenize{my@ssub@tmp@#1@#2}}{# 3}%
\fi
\@ifundefined{\detokenize{my@sub@tmp@#1}}{}{%
\edef\my@tmpa{\@nameuse{\detokenize{my@sub@tmp@#1} }}%
\edef\my@tmpb{#2}%
\ifx\my@tmpa\my@tmpb\relax\else
\immediate\write\myout{\string\@namedef{\string\de tokenize{my@sub@#1}}{#2}}%
\fi
}%
\global\@namedef{\detokenize{my@sub@tmp@#1}}{#2}%
}
\def\my@index#1[#2]{%
\@ifnextchar[%]
{\my@iindex{#1}[#2]}{\my@iindex{#1}[#2][]}%
}
\newcommand*\myindex[1]{%
\@ifnextchar[%]
{\my@index{#1}}{\my@index{#1}[]}%
}
\makeatother
\begin{document}
bla\myindex{tight}[measure]
\myindex{foo}[a]
\myindex{foo}[b]
\myindex{blubb}
\myindex{drei}[zwei][eins]
\myindex{drei}[zwei][zwei]
\myindex{vier}[null][nichtig]
\myindex{x}[y]
\myindex{x}[y][z]
\myindex{y}
\myindex{y}[z]
\myindex{z}[a][b]
\myindex{z}[a]
\myindex{generator}[of a $\sigma$-algebra]
\myindex{$\alpha$}[$\beta$]
\myindex{$\alpha$}[$\gamma$]
\clearpage
b \myindex{tight}[measure]c
\printindex
\end{document}



...und noch was ist mir grad aufgefallen, nämlich das \myindex eventuell nachfolgende Leerzeichen frisst, was nicht schön ist (\index macht das auch nicht).
Gibt es eine elegantere Methode das zu vermeiden als {\myindex{.}} zu schreiben?

zieh das Leerzeichen doch einfach vor den \myindex{.}.
Du planst ja, dieses Feature in den \index-Aufruf integrieren zu lassen. Darin müsste man eh die A!B-Schreibweise berücksichtigen, sprich: das Problem mit dem Leerzeichenverschlucken stellt sich dann gar nicht erst.

MfG

0815georg
02-05-2013, 14:33
Hallo,

nun ja, dass es dir gelingt das hinzukriegen, daran habe ich ja nicht gezweifelt, wenn man dagegen kein so erfahrener Tex Coder ist, dann ist die Wahrscheinlichkeit dass mit den ersten drei Versuchen hinzubekommen praktisch gleich 0.

Also das wars dann vorerst mal, wie es ausschaut hab ich Moment keine weiteren Wünsche.

Vielen Dank für deine großartige Hilfe, bin dann auch schon gespannt was die Autoren von makeidx davon halten werden. Hängt natürlich immer davon ab wie man das ganze präsentiert, es lohnt sich also etwas Mühe reinzustecken um sinnvolle Anwendungsfälle schön darzustellen, deshalb kann ich das erst in ein paar Monaten machen, wenn ich mehr Zeit hab.

Georg