nomencl - Sortierreihenfolge

Erstellen von Index, Glossar, Symbolverzeichnis, einer Nomenklatur etc. mit MakeIndex oder Xindy


tobi75
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 26. Sep 2012, 10:17

nomencl - Sortierreihenfolge

Beitrag von tobi75 »

Guten Morgen liebe community,

ich habe ein Sortierproblem mit nomencl. Ich möchte für meine Arbeit ein Abkürzungs- und Formelverzeichnis erstellt, in dem ich die verwendendeten Symbole ausge. Das funktioniert auch ganz gut. Es gibt allerdings auch Formelzeichen, die aus mehreren Indizes bestehen. Ich habe mal das Beispiel angefügt. Von der Logik her ist es so, dass es vom allgemenen Wert $m_A$ zum konkreten Wert $m_{A,b,c}$ geht. Das Paket nomencl sortiert jetzt blöderweise genau andersrum. Kann ich irgendwie erreichen, dass der kürzere String über dem längeren erscheint?


\documentclass{scrbook}
\usepackage{nomencl}
\makenomenclature

\begin{document}
\nomenclature{$m_{A}$}{Test 1}
\nomenclature{$m_{A,b}$}{Test 2}
\nomenclature{$m_{A,b,c}$}{Test 3}
\printnomenclature
\end{document}

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Re: nomencl - Sortierreihenfolge

Beitrag von rais »

Hallo,
tobi75 hat geschrieben:Es gibt allerdings auch Formelzeichen, die aus mehreren Indizes bestehen. Ich habe mal das Beispiel angefügt. Von der Logik her ist es so, dass es vom allgemenen Wert $m_A$ zum konkreten Wert $m_{A,b,c}$ geht. Das Paket nomencl sortiert jetzt blöderweise genau andersrum. Kann ich irgendwie erreichen, dass der kürzere String über dem längeren erscheint?
dummerweise wird so der Klammerausdruck Bestandteil des Sortierstrings -- und eine schließende, geschweifte Klammer (}) ist für makeindex weiter hinten anzusiedeln, als ein Komma. Versuch es so
\documentclass{scrbook}
\usepackage{nomencl}
\makenomenclature
\newcommand*\nommindexed[3]{%
  \nomenclature[a#1_#2]{$#1_{#2}$}{#3}%
}
\begin{document}
a%
\nommindexed{m}{A}{Test 1}
\nommindexed{m}{A,b}{Test 2}
\nommindexed{m}{A,b,c}{Test 3}
\printnomenclature
\end{document}
Frohe Ostern!
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

tobi75
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 26. Sep 2012, 10:17

Beitrag von tobi75 »

Hallo Rainer,

danke für den Vorschlag. So funktioniert das erst mal. Mal schaun, ob es im richtigen Dokument auch das gewünschte Ergebnis bringt.

Danke und schöne Ostern ;-)

tobi75
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 26. Sep 2012, 10:17

Beitrag von tobi75 »

Hallo Rainer,
ich habe das mal in mein Hauptdokument eingefügt. Bei dem Minimalbeispiel oben, hatte ich etwas vereinfacht. In echt, nutze ich einige UNterabschnitte für die nomenclatur, also für Allgemeines, kleine und große lateinische bzw. griechische Buchstaben. Ich habe das Beispiel mal etwas erweitert.


Das Kommando von oben, fügt die \nomindexed Einträge immer unter dem ersten Abschnitt ein. Gibt es hier auch eine Möglichkeit die unter Abschnitt [C], also kleine lateinische Buchstaben zuzuordnen?

Danke und viele Grüße
\documentclass{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel} % Sprache
\usepackage{ifthen}
\usepackage{nomencl}

%Überschriften wie subsection
\makeatletter
\newcommand{\subsectionlike}[1]{{\usekomafont{sectioning}\size@subsection#1}}
\makeatother

%Layout Nomenclatur anpassen
\makenomenclature
\renewcommand{\nomname}{Abkürzungsverzeichnis}
\setlength{\nomlabelwidth}{.15\hsize}
\renewcommand{\nomlabel}[1]{#1 }
\setlength{\nomitemsep}{-1.25\parsep}


%Abschnitte der Nomenclatur definieren
\renewcommand{\nomgroup}[1]{
\renewcommand{\makelabel}[1][]{##1}
\item[~]
\ifthenelse{\equal{#1}{A}}{%
\item[\textbf{\subsectionlike Allgemeine Abkürzungen}]}{%
\ifthenelse{\equal{#1}{B}}{%
\item[\textbf{\subsectionlike Lateinische Großbuchstaben als Formelzeichen}]}{%
\ifthenelse{\equal{#1}{C}}{%
\item[\textbf{\subsectionlike Lateinische Kleinbuchstaben als Formelzeichen}]}{%
\ifthenelse{\equal{#1}{D}}{%
\item[\textbf{\subsectionlike Griechische Großbuchstaben}]}{%
\ifthenelse{\equal{#1}{E}}{%
\item[\textbf{\subsectionlike Griechische Kleinbuchstaben}]}{%
}}}}}%
\item[~]
\let\makelabel\nomlabel
}

%Sortierreihenfolge für indizierte Einträge
\newcommand*\nomindexed[3]{%
\nomenclature[a#1_#2]{$#1_{#2}$}{#3}%
}



\begin{document}
a%
\nomenclature[A]{A1}{TEST A1}
\nomenclature[A]{A2}{TEST A1}

\nomenclature[B]{B1}{TEST B1}
\nomenclature[B]{B2}{TEST B1}

\nomenclature[C]{C1}{TEST C1}
\nomenclature[C]{C2}{TEST A1}

\nomenclature[D]{D1}{TEST D1}
\nomenclature[D]{D2}{TEST D1}

\nomenclature[E]{E1}{TEST E1}
\nomenclature[E]{E2}{TEST E1}


\nomindexed{m}{A}{Test 1}
\nomindexed{m}{A,b}{Test 2}
\nomindexed{m}{A,b,c}{Test 3}


\printnomenclature
\end{document}

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Beitrag von rais »

Hallo,
tobi75 hat geschrieben: Das Kommando von oben, fügt die \nomindexed Einträge immer unter dem ersten Abschnitt ein. Gibt es hier auch eine Möglichkeit die unter Abschnitt [C], also kleine lateinische Buchstaben zuzuordnen?
ändere die \nomindexed-Definition zu so etwas wie
\newcommand*\nomindexed[4][c]{%
\nomenclature[#1#2_#3]{$#2_{#3}$}{#4}%
}
dann werden die Einträge generell unter C abgelegt. Wenn's denn doch mal woanders hin soll, kannst Du nu einen optionalen Parameter mit angeben, z. B.
\nomindexed[b]{m}{A,b,c}{Test 3}
PS) Der Rückfragestatus ist dafür gedacht, wenn eine Frage an den Threadersteller gestellt wird.

MfG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

tobi75
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 26. Sep 2012, 10:17

Beitrag von tobi75 »

genau so funktioniert es, auch wenn ich noch nicht verstanden habe, was genau das c in den eckigen Klammern macht (wenn ich den Term weglasse funktioniert es nicht mehr) und was der Ausdruck [#1#2_#3] bewirkt.

Herzlichen Dank und schöne restliche Ostern...

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Beitrag von rais »

tobi75 hat geschrieben:genau so funktioniert es, auch wenn ich noch nicht verstanden habe, was genau das c in den eckigen Klammern macht
\newcommand*\nomindexed[4][c]{...}
heißt in etwa ``Definiere einen neuen Befehl `\nomindexed'. Dieser soll vier ([4]) Parameter bekommen können, von denen der erste optinal ist (die zweite eckige Klammer). Wenn dieser optionale Parameter nicht angegeben wird, nimm `c' dafür an (den Inhalt der zweiten eckigen Klammer).''
Innerhalb {...} stehen dann #1--#4 als Platzhalter für die entsprechenden Parameter zur Verfügung.
Im Aufruf wären dann
\nomindexed{A}{B}{C}
und
\nomindexed[c]{A}{B}{C}
äquivalent.
tobi75 hat geschrieben: (wenn ich den Term weglasse funktioniert es nicht mehr)
Innerhalb der Definition?
Nun, wenn Du da das [c] weglässt, erwartet \nomindexed, vier Parameter zu bekommen, d. h. Du müsstest dann aus
\nomindexed{m}{A}{Test 1}
etwa
\nomindexed{c}{m}{A}{Test 1}
machen.
tobi75 hat geschrieben: und was der Ausdruck [#1#2_#3] bewirkt.
bei
\newcommand*\nomindexed[4][c]{%
  \nomenclature[#1#2_#3]{$#2_{#3}$}{#4}%
}
und
\nomindexed{m}{A}{Test 1}
wird daraus `cm_A' (#1=c, #2=m, #3=A) und als optionales Argument an \nomenclature -- zur Sortierung -- übergeben.

MfG
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

tobi75
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 26. Sep 2012, 10:17

Beitrag von tobi75 »

rais hat geschrieben:
\newcommand*\nomindexed[4][c]{...}
heißt in etwa ``Definiere einen neuen Befehl `\nomindexed'. Dieser soll vier ([4]) Parameter bekommen können, von denen der erste optinal ist (die zweite eckige Klammer). Wenn dieser optionale Parameter nicht angegeben wird, nimm `c' dafür an (den Inhalt der zweiten eckigen Klammer).''
Innerhalb {...} stehen dann #1--#4 als Platzhalter für die entsprechenden Parameter zur Verfügung.
gut, kapiert. Wenn ich den optionalen Parameter nicht vorbelegen würde, also sinngemäß: der erste Parameter ist optional und wenn er nicht angegeben ist, dann nimm gar nicht, würde man dann schreiben
\newcommand*\nomindexed[4][ ]{...}
oder geht sowas gar nicht?
rais hat geschrieben:
tobi75 hat geschrieben: und was der Ausdruck [#1#2_#3] bewirkt.
bei
\newcommand*\nomindexed[4][c]{%
  \nomenclature[#1#2_#3]{$#2_{#3}$}{#4}%
}
und
\nomindexed{m}{A}{Test 1}
wird daraus `cm_A' (#1=c, #2=m, #3=A) und als optionales Argument an \nomenclature -- zur Sortierung -- übergeben.
MfG
woher weiß denn \nomenclature, dass es den Parameter [cm_A] zur Sortierung verwenden soll und nicht irgendwas anderes damit macht? Es muss ja aus der Information cm_A übersetzen: lege diesen Eintrag im Abschnitt c ab. Sortiere zuerst nach m und dann nach A, wobei fehlende Zeichen bzw. kürzere Zeichenketten von A nach oben zu packen sind.

Im übrigen, muss ich in meiner Nomenklatur alle Einträge mit diesem umdefinierten Befehl erfassen, da ansonsten alle mit \nomenclature eingetragenen Werte vor den \nomindexed Einträgen kommen. Das geht aber Problemlos indem ich aus
\nomindexed{c}{m}{A}{Test 1} 
einfach
\nomindexed{c}{m}{}{Test 1} 
mache
Dann werden auch die Einträge ohne Index an der richtigen Stelle einsortiert.

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Beitrag von rais »

tobi75 hat geschrieben:Wenn ich den optionalen Parameter nicht vorbelegen würde, also sinngemäß: der erste Parameter ist optional und wenn er nicht angegeben ist, dann nimm gar nicht, würde man dann schreiben
\newcommand*\nomindexed[4][ ]{...}
oder geht sowas gar nicht?
prinzipiell ginge das schon. Allerdings wäre hier dann bei \nomindexed{m}{x}{X} dieser Eintrag unter Gruppe `M' anzuordnen.
tobi75 hat geschrieben:
rais hat geschrieben:
tobi75 hat geschrieben: und was der Ausdruck [#1#2_#3] bewirkt.
bei
\newcommand*\nomindexed[4][c]{%
  \nomenclature[#1#2_#3]{$#2_{#3}$}{#4}%
}
und
\nomindexed{m}{A}{Test 1}
wird daraus `cm_A' (#1=c, #2=m, #3=A) und als optionales Argument an \nomenclature -- zur Sortierung -- übergeben.
MfG
woher weiß denn \nomenclature, dass es den Parameter [cm_A] zur Sortierung verwenden soll und nicht irgendwas anderes damit macht?
Was sollte \nomenclature damit anderes machen?
Der optionale Parameter beim \nomenclature-Aufruf ist für die Sortierung gedacht, was Du ja bereits selbst zur Unterscheidung `welcher Eintrag geht in welche Subkategorie' verwendest.
tobi75 hat geschrieben:
Im übrigen, muss ich in meiner Nomenklatur alle Einträge mit diesem umdefinierten Befehl erfassen, da ansonsten alle mit \nomenclature eingetragenen Werte vor den \nomindexed Einträgen kommen.
Das versteh ich nicht ganz. Wenn ich z. B. aus
\nomenclature[C]{C2}{TEST A1}
sowas wie
\nomenclature[C]{T2}{TEST A1}
mache, steht dieser Eintrag auch südlich eines etwaigen \nomindexed{m}{x}{X}
tobi75 hat geschrieben: Das geht aber Problemlos indem ich aus
\nomindexed{c}{m}{A}{Test 1} 
einfach
\nomindexed{c}{m}{}{Test 1} 
mache
Dann werden auch die Einträge ohne Index an der richtigen Stelle einsortiert.
Hmm. Vllt schaffst Du es ohne Klimmzüge mit
\newcommand*\nomindexed[4][c]{%
\nomenclature[#1$#2_#3$]{$#2_{#3}$}{#4}%
}
Wenn nicht, poste bitte ein Minimalbeispiel, das Deinen aktuellen Stand darstellt.

MfG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

tobi75
Forum-Anfänger
Forum-Anfänger
Beiträge: 29
Registriert: Mi 26. Sep 2012, 10:17

Beitrag von tobi75 »

hab mich da etwas kompliziert ausgedrückt. Nein, es ist alles gut und funktioniert super.
Also, herzlichen Dank noch einmal für Deine Hilfe! :-)

Antworten