Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 5
Tippfehler im Link korrigiert

06 Nov '20, 09:21

gast3's gravatar image

gast3
(ausgesetzt)

Das ist wieder einmal ein Expansionsproblem. `\glsxtrnewsymbol` expandiert beim Schreiben in die `*.sls`-Datei absichtlich nicht. Hier willst du aber, dass `\marke` genau einmal expandiert wird. Es gibt verschiedene Möglichkeiten, die Expansion zu erzwingen. Eine einfache wäre mit einem expandierten *runner* zu arbeiten: \DTLforeach*{matsym}{\marke=Marke,\sym=Symbol,\beschr=Beschreibung}{% \edef\myrunner{% \noexpand\glsxtrnewsymbol [description={\unexpanded\expandafter{\beschr}}]% {\unexpanded\expandafter{\marke}}% {\noexpand\ensuremath{\unexpanded\expandafter{\sym}}}% }% \myrunner } Hier wird `\glsxtrnewsymbol` nicht direkt aufgerufen, sondern ein Befehl `\myrunner` definiert, der diesen Aufruf enthält. Durch Verwendung von `\edef` wird die Definition vollständig expandiert. Mit `\noexpand` wird verhindert, dass `\glsxtrnewsymbol` dabei selbst expandiert wird. Mit `\unexpanded\expandafter{\foo}` wird dafür gesorgt, dass `\foo` nicht komplett, sondern nur eine Stufe weit expandiert wird. Es wird also die Definition von `\foo` verwendet, darin enthaltene Makros werden aber nicht expandiert. Insgesamt sieht das dann beispielsweise so aus: \documentclass{article} \usepackage{datatool} \usepackage[nomain,symbols,xindy]{glossaries-extra} \begin{filecontents*}{matsym.csv} Marke,Symbol,Beschreibung E,E,E-Modul t0,t_0,Anfangszeitpunkt tmax,t_\text{max},Endzeitpunkt w,\omega,Winkelgeschwindigkeit \end{filecontents*} \DTLloaddb{matsym}{matsym.csv} \newcommand*{\myrunner}{}% Makro quasi reservieren \DTLforeach*{matsym}{\marke=Marke,\sym=Symbol,\beschr=Beschreibung}{% \edef\myrunner{% \noexpand\glsxtrnewsymbol [description={\unexpanded\expandafter{\beschr}}]% {\unexpanded\expandafter{\marke}}% {\noexpand\ensuremath{\unexpanded\expandafter{\sym}}}% }% \myrunner } \makeglossaries \begin{document} \section{Die Tabelle, wie \textit{datatool} sie verstanden hat:} \DTLdisplaydb[Symbol]{matsym} % sprich: OHNE Symbol \section{Alle definierten Symbole werden hier genannt} \DTLforeach*{matsym}{\marke=Marke}{\gls{\marke} }% Hier wäre das explizite Expandieren auch kein Fehler. Es geht aber wohl auch so. \printglossary[type=symbols,title={Das Glossar zeigt nur den letzten Eintrag}] \end{document} [![Ergebnis mit vollständigem Glossar][1]][1] *** Eine eventuell etwas komplizierter aussehende Möglichkeit bestünde in der Verwendung von [`expl3`](https://ctan.prg/pkg/l3kernel). [`expl3`](https://ctan.org/pkg/l3kernel). Damit gibt es nämlich die Möglichkeit, Befehle zu definieren, deren Argument automatisch einfach expandiert wird. Man könnte also für die `\DTLforeach*`-Schleife einen Befehl definieren, der an `\glsxtrnewsymbol` nicht mehr `\beschr`, `\marke` und `\sym`, sondern bereits deren Expansionen übergibt. Dazu definiert man beispielsweise zunächst einen Befehl, der den in der Schleife verwendeten Befehl ganz normal enthält, beispielsweise \cs_new:Npn \dt__glsxtrnewmathsymbol:nnn #1 #2 #3 { \glsxtrnewsymbol [ description = { #1 } ] { #2 } { \ensuremath{ #3 } } } Würde man den nun in der Schleife als `\dt__glsxtrnewmathsymbol{\beschr}{\marke}{\sym}` aufrufen, so hätte man wieder den Aufruf `\glsxtrnewmathsymbol[description={\beschr}]{\marke}{\ensuremath{\sym}}` also genau dasselbe Problem wie bisher. Man kann in `l3` aber per \cs_generate_variant:Nn \dt__glsxtrnewmathsymbol:nnn { ooo } einfach eine Variante `\dt__glsxtrnewmathsymbol:ooo` aus `\dt__glsxtrnewmathsymbol:nnn` erzeugen. Der Unterschied der `ooo`-Variante ist, dass die Argumente einfach expandiert werden, bevor sie zur Anwendung kommen. Es wird dann also nicht mehr `\beschr`, `\marke` und `\sym`, sondern die Definition dieser Makros in der Schleife verwendet. Damit in der Schleife nicht die `expl3`-Syntax benötigt wird, definiert man sich noch eine Benutzeranweisung, die ohne `_` und `:` auskommt. Man erhält dann mit: \documentclass{article} \usepackage{datatool} \usepackage[nomain,symbols,xindy]{glossaries-extra} \usepackage{xparse}% Für LaTeX >= 2020-10-01 nicht mehr zwingend aber zu empfehlen. Lädt auch expl3. \begin{filecontents*}{matsym.csv} Marke,Symbol,Beschreibung E,E,E-Modul t0,t_0,Anfangszeitpunkt tmax,t_\text{max},Endzeitpunkt w,\omega,Winkelgeschwindigkeit \end{filecontents*} \ExplSyntaxOn \cs_new:Npn \dt__glsxtrnewmathsymbol:nnn #1 #2 #3 { \glsxtrnewsymbol [ description = { #1 } ] { #2 } { \ensuremath{ #3 } } } \cs_generate_variant:Nn \dt__glsxtrnewmathsymbol:nnn { ooo } \NewDocumentCommand \dtglsxtrnewmathsymbol { m m m } { \dt__glsxtrnewmathsymbol:ooo { #1 } { #2 } { #3 } } \ExplSyntaxOff \DTLloaddb{matsym}{matsym.csv} \DTLforeach*{matsym}{\marke=Marke,\sym=Symbol,\beschr=Beschreibung}{% \dtglsxtrnewmathsymbol{\beschr}{\marke}{\sym}% } \makeglossaries \begin{document} \section{Die Tabelle, wie \textit{datatool} sie verstanden hat:} \DTLdisplaydb[Symbol]{matsym} % sprich: OHNE Symbol \section{Alle definierten Symbole werden hier genannt} \DTLforeach*{matsym}{\marke=Marke}{\gls{\marke} }% Hier wäre das explizite Expandieren auch kein Fehler. Es geht aber wohl auch so. \printglossary[type=symbols,title={Das Glossar zeigt nur den letzten Eintrag}] \end{document} das oben bereits gezeigte Ergebnis. [1]: https://texwelt.de/upfiles/test_20201105_081941.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4
l3-Vorschlag ergänzt

06 Nov '20, 08:52

gast3's gravatar image

gast3
(ausgesetzt)

Das ist wieder einmal ein Expansionsproblem. `\glsxtrnewsymbol` expandiert beim Schreiben in die `*.sls`-Datei absichtlich nicht. Hier willst du aber, dass `\marke` genau einmal expandiert wird. Es gibt verschiedene Möglichkeiten, die Expansion zu erzwingen. Eine einfache wäre mit einem expandierten *runner* zu arbeiten: \DTLforeach*{matsym}{\marke=Marke,\sym=Symbol,\beschr=Beschreibung}{% \edef\myrunner{% \noexpand\glsxtrnewsymbol [description={\unexpanded\expandafter{\beschr}}]% {\unexpanded\expandafter{\marke}}% {\noexpand\ensuremath{\unexpanded\expandafter{\sym}}}% }% \myrunner } Hier wird `\glsxtrnewsymbol` nicht direkt aufgerufen, sondern ein Befehl `\myrunner` definiert, der diesen Aufruf enthält. Durch Verwendung von `\edef` wird die Definition vollständig expandiert. Mit `\noexpand` wird verhindert, dass `\glsxtrnewsymbol` dabei selbst expandiert wird. Mit `\unexpanded\expandafter{\foo}` wird dafür gesorgt, dass `\foo` nicht komplett, sondern nur eine Stufe weit expandiert wird. Es wird also die Definition von `\foo` verwendet, darin enthaltene Makros werden aber nicht expandiert. Insgesamt sieht das dann beispielsweise so aus: \documentclass{article} \usepackage{datatool} \usepackage[nomain,symbols,xindy]{glossaries-extra} \begin{filecontents*}{matsym.csv} Marke,Symbol,Beschreibung E,E,E-Modul t0,t_0,Anfangszeitpunkt tmax,t_\text{max},Endzeitpunkt w,\omega,Winkelgeschwindigkeit \end{filecontents*} \DTLloaddb{matsym}{matsym.csv} \newcommand*{\myrunner}{}% Makro quasi reservieren \DTLforeach*{matsym}{\marke=Marke,\sym=Symbol,\beschr=Beschreibung}{% \edef\myrunner{% \noexpand\glsxtrnewsymbol [description={\unexpanded\expandafter{\beschr}}]% {\unexpanded\expandafter{\marke}}% {\noexpand\ensuremath{\unexpanded\expandafter{\sym}}}% }% \myrunner } \makeglossaries \begin{document} \section{Die Tabelle, wie \textit{datatool} sie verstanden hat:} \DTLdisplaydb[Symbol]{matsym} % sprich: OHNE Symbol \section{Alle definierten Symbole werden hier genannt} \DTLforeach*{matsym}{\marke=Marke}{\gls{\marke} }% Hier wäre das explizite Expandieren auch kein Fehler. Es geht aber wohl auch so. \printglossary[type=symbols,title={Das Glossar zeigt nur den letzten Eintrag}] \end{document} [![Ergebnis mit vollständigem Glossar][1]][1] *** Eine eventuell etwas komplizierter aussehende Möglichkeit bestünde in der Verwendung von [`expl3`](https://ctan.prg/pkg/l3kernel). Damit gibt es nämlich die Möglichkeit, Befehle zu definieren, deren Argument automatisch einfach expandiert wird. Man könnte also für die `\DTLforeach*`-Schleife einen Befehl definieren, der an `\glsxtrnewsymbol` nicht mehr `\beschr`, `\marke` und `\sym`, sondern bereits deren Expansionen übergibt. Dazu definiert man beispielsweise zunächst einen Befehl, der den in der Schleife verwendeten Befehl ganz normal enthält, beispielsweise \cs_new:Npn \dt__glsxtrnewmathsymbol:nnn #1 #2 #3 { \glsxtrnewsymbol [ description = { #1 } ] { #2 } { \ensuremath{ #3 } } } Würde man den nun in der Schleife als `\dt__glsxtrnewmathsymbol{\beschr}{\marke}{\sym}` aufrufen, so hätte man wieder den Aufruf `\glsxtrnewmathsymbol[description={\beschr}]{\marke}{\ensuremath{\sym}}` also genau dasselbe Problem wie bisher. Man kann in `l3` aber per \cs_generate_variant:Nn \dt__glsxtrnewmathsymbol:nnn { ooo } einfach eine Variante `\dt__glsxtrnewmathsymbol:ooo` aus `\dt__glsxtrnewmathsymbol:nnn` erzeugen. Der Unterschied der `ooo`-Variante ist, dass die Argumente einfach expandiert werden, bevor sie zur Anwendung kommen. Es wird dann also nicht mehr `\beschr`, `\marke` und `\sym`, sondern die Definition dieser Makros in der Schleife verwendet. Damit in der Schleife nicht die `expl3`-Syntax benötigt wird, definiert man sich noch eine Benutzeranweisung, die ohne `_` und `:` auskommt. Man erhält dann mit: \documentclass{article} \usepackage{datatool} \usepackage[nomain,symbols,xindy]{glossaries-extra} \usepackage{xparse}% Für LaTeX >= 2020-10-01 nicht mehr zwingend aber zu empfehlen. Lädt auch expl3. \begin{filecontents*}{matsym.csv} Marke,Symbol,Beschreibung E,E,E-Modul t0,t_0,Anfangszeitpunkt tmax,t_\text{max},Endzeitpunkt w,\omega,Winkelgeschwindigkeit \end{filecontents*} \ExplSyntaxOn \cs_new:Npn \dt__glsxtrnewmathsymbol:nnn #1 #2 #3 { \glsxtrnewsymbol [ description = { #1 } ] { #2 } { \ensuremath{ #3 } } } \cs_generate_variant:Nn \dt__glsxtrnewmathsymbol:nnn { ooo } \NewDocumentCommand \dtglsxtrnewmathsymbol { m m m } { \dt__glsxtrnewmathsymbol:ooo { #1 } { #2 } { #3 } } \ExplSyntaxOff \DTLloaddb{matsym}{matsym.csv} \DTLforeach*{matsym}{\marke=Marke,\sym=Symbol,\beschr=Beschreibung}{% \dtglsxtrnewmathsymbol{\beschr}{\marke}{\sym}% } \makeglossaries \begin{document} \section{Die Tabelle, wie \textit{datatool} sie verstanden hat:} \DTLdisplaydb[Symbol]{matsym} % sprich: OHNE Symbol \section{Alle definierten Symbole werden hier genannt} \DTLforeach*{matsym}{\marke=Marke}{\gls{\marke} }% Hier wäre das explizite Expandieren auch kein Fehler. Es geht aber wohl auch so. \printglossary[type=symbols,title={Das Glossar zeigt nur den letzten Eintrag}] \end{document} das oben bereits gezeigte Ergebnis. [1]: https://texwelt.de/upfiles/test_20201105_081941.pnghttps://texwelt.de/upfiles/test_20201105_081941.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3
kleiner Tippfehler

06 Nov '20, 08:13

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

05 Nov '20, 08:22

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

05 Nov '20, 08:21

gast3's gravatar image

gast3
(ausgesetzt)

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×