Addition unbekannter Anzahl an Variablen
Wie unten im MWE angegeben, bin ich auf der Suche nach einer Funktion, die für eine beliebige aber unbekannte Anzahl an Variablen, die mit diesem Script erstellt werden addieren soll. Weitere Kommentare sind im Minimalbeispiel.
\documentclass{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern}
\usepackage{etoolbox}
\usepackage{fp}
%######################
\makeatletter
\def\ifinstr#1#2{%
\def\@ifinstr##1#2##2\@nil{%
\ifstrempty{##2}{\@secondoftwo}{\@firstoftwo}}%
\@ifinstr#1\@@nil#2\@nil
}
\def\popleft#1#2{%
\protected@edef\@tmpa{#1}%
\expandafter\@popleft\expandafter{\@tmpa}{#1}{#2}}
\def\@popleft#1#2#3{%
\ifinstr{#1}{|}
{\@@popleft{#2}{#3}\q@nil#1\q@stop}
{\@@popleft{#2}{#3}\q@nil#1|\q@stop}}
\def\@@popleft#1#2\q@nil#3|#4\q@stop{\protected@edef#1{#4}\protected@edef#2{#3}}
\DeclareRobustCommand*\assignvalues[2]{\@assignvalues{#1}{#2}}
\def\@assignvalues#1#2{%
\protected@edef\@tmpb{#1}\protected@edef\@tmpc{#2}%
\popleft\@tmpb\currentvalueA
\popleft\@tmpc\currentvalueB
\protected@csedef{\currentvalueA}{\currentvalueB}%
\ifdefempty\@tmpb{}{\assignvalues\@tmpb\@tmpc}%
}
\makeatother
%######################
\begin{document}
\assignvalues{A|B|C|D}{5|10|15|20}
Nicht bekannt ist, wieviele Parameter übergeben werden sollen. Assignvalues werden 2 Parameter übergeben, zuerst die Variablen mit Trenner (\#1) und dann die direkte Zuordnung (\#2)
Gesucht ist die Additition aller Variablen \#1 und abspeichern in einem beliebigen Ergebnis.
%\addall{#1}{summe}
Das Wunschergebnis wäre dann. Summe = 50.
\end{document}
EDIT1: Wichtig ist, dass `\assignvalues{#1}{#2}` sowohl mit Zahlen, als auch mit Strings umgehen kann.
\assignvalues{A|B|C|D}{1|2|3|4} muss natürlich funktioniert, aber auch
\assignvalues{A|B|C|D|E}{1|2|3|4|Haus} und diese Forderdung wird nochmals strenger, indem auch die Zusweisung mit Umlaute funktionieren muss.
\assignvalues{A|B|C|D|E|F}{1|2|3|4|Haus|Österreich} hier sind auch Umlaute erforderlich.
Die Vorgestellten Versionen erfüllen ohne pgfmath diese Forderung (wie ich bemerkt habe) nicht.
Ich würde mir unter dieser Maßgabe, dass Assignvalues prinzipiell mit beliebige Eingabetypen arbeiten kann eben genau diese Funktion wünschen, eine
\addall{A|B|C|D}{meinesummea} ergibt beim Aufruf im Quelltext von `\meinesummea` => 10
Falls `\assignvalues{tempa|tempb}{20|30}` aufgerufen wird, ergibt der Aufruf von
`\addall{tempa|tempb}{meinesummeb}` `\meinesummeb` => 50
Der Funktion ist NICHT bekannt, wieviele Additionen durchgeführt werden, das ergibt sich nur durch das Trennzeichen.
Ich hoffe, deutlicher erklärt zu haben, was ich mir wünschen würde.
EDIT2: Dieses Codesample tut bei mir nicht... und meldet....undefined control sequence argument goldnas@\currentValueA ...
\documentclass{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern}
\usepackage{etoolbox}
\usepackage{fp}
%\input{defa}
\makeatletter
\def\@assignvalues#1#2{%
\protected@edef\@tmpb{#1}\protected@edef\@tmpc{#2}%
\popleft\@tmpb\currentvalueA
\popleft\@tmpc\currentvalueB
\protected@csedef{goldnas@\currentvalueA}{\currentvalueB}% <- hier
\ifdefempty\@tmpb{}{\assignvalues\@tmpb\@tmpc}%
}
\def\addall{\def\@tmpc{0}\@addall}
\def\@addall#1#2{%
\edef\@tmpb{#1}%
\popleft\@tmpb\currentvalueA
\FPadd\@tmpc\@tmpc{\csuse{goldnas@\currentvalueA}}% <- hier
\ifdefempty\@tmpb{\cslet{#2}\@tmpc}{\@addall\@tmpb{#2}}}
\makeatother
\begin{document}
\assignvalues{A|B|C|D|E}{5|10|15|20|Österreich}
Nicht bekannt ist, wieviele Parameter übergeben werden sollen. Assignvalues werden 2 Parameter übergeben, zuerst die Variablen mit Trenner (\#1) und dann die direkte Zuordnung (\#2)
Gesucht ist die Additition aller Variablen \#1 und abspeichern in einem beliebigen Ergebnis.
\addall{A|B|C|D}{\summe}
\A
Das Wunschergebnis wäre dann. Summe = 50.
\end{document}
LG Peter