TU-Dresden » Startseite Forum » Forum

TU-Dresden Forum

Aktuelle Zeit: Donnerstag 2. Dezember 2021, 01:21

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Montag 18. Januar 2021, 07:53 
Offline

Registriert: Samstag 7. September 2019, 17:17
Beiträge: 20
Ich nutze das Formelzeichenverzeichnis wie in treatise.pdf vorgeschlagen.

Nun ist mir aufgefallen, dass die Sortierung von glossaries nicht case-sensitive ist und ich wollte hier gern mal eure Gedanken dazu hören.

Folgende Gedanken meinerseits:
  1. Im Befehl \newformulasymbol wird der Sort-Key schon auf das Label des Eintrags gesetzt:
    Code:
    \newcommand*{\newformulasymbol}[5][]{%
    \ifisgreeksymbol{#4}{%
    \renewcommand*{\symbollettergroup}{greekletters}%
    }{%
    \renewcommand*{\symbollettergroup}{romanletters}%
    }%
    \newglossaryentry{#2}{%
    4 Vor- und Nachspann 25
    type=symbols,%
    name={#3},%
    description={\nopostdesc},%
    symbol={\ensuremath{#4}},%
    user1={\ensuremath{\mathrm{#5}}},%
    sort={#2},%
    parent={\symbollettergroup},%
    #1%
    }%
    }

    Wird dadurch ein anderer Sort-Key überhaupt noch berücksichtigt? (\newformulasymbol[sort=aa]{...}...)
    Soweit ich das erkennen kann, nutzt glossaries wenn nicht anders angegeben name als Sort-Key. Warum bleibt hier sort nicht einfach leer?
  2. glossaries gibt die Möglichkeit zum sortieren per Definition (sort=def), also könnte man über die Reihenfolge von \newformulasymbol die Reihenfolge festlegen.
  3. Hier wird noch eine interessante Lösung vorgestellt, wo man durch Voransetzen von < und > im Sort-Key eine Sortierung nach Groß- und Kleinbuchstaben erreicht.

Wie macht ihr das?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Montag 18. Januar 2021, 15:50 
Offline

Registriert: Freitag 9. September 2011, 14:57
Beiträge: 541
Das die Sortierung case-insensitive ist, kann ich nicht bestätigen. Ein Eintrag mit dem Label "F" wird vor "f" sortiert. Oder was genau meinst du denn?
Das Weglassen von sort=... wäre meines Erachtens nach keine gute Wahl, dann würde beispielsweise ein Eintrag \newformulasymbol{F}{Kraft}{F}{m \cdot kg \cdot s^{-2} = \sfrac{J}{m}} unter "K" einsortiert werden. Es wäre sicher auch möglich, mit sort=#4 zu arbeiten und das tatsächliche Formelzeichen anstelle des Labels zu verwenden. Dann führt die Verwendung von \newformulasymbol{...}{...}{\delta}{...} ggf. zu Problemen. Egal, wie man es anstellt, ggf. ist etwas Handarbeit notwendig. Dafür ist auch das optional Argument vorgesehen. Mit \newformulasymbol[sort=???]{}{}{}{} kannst du den Sortierungseintrag beliebig anpassen.

Grüße
Falk

_________________
TUD-Script-Klassen für das Corporate Design der TU Dresden

Anwenderhandbuch: CTAN-Mirror oder texdoc tudscr
Anwenderleitfaden: CTAN-Mirror oder texdoc treatise
Schriftinstallation: Skripte zum Download

LyX-Layoutdateien und Befehlsvervollständigung für TeXstudio
Übersicht zu allen veröffentlichten Versionen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Montag 18. Januar 2021, 17:38 
Offline

Registriert: Samstag 7. September 2019, 17:17
Beiträge: 20
Hallo Falk,

ja, richtig, die Sortierung ist nicht case-sensitive. (Hatte ich auch oben so geschrieben.)
Stimmt, da hatte ich einen Denkfehler bzgl. sort -- der Befehl setzt ja das Label und nicht den Namen! Dann ergibt es so am meisten Sinn, da bin ich bei dir.
Hast du eine Meinung zu 2. bzw. 3.?

Habe auch gemerkt, dass ich ja xindy benutze und das eigentlich sehr wohl kleine Buchstaben zuerst einsortieren sollte (4.5 in Xindy FAQ). Jetzt bin ich komplett verwirrt.

Grüße
Max


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Dienstag 19. Januar 2021, 00:55 
Offline

Registriert: Freitag 9. September 2011, 14:57
Beiträge: 541
Hallo Max,
xfa hat geschrieben:
ja, richtig, die Sortierung ist nicht case-sensitive. (Hatte ich auch oben so geschrieben.)

Sorry, Knoten meinerseits im Kopf. Wenn ich dich richtig verstehe, hättest du gerne ein Sortierung in der Reihenfolge [A-Z][a-z][Gamma-Omega][alpha-omega]?

Um das zu automatisieren, kann man sich eine geordnete Liste aller möglichen Anfangsbuchstaben definieren
{A,...,Z,a,...,z,\Gamma,...,\Omega,\alpha,...,\omega} und diese beim Definieren eines Formelzeichens durchlaufen und den dazugehörigen Index suchen, welchen man dann für sort=... setzen möchte. Dabei muss man allerdings etwas mit der Expansion der Makros herumzaubern. In etwa so:
Code:
\makeatletter
\newcommand*\sort@index[2]{%
  \begingroup%
    \def\@tempa##1##2\@nil{\def\@tempb{##1}}%
    \@tempa#2\@nil%
    \@tempswafalse%
    \@tempcnta=0%
    \def\@tempa##1{%
      \def\@tempc{##1}%
      \ifx\@tempb\@tempc\@tempswatrue\fi%
      \if@tempswa\else\advance\@tempcnta\@ne\fi%
    }%
    \forcsvlist{\@tempa}{%
      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,%
      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,ß,%
      \Alpha,\Beta,\Gamma,\Delta,\Epsilon,\Zeta,\Eta,\Theta,\Iota,%
      \Kappa,\Lambda,\Mu,\Nu,\Xi,\Omicron,\Pi,\Rho,\Sigma,\Tau,\Upsilon,%
      \Phi,\Chi,\Psi,\Omega,%
      \alpha,\beta,\varbeta,\gamma,\delta,\epsilon,\varepsilon,\zeta,%
      \eta,\theta,\vartheta,\iota,\kappa,\varkappa,\lambda,\mu,\nu,%
      \xi,\omicron,\pi,\varpi,\rho,\varrho,\sigma,\varsigma,\tau,%
      \upsilon,\phi,\varphi,\chi,\psi,\omega%
    }%
    \edef\@tempa{%
      \endgroup%
      \unexpanded{\def#1}{%
        \ifnum\@tempcnta<100 0\fi\ifnum\@tempcnta<10 0\fi\the\@tempcnta%
        \detokenize{#2}%
      }%
    }%
  \@tempa%
}
\newcommand*{\newformulasymbol}[5][]{%
  \begingroup%
    \def\@tempa{%
      type=symbols,%
      name={#3},%
      description={\nopostdesc},%
      symbol={\ensuremath{#4}},%
      user1={\ensuremath{\mathrm{#5}}},%
      #1%
    }%
    \sort@index\@tempb{#4}%
    \epreto\@tempa{sort=\@tempb,}%
    \edef\@tempb{%
      \endgroup%
      \unexpanded{\newglossaryentry{#2}}{\expandonce\@tempa}%
    }%
  \@tempb%
}
\makeatother

\newformulasymbol{l1}{Eintrag a}{a}{--}
\newformulasymbol{l4}{Eintrag gamma}{\gamma}{--}
\newformulasymbol{l5}{Eintrag Omega}{\Omega}{--}
\newformulasymbol{l2}{Eintrag A}{A}{--}
\newformulasymbol{l3}{Eintrag C}{C}{--}
\gls{l1}\gls{l2}\gls{l3}\gls{l4}\gls{l5}

_________________
TUD-Script-Klassen für das Corporate Design der TU Dresden

Anwenderhandbuch: CTAN-Mirror oder texdoc tudscr
Anwenderleitfaden: CTAN-Mirror oder texdoc treatise
Schriftinstallation: Skripte zum Download

LyX-Layoutdateien und Befehlsvervollständigung für TeXstudio
Übersicht zu allen veröffentlichten Versionen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Montag 25. Januar 2021, 20:39 
Offline

Registriert: Samstag 7. September 2019, 17:17
Beiträge: 20
Hallo Falk,

erst einmal Danke für die viele Arbeit!
Leider bekomme ich dein Beispiel nicht zum Laufen... ich bin deiner Latex-Zauberei nicht mächtig :)

Ich benutze dein Code-Beispiel zum Trennen von griechischen und lateinischen Buchstaben, mit leichten Modifikationen:
  • \mathring hinzugefügt
  • Einheiten setzen mit siunitx
  • Keine Nennung der Bezeichnung bei erster Verwendung im Text
Code:
% parent entries
\providecommand*\greeklettersname{Greek letters}
\providecommand*\romanlettersname{Roman letters}
\newglossaryentry{greekletters}{%
type=symbols,%
name={\greeklettersname},%
description={\nopostdesc},%
sort={a}%
}
\newglossaryentry{romanletters}{%
type=symbols,%
name={\romanlettersname},%
description={\nopostdesc},%
sort={b}%
}
% localization
\providecaptionname{%
american,australian,british,canadian,english,newzealand%
}{\greeklettersname}{Greek letters}
\providecaptionname{%
german,ngerman,austrian,naustrian,swissgerman,nswissgerman%
}{\greeklettersname}{Griechische Symbole}
\providecaptionname{%
american,australian,british,canadian,english,newzealand%
}{\romanlettersname}{Roman letters}
\providecaptionname{%
german,ngerman,austrian,naustrian,swissgerman,nswissgerman%
}{\romanlettersname}{Lateinische Symbole}
% automatically detect if greek letter
\makeatletter
\newcommand*\greeksymbollist{}
\def\@tempa#1{\ifdefvoid{#1}{}{\listadd\greeksymbollist{#1}}}
\forcsvlist{\@tempa}{%
\alpha,\beta,\varbeta,\gamma,\delta,\epsilon,\varepsilon,\zeta,%
\eta,\theta,\vartheta,\iota,\kappa,\varkappa,\lambda,\mu,\nu,%
\xi,\omicron,\pi,\varpi,\rho,\varrho,\sigma,\varsigma,\tau,%
\upsilon,\phi,\varphi,\chi,\psi,\omega,%
\Alpha,\Beta,\Gamma,\Delta,\Epsilon,\Zeta,\Eta,\Theta,\Iota,%
\Kappa,\Lambda,\Mu,\Nu,\Xi,\Omicron,\Pi,\Rho,\Sigma,\Tau,\Upsilon,%
\Phi,\Chi,\Psi,\Omega%
}
\newcommand*\ifisgreeksymbol[1]{%
\begingroup%
\def\@tempa##1{\let##1\@firstofone}%
\forcsvlist{\@tempa}{%
\acute,\bar,\breve,\check,\dot,\ddot,\dddot,\ddddot,%
\hat,\widehat,\mathring,\grave,\tilde,\widetilde,\vec,%
\Acute,\Bar,\Breve,\Check,\Dot,\Ddot,\Hat,\Grave,\Tilde,\Vec%
}%
\def\boldsymbol{}%
\protected@edef\@tempa{#1}%
\def\@tempb##1_##2\relax{\def\@tempa{##1}}%
\expandafter\@tempb\@tempa_\relax\relax%
\def\@tempb##1^##2\relax{\def\@tempa{##1}}%
\expandafter\@tempb\@tempa^\relax\relax%
\expandafter\ifinlist\expandafter{\@tempa}{\greeksymbollist}{%
\aftergroup\@firstoftwo%
}{%
\aftergroup\@secondoftwo%
}%
\endgroup%
}
\makeatother

% Eintrag für Formelzeichen
\glssetnoexpandfield{useri} % supress problems with expanding \si
\newcommand*\symbollettergroup{}
\newcommand*{\newformulasymbol}[5][]{%
\ifisgreeksymbol{#4}{%
\renewcommand*{\symbollettergroup}{greekletters}%
}{%
\renewcommand*{\symbollettergroup}{romanletters}%
}%
\newglossaryentry{#2}{%
type=symbols,%
name={#3},%
description={\nopostdesc},%
symbol={\ensuremath{#4}},%
user1=\si{#5},%
sort={#2},%
parent={\symbollettergroup},%
#1%
}%
}

% (deaktiviert) Anzeige von Formelzeichen und Namen im Textmodus
\defglsentryfmt[symbols]{%
%   \ifmmode%
      \glssymbol{\glslabel}%
%   \else%
%      \glsgenentryfmt~\glsentrysymbol{\glslabel}%
%   \fi%
}


Was ich erreichen möchte, ist eine Sortierung nach DIN 5007-1, wonach die Kleinbuchstaben vor den Großbuchstaben kommen sollten.
Also {a,A,b,B,...,z,Z} und analog für die griechischen Symbole.
Xindy sortiert wohl nach dem ISO Alphabet, dort kommen aber die Großbuchstaben zuerst.

Ein Workaround: sort-Key genau umgekehrt vergeben, also Großbuchstaben und Kleinbuchstaben vertauschen: ...[sort=A]{a}...
Nur wie mache ich das bei den griechischen Symbolen?

Übrigens, was hältst du vom Ansatz von bib2gls?
Beispiele von Nicola Talbot (weitestgehend identisch):
https://tex.stackexchange.com/questions/348640/how-to-effectively-use-list-of-symbols-for-a-thesis
https://tex.stackexchange.com/questions/447208/ordered-symbols-list-with-units


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Dienstag 26. Januar 2021, 00:58 
Offline

Registriert: Freitag 9. September 2011, 14:57
Beiträge: 541
bib2gls verlagert das Problem ja nur, auch hier muss du über den citekey die Sortierung manuell vornehmen. Probier's mal hiermit. Die Listen \glssort@roman und \glssort@greek geben die Sortierreihenfolge vor, die kannst du dir anpassen, wie es dir beliebt.
Code:
\documentclass[english,ngerman]{tudscrreprt}
\usepackage{iftex}
\iftutex
  \usepackage{fontspec}
\else
  \usepackage[T1]{fontenc}
  \usepackage[ngerman=ngerman-x-latest]{hyphsubst}
\fi
\usepackage{babel}
\usepackage{xltabular}
\usepackage{booktabs}
\usepackage{siunitx}

\AfterPackage*{hyperref}{%
\usepackage[%
%  acronym,% Abkürzungen
  symbols,% Formelzeichen
  nomain,% kein Glossar
  nogroupskip,%
  toc,%
  section=chapter,%
  nostyles,%
  translate=babel,%
% mit Tex Live einfach verwendbar
  xindy={language=german-din},
]{glossaries}
\makeglossaries
}% Ende von AfterPackage

\makeatletter
\newcommand*\glssort@roman{%
  a,A,b,B,c,C,d,D,e,E,f,F,g,G,h,H,i,I,j,J,k,K,l,L,m,M,
  n,N,o,O,p,P,q,Q,r,R,s,S,t,T,u,U,v,V,w,W,x,X,y,Y,z,Z%
}
\newcommand*\glssort@greek{%
  \alpha,\Alpha,\beta,\varbeta,\Beta,\gamma,\Gamma,\delta,\Delta,%
  \epsilon,\varepsilon,\Epsilon,\zeta,\Zeta,\eta,\Eta,\theta,\vartheta,\Theta,%
  \iota,\Iota,\kappa,\varkappa,\Kappa,\lambda,\Lambda,\mu,\Mu,\nu,\Nu,\xi,\Xi,%
  \omicron,\Omicron,\pi,\varpi,\Pi,\rho,\varrho,\Rho,\sigma,\varsigma,\Sigma,%
  \tau,\Tau,\upsilon,\Upsilon,\phi,\varphi,\Phi,\chi,\Chi,\psi,\Psi,%
  \omega,\varomega,\Omega%
}
\newcommand*\glssort@accent{%
  \acute,\bar,\breve,\check,\dot,\ddot,\dddot,\ddddot,%
  \hat,\widehat,\grave,\tilde,\widetilde,\vec,\mathring,%
  \Acute,\Bar,\Breve,\Check,\Dot,\Ddot,\Hat,\Grave,\Tilde,\Vec%
}
\newcommand*\glssort@index[2]{%
  \begingroup%
    \glssort@sanitize\@tempa{#2}%
    % erster Token für Vergleich
    \def\@tempc##1##2\@nil{\def\@tempb{##1}}%
    \expandafter\@tempc\@tempa\@nil%
    \@tempswafalse%
    \@tempcnta=0%
    % Schleife für Token-Vergleich aus Listen \glssort@roman und \glssort@greek
    \def\do##1{%
      \if@tempswa\else%
        \def\@tempc{##1}%
        \ifx\@tempb\@tempc\@tempswatrue\fi%
        \if@tempswa\else\advance\@tempcnta\@ne\fi%
      \fi%
    }%
    \edef\@tempc{\expandonce\glssort@roman,\expandonce\glssort@greek}%
    \expandafter\docsvlist\expandafter{\@tempc}%
    \edef\@tempa{%
      \endgroup%
      \unexpanded{\def#1}{%
        \ifnum\@tempcnta<100 0\fi\ifnum\@tempcnta<10 0\fi\the\@tempcnta%
        \space\detokenize\expandafter{\@tempa}%
      }%
    }%
  \@tempa%
  \typeout{+++++ generated sort index: #1}%
}
\AfterPackage*{glossaries}{%
  \newcommand*\symbollettergroup{}
  \newcommand*\newformulasymbol[5][]{%
    \ifisgreeksymbol{#4}{%
      \renewcommand*{\symbollettergroup}{greekletters}%
    }{%
      \renewcommand*{\symbollettergroup}{romanletters}%
    }%
    \begingroup%
      \def\@tempa{%
        type=symbols,%
        parent={\symbollettergroup},%
        name={#3},%
        description={\nopostdesc},%
        symbol={\ensuremath{#4}},%
        user1={\si{#5}},%
        #1%
      }%
      \glssort@index\@tempb{#4}%
      \epreto\@tempa{sort=\@tempb,}%
      \edef\@tempb{%
        \endgroup%
        \unexpanded{\newglossaryentry{#2}}{\expandonce\@tempa}%
      }%
    \@tempb%
  }%
  \defglsentryfmt[symbols]{%
    \ifmmode%
      \glssymbol{\glslabel}%
    \else%
      \glsgenentryfmt~\glsentrysymbol{\glslabel}%
    \fi%
  }
  \providecommand*\greeklettersname{Greek letters}
  \providecommand*\romanlettersname{Roman letters}
  \newglossaryentry{greekletters}{%
    type=symbols,%
    name={\greeklettersname},%
    description={\nopostdesc},%
    sort={a}%
  }
  \newglossaryentry{romanletters}{%
    type=symbols,%
    name={\romanlettersname},%
    description={\nopostdesc},%
    sort={b}%
  }
  \newglossarystyle{symbxltab}{%
    \newcommand*\symbollevel{-1}%
    \renewenvironment{theglossary}{%
      \xltabular[l]{\linewidth}{ccXl}%
    }{%
      \endxltabular%
    }%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand*{\glsgroupskip}{}%
    \newcommand*\symbolhead{%
      \toprule
      \bfseries Formelzeichen & \bfseries Einheit &
      \bfseries Bezeichnung %& \bfseries Seite(n)
      \tabularnewline\midrule
    }%
    \renewcommand*{\glossaryheader}{%
      \endfirsthead%
      \symbolhead\endhead%
      \bottomrule\endfoot%
      \gdef\symbollevel{-1}%
    }%
    \renewcommand*{\glossentry}[2]{%
      \ifglshaschildren{##1}{%
        \ifnum\symbollevel>0\relax%
          \tabularnewline\bottomrule\tabularnewline[\smallskipamount]%
        \fi
        \gdef\symbollevel{0}%
        \tabularnewline[%
          \arraystretch\dimexpr-\ht\strutbox-\dp\strutbox\relax%
        ]%
%        \multicolumn{4}{@{}l@{}}{\minisec{\glsentryname{##1}}}%mit Seitenangabe
        \multicolumn{3}{@{}l@{}}{\minisec{\glsentryname{##1}}}%ohne Seitenangabe
      }{%
        \GlossariesWarning{%
          There are no childrens for entry ##1.\MessageBreak
          Nothing will be printed. Maybe you should\MessageBreak
          specify ##1 as a child entry.
        }%
      }%
    }%
    \renewcommand*{\subglossentry}[3]{%
      \ifnum\symbollevel=0\relax%
        \tabularnewline[\medskipamount]\symbolhead%
      \else%
        \tabularnewline
      \fi%
      \gdef\symbollevel{##1}%
      \glsentryitem{##2}% Entry number if required
      \glstarget{##2}{\glossentrysymbol{##2}} &
      \glsentryuseri{##2} &
      \glossentryname{##2}%
      %& ##3% mit Seitenangabe
    }%
  }
}% Ende von AfterPackage
\newcommand*\glssort@sanitize[2]{%
  \begingroup%
    \@tempcnta=0%
    \def\do##1{%
      \advance\@tempcnta\@ne%
      % für accents wird an Argument Suffix für sort-Key angehängt
      \edef##1####1{####1|\ifnum\@tempcnta<10 0\fi\the\@tempcnta}%
    }%
    \expandafter\docsvlist\expandafter{\glssort@accent}%
    \let\boldsymbol\relax%
    \protected@edef\@tempa{\endgroup\unexpanded{\def#1}{#2}}%
  \@tempa%
}
\newcommand*\ifisgreeksymbol[1]{%
  \begingroup%
    \glssort@sanitize\@tempa{#1}%
    \def\@tempb##1##2\@nil{\def\@tempa{##1}}%
    \expandafter\@tempb\@tempa\@nil%
    \edef\@tempb{%
      \noexpand\in@{,\expandonce\@tempa,}{,\expandonce\glssort@greek,}%
    }%
    \@tempb%
    \ifin@
      \aftergroup\@firstoftwo%
    \else%
      \aftergroup\@secondoftwo%
    \fi%
  \endgroup%
}
\makeatother

\usepackage{xfrac}
\usepackage[colorlinks]{hyperref}

\begin{document}

\newformulasymbol{A}{Flache}{A}{\square\metre}
\newformulasymbol{a}{Beschleunigung}{a}{\metre\per\square\second}
\newformulasymbol{delta}{Winkel delta}{\delta}{\radian}
\newformulasymbol{delta_b}{Winkel delta-b}{\delta_b}{\radian}
\newformulasymbol{gamma}{Winkel gamma}{\gamma_x}{\radian}
\newformulasymbol{gamma-hat}{Winkel gamma hat}{\hat{\gamma}_x}{\radian}

\gls{A}

\gls{a}

\gls{gamma-hat}

\gls{delta_b}

\[\gls{A}\quad\gls{a}\quad\gls{gamma}\quad\gls{delta}\]

\printsymbols[style=symbxltab]

\end{document}



Dateianhänge:
gloss.pdf [44.26 KiB]
73-mal heruntergeladen

_________________
TUD-Script-Klassen für das Corporate Design der TU Dresden

Anwenderhandbuch: CTAN-Mirror oder texdoc tudscr
Anwenderleitfaden: CTAN-Mirror oder texdoc treatise
Schriftinstallation: Skripte zum Download

LyX-Layoutdateien und Befehlsvervollständigung für TeXstudio
Übersicht zu allen veröffentlichten Versionen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Dienstag 26. Januar 2021, 07:27 
Offline

Registriert: Samstag 7. September 2019, 17:17
Beiträge: 20
Ich finde deinen Ansatz super, aber ich bekomme leider folgende Fehlermeldung:
Zitat:
+++++ generated sort index: 000 a|02
+++++ generated sort index: 001 A
+++++ generated sort index: 004 c
+++++ generated sort index: 005 C
+++++ generated sort index: 005 C_\protect \mathrm {n}
+++++ generated sort index: 004 c_\protect \mathrm {W}
+++++ generated sort index: 008 e
+++++ generated sort index: 008 e|12
+++++ generated sort index: 008 e_\protect \mathrm {lim}
+++++ generated sort index: 009 E
+++++ generated sort index: 009 E_\protect \mathrm {ab}
+++++ generated sort index: 009 E_\protect \mathrm {F}
+++++ generated sort index: 009 E_\protect \mathrm {m}
+++++ generated sort index: 009 E_\protect \mathrm {r}
+++++ generated sort index: 009 E_{\protect \mathrm {r},n}
! Package xkeyval Error: `n}' undefined in families `glossentry'.


Der fragliche Eintrag ist \newformulasymbol{Ern}{Bemessungsenergie mit der Zeitbasis $n$}{\Ern}{\W\hour}.
Am $n$ scheint es nicht zu liegen, denn lasse ich dieses weg, bleibt der Fehler bestehen.
Ich hatte in deinem Quelltext noch folgendes entdeckt, scheint aber auch nicht der Fehler zu sein:
Zitat:
\newcommand*\glssort@roman{%
a,A,b,B,c,C,d,D,e,E,f,F,g,G,h,H,i,I,j,J,k,K,l,L,m,M,%
n,N,o,O,p,P,q,Q,r,R,s,S,t,T,u,U,v,V,w,W,x,X,y,Y,z,Z%
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Dienstag 26. Januar 2021, 10:11 
Offline

Registriert: Freitag 9. September 2011, 14:57
Beiträge: 541
Bevor ich mir erneut die Mühe mache, für abermals neue Anforderungen neue Lösungen zu entwickeln, würde ich von dir erst einmal wissen, wie viel von dem Code du denn verstanden hast? Was wäre denn das von dir erwartete Verhalten? Warum definierst du denn überhaupt den Befehl \Ern wenn du im Dokument doch einfach \gls{Ern} verwenden könntest? Was hast du denn schon probiert, um das Beispiel für deinen konkreten Fall zum Laufen zu bekommen?

Mir geht es in erster Linie darum, dass du -- zumindest im Groben -- verstehst, was der Code macht und was passiert. Beim Formulieren eines Problems zukünftig etwas genauer wirst, was die Anforderungen anbelangt. Ich kann nämlich keine Gedanken lesen. Und einfach immer wieder neue Lösungen hinwerfen, hilft weder dir noch mir. Dir nicht, weil du schlichtweg nichts lernst und vorgefertigte Lösungen C&P verwendest, was früher oder später zu Problemen führen kann/wird. Und mir nicht, weil ich abermalige Anfragen aufgrund neuer/geänderter Anforderungen bekomme, anstatt das du diese ggf. selber lösen könntest. Bei deinem konkreten Problem ist nämlich genau das der Fall. Die Lösung ist eigentlich schnell gefunden...

_________________
TUD-Script-Klassen für das Corporate Design der TU Dresden

Anwenderhandbuch: CTAN-Mirror oder texdoc tudscr
Anwenderleitfaden: CTAN-Mirror oder texdoc treatise
Schriftinstallation: Skripte zum Download

LyX-Layoutdateien und Befehlsvervollständigung für TeXstudio
Übersicht zu allen veröffentlichten Versionen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Dienstag 26. Januar 2021, 12:28 
Offline

Registriert: Samstag 7. September 2019, 17:17
Beiträge: 20
Hi, verstehe ich, dass es jedes Mal viel Aufwand ist. Ich hatte eigentlich gehofft, dass es irgendeine Option bei Xindy gibt, um die Sortierung richtig einzustellen... aber da blicke ich nicht durch die Dokumentation der Optionen durch.

Also, folgende böhmische Dörfer:
  1. Frage zum Grundprinzip: wird eigentlich noch irgendwas mit Xindy sortiert oder sortierst du jetzt selbst? Bzw. was macht dann Xindy noch?
  2. Bei den Befehlen \newcommand*\glssort@index[2]{...}, \newcommand*\glssort@sanitize[2]{...} und \newcommand*\ifisgreeksymbol[1]{...} habe ich zwar eine Ahnung, was passieren soll (sortieren, Akzente etc. entfernen, Griechisch/Latein trennen), aber keine Ahnung, wie es funktioniert.
  3. Generell sind mir die ganze Expandierungs-Regeln völlig schleierhaft. \noexpand, \expandafter, \expandonce, ####1

Die Listen verstehe ich, auch wenn ich nicht weiß, wie sie verarbeitet werden.
Deinen Stil habe ich durch meinen alten Stil mit longtabu ersetzt, das bekomme ich auch hin.
Die Grundidee von \newformulasymbol verstehe ich auch.

Bzgl. der extra Mathe-Befehle. Zum einen ist das historisch gewachsen, weil ich externe TikZ Dateien hatte, bei denen ich glossaries nicht zum Laufen bekommen habe.
Zum anderen habe ich aber auch folgende Konstrukte:
  • Eine Variable soll verschiedene Indizes haben, aber auf die gleiche allgemeine Form im Formelverzeichnis referenzieren.
  • Das habe ich gelöst mit:
    Code:
    \newcommand{\Pteq}[1]{\tilde{P}_{\mathrm{t},#1}}
    \newformulasymbol{Pteq}{äquivalente Referenzleistung bezogen auf $r\It$}{\Pteq{r}}{\W}
    Und im Text:
    Code:
    Ein Beispiel sind $\glslink{Pteq}{\Pteq{0,5}}$, $\glslink{Pteq}{\Pteq{1}}$ und $\glslink{Pteq}{\Pteq{99}}$.

Also habe ich folgende Fälle für die Formelzeichen
Code:
\newcommand{\aavg}{\bar{a}}
\newformulasymbol{aavg}{mittlere Beschleunigung}{\aavg}{\m\per\square\s}

\newformulasymbol{A}{Stirnfläche}{A}{\square\metre}

\newcommand{\Pteq}[1]{\tilde{P}_{\mathrm{t},#1}}
\newformulasymbol{Pteq}{äquivalente Referenzleistung bezogen auf $r$}{\Pteq{r}}{\W}

\newformulasymbol{U}{Spannung}{U}{\V}

\newcommand{\dU}{\Delta U}
\newformulasymbol[sort=UD]{dU}{Spannungshub}{\dU}{\V}

\newformulasymbol{eta}{Wirkungsgrad}{\eta}{1}

\newcommand{\thetac}{\vartheta_\mathrm{c}}
\newformulasymbol{thetac}{Temperatur}{\thetac}{\celsius}

\newformulasymbol{Func}{Funktionalität}{\Xi}{1}
\newformulasymbol{fxi}{funktionale Dauer}{\xi}{\hour}


Die gewünschte Sortierung ist:
  • Griechisch/Latein getrennt
  • Kleinbuchstaben vor Großbuchstaben
  • Sonderfall: \Delta U soll nach U einsortiert werden (auch manuell möglich)

Code:
% Latein
\bar{a}
A
\tilde{P}_{\mathrm{t},r}
U
\Delta U

% Griechisch
\eta
\vartheta_\mathrm{c}
\xi
\Xi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Sortierung im Formelzeichenverzeichnis
BeitragVerfasst: Dienstag 26. Januar 2021, 14:00 
Offline

Registriert: Freitag 9. September 2011, 14:57
Beiträge: 541
Damit kann ich arbeiten ^^

Xindy nutzt bei diesem Ansatz zum Sortieren den Wert von sort=.... Für lateinische Letter gäbe es vermutlich eine Sortieroption, aber bei den griechischen ist da nicht viel zu machen. Da müsste man händisch wahrscheinlich selbst Regeln definieren und spätestens bei den ganzen Akzenten wird es dann auch wieder Murks.

Die Expansionen sind tatsächlich sehr gewöhnungsbedürftig, da muss man einiges an Lehrgeld zahlen, bis man da halbwegs dahinter steigt. Ganz kurzer Abriss:
  • \expandafter verzögert die Expansion des nachfolgenden Token einmalig. Ein Konstrukt wie \expandafter\docsvlist\expandafter{\@tempc} verzögert die Expansion von \docsvlist und {. Es wird also erst \@tempc einmal expandiert und dann \docsvlist{<Inhalt von \@tempc>} ausgeführt
  • der TeX-Befehl \edef expandiert alles, was gegeben wird. In diesem Kontext sorgt \expandonce{...} (kommt aus etoolbox und ist ein Wrapper für \unexpanded\expandafter{...} dafür, dass der Inhalt des Argumentes dennoch nur einmalig und nicht vollständig expandiert wird. Ich nutze das relativ häufig, um mir umständlich Wiederholungen von \expandafter zu ersparen.
  • \noexpand expandiert in diesem Kontext den nächsten Token überhaupt nicht, \unexpanded{...} schützt das gesamte Argument vor der Expansion
Das in aller Kürze.

Mir ist ein kleiner Fehler beim sort-Key unterlaufen. Mach mal aus \epreto\@tempa{sort=\@tempb,}% ein \epreto\@tempa{sort={\@tempb},}%. Hintergrund: \glssort@index\@tempb{#4} baut einen Key und expandiert das Ergebnis in \@tempb, wobei alle Zeichen den catcode=12 haben (noch so ein kryptisches TeX-Konstrukt), weshalb alle im Argument angegeben geschweiften Klammern nicht mehr in ihrer ursprünglichen Funktion erkannt werden.

Noch als Hinweis: Ich habe longtabu absichtlich herausgenommen. Das Paket wird seit langem nicht mehr gewartet und sollte nicht mehr verwendet werden, da es jederzeit zu neuerlichen Problemen führen kann: https://github.com/tabu-issues-for-futu ... ainer/tabu

Zu deinem eigentlichen Problem: Den Befehl \glssort@sanitize hast du richtig eingeordnet. Dieser sorgt dafür, dass bei der Expansion des Symbols alles, was nicht wirklich relevant ist (Akzente, Formatierungsbefehle etc.) unschädlich gemacht werden. Das ganze erfolgt lokal in einer Gruppe und nur das expandierte Ergebnis wird zurückgeliefert. Da du in den Symbolen \mathrm nutzt, muss das auch behandelt werden. Du kannst also einfach innerhalb von \glssort@sanitize mit \let\mathrm\@firstofone dafür sorgen, dass dieser Befehl hier einfach in sein übergebenes Argument expandiert. Das kannst du direkt vor oder nach \let\boldsymbol\relax einfügen. Willst du später weitere Auszeichnungsbefehle nutzen, ist es an dieser Stelle notwendig zu definieren, wie diese (für das Erstellen des sort-Schlüssels) expandieren sollen.

Für die Delta-Geschichte würde ich einen eigenen Befehl definieren und den innerhalb von \glssort@sanitize als Akzent behandeln. Dann kannst du auch gleich die Sortierreihenfolge festlegen. Sprich, anstelle von \Delta U machst du einfach das hier: \newcommand*\diff[1]{\upDelta#1} (oder anders; jedenfalls sollte da etwas aufrechtes stehen, weil es ein Operator und keine Variable ist) und schmeiß \diff einfach mit in die Liste \glssort@accent.

Als letzen Hinweis würde ich noch anmerken, dass du dir einfach \Pteq so definierst, dass es den Link direkt nutzt, dann musst du nicht jedesmal \glslink im Text verwenden (0.5 würde ich gegenüber 0,5 vorziehen):
Code:
\newformulasymbol{Pteq}{äquivalente Referenzleistung bezogen auf $r$}
  {\tilde{P}_{\mathrm{t},r}}{\W}
\newcommand*\Pteq[1][r]{\glslink{Pteq}{\ensuremath{\tilde{P}_{\mathrm{t},#1}}}}


Grüße
Falk

Code:
\documentclass[english,ngerman]{tudscrreprt}
\usepackage{iftex}
\iftutex
  \usepackage{fontspec}
\else
  \usepackage[T1]{fontenc}
  \usepackage[ngerman=ngerman-x-latest]{hyphsubst}
\fi
\usepackage{babel}
\usepackage{xltabular}
\usepackage{booktabs}
\usepackage{siunitx}

\AfterPackage*{hyperref}{%
\usepackage[%
%  acronym,% Abkürzungen
  symbols,% Formelzeichen
  nomain,% kein Glossar
  nogroupskip,%
  toc,%
  section=chapter,%
  nostyles,%
  translate=babel,%
% mit Tex Live einfach verwendbar
  xindy={language=german-din},
]{glossaries}
\makeglossaries
}% Ende von AfterPackage

\makeatletter
\newcommand*\glssort@roman{%
  a,A,b,B,c,C,d,D,e,E,f,F,g,G,h,H,i,I,j,J,k,K,l,L,m,M,
  n,N,o,O,p,P,q,Q,r,R,s,S,t,T,u,U,v,V,w,W,x,X,y,Y,z,Z%
}
\newcommand*\glssort@greek{%
  \alpha,\Alpha,\beta,\varbeta,\Beta,\gamma,\Gamma,\delta,\Delta,%
  \epsilon,\varepsilon,\Epsilon,\zeta,\Zeta,\eta,\Eta,\theta,\vartheta,\Theta,%
  \iota,\Iota,\kappa,\varkappa,\Kappa,\lambda,\Lambda,\mu,\Mu,\nu,\Nu,\xi,\Xi,%
  \omicron,\Omicron,\pi,\varpi,\Pi,\rho,\varrho,\Rho,\sigma,\varsigma,\Sigma,%
  \tau,\Tau,\upsilon,\Upsilon,\phi,\varphi,\Phi,\chi,\Chi,\psi,\Psi,%
  \omega,\varomega,\Omega%
}
\newcommand*\diff[1]{\upDelta#1}
\newcommand*\glssort@accent{%
  \diff,\acute,\bar,\breve,\check,\dot,\ddot,\dddot,\ddddot,%
  \hat,\widehat,\grave,\tilde,\widetilde,\vec,\mathring,%
  \Acute,\Bar,\Breve,\Check,\Dot,\Ddot,\Hat,\Grave,\Tilde,\Vec%
}
\newcommand*\glssort@index[2]{%
  \begingroup%
    \glssort@sanitize\@tempa{#2}%
    % erster Token für Vergleich
    \def\@tempc##1##2\@nil{\def\@tempb{##1}}%
    \expandafter\@tempc\@tempa\@nil%
    \@tempswafalse%
    \@tempcnta=0%
    % Schleife für Token-Vergleich aus Listen \glssort@roman und \glssort@greek
    \def\do##1{%
      \if@tempswa\else%
        \def\@tempc{##1}%
        \ifx\@tempb\@tempc\@tempswatrue\fi%
        \if@tempswa\else\advance\@tempcnta\@ne\fi%
      \fi%
    }%
    \edef\@tempc{\expandonce\glssort@roman,\expandonce\glssort@greek}%
    \expandafter\docsvlist\expandafter{\@tempc}%
    \edef\@tempa{%
      \endgroup%
      \unexpanded{\def#1}{%
        \ifnum\@tempcnta<100 0\fi\ifnum\@tempcnta<10 0\fi\the\@tempcnta%
        \space\detokenize\expandafter{\@tempa}%
      }%
    }%
  \@tempa%
  \typeout{+++++ generated sort index: #1}%
}
\AfterPackage*{glossaries}{%
  \newcommand*\symbollettergroup{}
  \newcommand*\newformulasymbol[5][]{%
    \ifisgreeksymbol{#4}{%
      \renewcommand*{\symbollettergroup}{greekletters}%
    }{%
      \renewcommand*{\symbollettergroup}{romanletters}%
    }%
    \begingroup%
      \def\@tempa{%
        type=symbols,%
        parent={\symbollettergroup},%
        name={#3},%
        description={\nopostdesc},%
        symbol={\ensuremath{#4}},%
        user1={\si{#5}},%
        #1%
      }%
      \glssort@index\@tempb{#4}%
      \epreto\@tempa{sort={\@tempb},}%
      \edef\@tempb{%
        \endgroup%
        \unexpanded{\newglossaryentry{#2}}{\expandonce\@tempa}%
      }%
    \@tempb%
  }%
  \defglsentryfmt[symbols]{%
    \ifmmode%
      \glssymbol{\glslabel}%
    \else%
      \glsgenentryfmt~\glsentrysymbol{\glslabel}%
    \fi%
  }
  \providecommand*\greeklettersname{Greek letters}
  \providecommand*\romanlettersname{Roman letters}
  \newglossaryentry{greekletters}{%
    type=symbols,%
    name={\greeklettersname},%
    description={\nopostdesc},%
    sort={a}%
  }
  \newglossaryentry{romanletters}{%
    type=symbols,%
    name={\romanlettersname},%
    description={\nopostdesc},%
    sort={b}%
  }
  \newglossarystyle{symbxltab}{%
    \newcommand*\symbollevel{-1}%
    \renewenvironment{theglossary}{%
      \xltabular[l]{\linewidth}{ccXl}%
    }{%
      \endxltabular%
    }%
    \renewcommand*{\glsgroupheading}[1]{}%
    \renewcommand*{\glsgroupskip}{}%
    \newcommand*\symbolhead{%
      \toprule
      \bfseries Formelzeichen & \bfseries Einheit &
      \bfseries Bezeichnung %& \bfseries Seite(n)
      \tabularnewline\midrule
    }%
    \renewcommand*{\glossaryheader}{%
      \endfirsthead%
      \symbolhead\endhead%
      \bottomrule\endfoot%
      \gdef\symbollevel{-1}%
    }%
    \renewcommand*{\glossentry}[2]{%
      \ifglshaschildren{##1}{%
        \ifnum\symbollevel>0\relax%
          \tabularnewline\bottomrule\tabularnewline[\smallskipamount]%
        \fi
        \gdef\symbollevel{0}%
        \tabularnewline[%
          \arraystretch\dimexpr-\ht\strutbox-\dp\strutbox\relax%
        ]%
%        \multicolumn{4}{@{}l@{}}{\minisec{\glsentryname{##1}}}%mit Seitenangabe
        \multicolumn{3}{@{}l@{}}{\minisec{\glsentryname{##1}}}%ohne Seitenangabe
      }{%
        \GlossariesWarning{%
          There are no childrens for entry ##1.\MessageBreak
          Nothing will be printed. Maybe you should\MessageBreak
          specify ##1 as a child entry.
        }%
      }%
    }%
    \renewcommand*{\subglossentry}[3]{%
      \ifnum\symbollevel=0\relax%
        \tabularnewline[\medskipamount]\symbolhead%
      \else%
        \tabularnewline
      \fi%
      \gdef\symbollevel{##1}%
      \glsentryitem{##2}% Entry number if required
      \glstarget{##2}{\glossentrysymbol{##2}} &
      \glsentryuseri{##2} &
      \glossentryname{##2}%
      %& ##3% mit Seitenangabe
    }%
  }
}% Ende von AfterPackage
\newcommand*\glssort@sanitize[2]{%
  \begingroup%
    \@tempcnta=0%
    \def\do##1{%
      \advance\@tempcnta\@ne%
      % für accents wird an Argument Suffix für sort-Key angehängt
      \edef##1####1{####1|\ifnum\@tempcnta<10 0\fi\the\@tempcnta}%
    }%
    \expandafter\docsvlist\expandafter{\glssort@accent}%
    \let\boldsymbol\relax%
    \let\mathrm\@firstofone%
    \protected@edef\@tempa{\endgroup\unexpanded{\def#1}{#2}}%
  \@tempa%
}
\newcommand*\ifisgreeksymbol[1]{%
  \begingroup%
    \glssort@sanitize\@tempa{#1}%
    \def\@tempb##1##2\@nil{\def\@tempa{##1}}%
    \expandafter\@tempb\@tempa\@nil%
    \edef\@tempb{%
      \noexpand\in@{,\expandonce\@tempa,}{,\expandonce\glssort@greek,}%
    }%
    \@tempb%
    \ifin@
      \aftergroup\@firstoftwo%
    \else%
      \aftergroup\@secondoftwo%
    \fi%
  \endgroup%
}
\makeatother
\usepackage[colorlinks]{hyperref}

\AtBeginDocument{
\newformulasymbol{Pteq}{äquivalente Referenzleistung bezogen auf $r$}
  {\tilde{P}_{\mathrm{t},r}}{\W}
\newcommand*\Pteq[1][r]{\glslink{Pteq}{\ensuremath{\tilde{P}_{\mathrm{t},#1}}}}
\newformulasymbol{aavg}{mittlere Beschleunigung}{\bar{a}}{\m\per\square\s}
\newformulasymbol{A}{Stirnfläche}{A}{\square\metre}
\newformulasymbol{U}{Spannung}{U}{\V}
\newformulasymbol{dU}{Spannungshub}{\diff{U}}{\V}
\newformulasymbol{eta}{Wirkungsgrad}{\eta}{1}
\newformulasymbol{thetac}{Temperatur}{\vartheta_\mathrm{c}}{\celsius}
\newformulasymbol{Func}{Funktionalität}{\Xi}{1}
\newformulasymbol{fxi}{funktionale Dauer}{\xi}{\hour}
}

\begin{document}
Und im Text:
Ein Beispiel sind \Pteq, \Pteq[0.5] \Pteq[1] und \Pteq[99].

Also habe ich folgende Fälle für die Formelzeichen

\gls{aavg}

\gls{A}

\gls{U}

\gls{dU}

\gls{eta}

\gls{thetac}

\gls{Func}

\gls{fxi}

\printsymbols[style=symbxltab]

\end{document}

_________________
TUD-Script-Klassen für das Corporate Design der TU Dresden

Anwenderhandbuch: CTAN-Mirror oder texdoc tudscr
Anwenderleitfaden: CTAN-Mirror oder texdoc treatise
Schriftinstallation: Skripte zum Download

LyX-Layoutdateien und Befehlsvervollständigung für TeXstudio
Übersicht zu allen veröffentlichten Versionen


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron