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

gefragt 01 Sep '13, 12:49

Goldnas's gravatar image

Goldnas
112
Akzeptiert-Rate: 0%

bearbeitet 01 Sep '13, 14:42

Falls du den Code selbst geschrieben hast, wäre eine Kommentierung ganz praktisch, was was macht; falls du ihn irgendwo her hast, wäre eine Quelle hilfreich. – Werden nur Integer erwartet oder auch Floats? Ist die Verwendung von fp Pflicht? Für was ist das zweite Argument summe von \addall?

(01 Sep '13, 12:56) Qrrbrbirlbel

Kannst Du dazu sagen, was \assignvalues macht? Wenn ich mich recht erinnere, definiert es im Beispiel Makro \A => 5, Makro \B => 10 usw. Mir ist aus der Frage nicht klar, wie Du \addall konkret verwenden willst. So: \addall{A|B|C|D}{\summe} => definiert Makro \summe zu 50?

Die \ifinstr Definition scheint mir übrigens unnötig. Sowohl etoolbox als auch KOMA-Script (die Du beide lädst) stellen ein entsprechendes Makro bereit.

(01 Sep '13, 12:58) cgnieder

Hallo du.

Antwort 1: Nicht selbst geschrieben, daher gebe ich dir die Quellen an.

Primärquelle, die dann später noch wegen Umlaute modifiziert werden mußte. http://www.mrunix.de/forums/showthread.php?t=73700&page=2&highlight=Goldnas

Quelle, nach Modifzierung. http://tex.stackexchange.com/questions/70246/special-command-and-caption

Es werden auch floats erwartet. Ich verwende fp massiv für die Zuweisung von Variablen, ich bin allerdings auch offen für andere Lösungen, daher ist meine Antwort nein.

;)

LG Peter

(01 Sep '13, 12:59) Goldnas

@Clemens: assignvalues{A|B|C|D|E}{5|10|15|20|Österreich}

A => 5 B => 10 C => 15 D => 20 D => Österreich

Ich würde gerne eine Funktion haben wie sie von Qrrbrbirbel gerade vorschlagen worden ist....am liebsten wäre mir halt noch wenn ich diese Funktion mit 2 Parameter bekommen könnte, aber so ist es schon sehr gut. ;)

wegen ifinstr.... dazu kann ich nichts sagen......

LG Peter

(01 Sep '13, 13:24) Goldnas

@Goldnas welchen zusätzlichen Parameter benötigst Du noch? @Qrrbrbirlbel hat ja nur die Klammern um \summe nicht hingeschrieben. Ist aber gleichbedeutend mit \addall{A|B|C|D}{\summe}.

Du meinst sicher \A => 5 \B => 10 \C => 15 \D => 20 \E => Österreich (mit Backslashs).

(01 Sep '13, 13:29) cgnieder

@Clemens:

Wenn ich A aufrufe (wie ein Kommando ohne Argument) dann schreibt er mir eben die Zahl hin. Das Kommando von Qrrbrirlbel rechnet bei mir nicht. Hm....und wieso nicht so

addall{A|B|C|D}{summe} formuliert wurde, verstehe ich auch nicht, das wäre doch konsistent, alles sind variablen, die hier im kommando so aufgerufen werden und wenn sie ausserhalb des kommandos verwendet werden, gibt es den content....

summe => 50

LG Peter

(01 Sep '13, 13:35) Goldnas

@Goldnas könntest Du bitte versuchen, markdown zu verwenden? sonst werden Backslashs einfach verschluckt. Code wird zwischen Backticks eingegeben. Die Eingabe `\A` gibt dann \A.

Re »Das Kommando von Qrrbrirlbel rechnet bei mir nicht.« Dann editiere doch Deine Frage dahingehend, wie genau Du Dir die Lösung vorstellst und wieso die Lösung nicht reicht.

(01 Sep '13, 13:39) cgnieder

Die Meldung ! Undefined control sequence. \goldnas@currentValueA sieht nach einem Schreibfehler aus (großes V statt kleinem). Der Code, den Du gepostet hast, liefert aber tatsächlich eine andere Meldung: ! Undefined control sequence. \assignvalues! Wenn ich die fehlenden Definitionen aber hinzufüge, funktioniert er wie erwartet...

(01 Sep '13, 14:55) cgnieder
Ergebnis 5 von 8 show 3 more comments

Dein Beispiel

Wenn du \addall so definierst:

\def\addall{\def\@tmpc{0}\@addall}
\def\@addall#1#2{%
  \edef\@tmpb{#1}%
  \popleft\@tmpb\currentvalueA
  \FPadd\@tmpc\@tmpc{\csuse{\currentvalueA}}%
  \ifdefempty\@tmpb{\cslet{#2}\@tmpc}{\@addall\@tmpb{#2}}}

und mit

\addall{A|B|C|D}{summe}

verwendest, enthält \summe dann 50.000000000000000000 und kann natürlich wieder verwendet in Funktionen wie

\addall{summe|B}{summe}

wobei dann \summe jetzt 60.… enthalten sollte.

Verbesserung

Anstatt Macro-Sequenzen wie \A, \B oder \summe zu verwenden, würde ich wenigstens einen eigenen „Namespace“ (das gibt es in TeX zwar nicht, aber ich nenne es mal so) verwenden, in dem du

\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}}}

wobei an den mit <- hier gekennzeichneten Stellen der Text goldnas@ eingefügt wurde. Der Code definiert also jetzt \goldnas@A, goldnas@B sowie \goldnas@summe. Das ist etwas sicherer; stell dir vor jemand definiere \sum neu! Benutzen kannst du den Wert dann mit

\def\benutze#1{\csuse{goldnas@#1}}

vielleicht PGFmath?

Aber warum denn die Mathematik neu definieren? Das Paket pgfmath enthält bereits einen wunderbaren Mathematik-Parser und bietet sich sogar als Frontend für fp an (ansonsten würde es alle Berechnungen mit eigenen Funktionen und TeX’s Präzision machen).

Ein kleiner Anfang:

\documentclass{article}
\usepackage{pgf,fp}
\usepgflibrary{fixedpointarithmetic}
\pgfset{fixed point arithmetic}
\newcommand*{\declareFunctions}[1]{\pgfset{declare function={#1}}}
\begin{document}
\declareFunctions{A=5; B=10; C=15; D=20;}

\pgfmathprint{A+B+C+D}

\pgfmathsetmacro\summe{A+B+C+D}\summe

\declareFunctions{summe=A+B+C+D;}\pgfmathprint{summe}

\declareFunctions{foo(\x,\a,\b,\c)=\a*\x*\x+\b*\x+\c;}
\pgfmathprint{foo(2, -1, 3, sqrt(2))}
\end{document}
Permanenter link

beantwortet 01 Sep '13, 13:01

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815
Akzeptiert-Rate: 53%

bearbeitet 01 Sep '13, 13:56

Hallo Qrrbrirlbel,

Dein Beispiel welches assignvalues umdefiniert funktioniert genau dann nicht, wenn ich Textzuweise. Ab diesem Zeitpunkt kann ich eben nur noch Zahlen zuweisen. assignvalues soll aber für beliebige Inputtypen funktionieren. Beispielsweise ist es notwendig, dass, folgender Aufruf ebenfalls funktioniert.

\assignvalues{A|B|C|D|E}{5|10|15|20|Österreich}

Deine Alternative mit pgf ist zwar gut, dazu müßte ich aber ALLE Zuweisungen ändern. Das würde ich gerne vermeiden, wenn es aber nicht anders geht natürlich machen, da es ja eine Lösung ist.

EDIT des Orginals...

(01 Sep '13, 14:18) Goldnas

@Goldnas Mit utf8 als Input-Kodierung (mein Editor ist so eingestellt), funktioniert das mit den Umlauten ganz gut.

\assignvalues{A|B|C|D|E}{5|10|15|20|Österreich}
\benutze{E}

setzt Österreich im Dokument. Addieren kann man es natürlich nicht mehr. Was heißt denn „funktioniert nicht“? Falscher Ausgabe? Fehlermeldung? Rauch ausm Computer?

(01 Sep '13, 14:34) Qrrbrbirlbel

Vielleicht mach ich was fundamental falsch.... ich hab einen zweiten Edit angefügt....

(01 Sep '13, 14:40) Goldnas
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×52

gestellte Frage: 01 Sep '13, 12:49

Frage wurde gesehen: 9,436 Mal

zuletzt geändert: 01 Sep '13, 14:55