Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: Index, Untereinträge nicht als solchen Darstellen wenn es nur einen gibt

  1. #1
    Registrierter Benutzer
    Registriert seit
    18.04.2013
    Beiträge
    9

    Question Index, Untereinträge nicht als solchen Darstellen wenn es nur einen gibt

    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
    .... 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

  2. #2
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Hallo und Herzlich Willkommen
    Zitat Zitat von 0815georg Beitrag anzeigen
    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:
    Code:
    \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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  3. #3
    Registrierter Benutzer
    Registriert seit
    18.04.2013
    Beiträge
    9
    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
    Geändert von 0815georg (22-04-2013 um 19:07 Uhr)

  4. #4
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Zitat Zitat von 0815georg Beitrag anzeigen
    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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  5. #5
    Registrierter Benutzer
    Registriert seit
    18.04.2013
    Beiträge
    9
    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

  6. #6
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Moin moin,
    Zitat Zitat von 0815georg Beitrag anzeigen
    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.
    Zitat Zitat von 0815georg Beitrag anzeigen
    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:
    Code:
    \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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  7. #7
    Registrierter Benutzer
    Registriert seit
    18.04.2013
    Beiträge
    9
    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

  8. #8
    Registrierter Benutzer
    Registriert seit
    18.04.2013
    Beiträge
    9
    Hallo nochmal,

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

    ! Missing \endcsname inserted.

    \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

  9. #9
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Moin moin,
    Zitat Zitat von 0815georg Beitrag anzeigen
    ! Missing \endcsname inserted.

    \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.
    Da muss wohl eine andere Taktik her:
    Code:
    \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\endcsname,#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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  10. #10
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.327
    Zitat Zitat von rais Beitrag anzeigen
    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.

  11. #11
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Zitat Zitat von klops Beitrag anzeigen
    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:
    Code:
    \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\detokenize{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\detokenize{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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  12. #12
    Registrierter Benutzer
    Registriert seit
    18.04.2013
    Beiträge
    9
    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:

    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\detokenize{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\detokenize{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

  13. #13
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Moin moin,
    Zitat Zitat von 0815georg Beitrag anzeigen
    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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  14. #14
    Registrierter Benutzer
    Registriert seit
    18.04.2013
    Beiträge
    9
    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

  15. #15
    Registrierter Benutzer
    Registriert seit
    18.04.2013
    Beiträge
    9
    ...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

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •