
Zitat von
Goldnas
funktioniert wunderbar, leider versteh ich den Code noch nicht so, wie ich möchte, denn ich hätte es jetzt noch erweitern wollen. (Du hast übrigens recht gehabt mit den Updates....)
[...]
Beispielsweise das, was jetzt gemacht worden ist funktioniert perfekt. Kann man das erweitern, dass auch strings akzeptiert werden?
Hast Du's ausprobiert? Die Beispiele, die Du gebracht hast funktionieren nämlich mit dem jetzigen Code. Hier ist er nochmal, mit Kommentaren versehen, die Dir hoffentlich weiterhelfen.
Code:
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
% \ifinstr{#1}{#2}{}{}
% testet, ob #2 in #1 enthalten ist, verwendet etoolbox's \ifstrempty
\def\ifinstr#1#2{%
\def\@ifinstr##1#2##2\@nil{%
\ifstrempty{##2}{\@secondoftwo}{\@firstoftwo}}%
\@ifinstr#1\@@nil#2\@nil
}
% den linken Eintrag einer mit | getrennten Liste erhalten:
% Liste ist in #1 gespeichert, Eintrag wird in #2 gespeichert
\def\popleft#1#2{%
\edef\@tmpa{#1}%
% den Umweg über \edef machen, damit später an \assignvalues
% auch macros gefüttert werden können. Caveat: dürfen nur expandierbares
% Material enthalten;
\expandafter\@popleft\expandafter{\@tmpa}{#1}{#2}}
% Zwischenstop: der letzte Eintrag ist in einer Liste ohne |:
\def\@popleft#1#2#3{%
\ifinstr{#1}{|}% wenn in eins ein | enthalten ist
{\@@popleft{#2}{#3}\q@nil#1\q@stop}
{\@@popleft{#2}{#3}\q@nil#1|\q@stop}}
% das eigentliche wegpoppen:
% #1: Name der ursprünglichen Liste, arg #1 von \popleft
% #2: Name des Macros in das der das gepoppte Element gespeichert werden soll
% #3: das linke Element der Liste
% #4: der Rest der Liste
% #3|#4 werden mit arg #1 bzw #1| gefüttert in \@popleft
\def\@@popleft#1#2\q@nil#3|#4\q@stop{\edef#1{#4}\edef#2{#3}}
% User-Befehl
\newcommand*\assignvalues[2]{\@assignvalues{#1}{#2}}
% interner Befehl:
\def\@assignvalues#1#2{%
% Beide Argumente in temporären Macros speichern:
\edef\@tmpb{#1}\edef\@tmpc{#2}%
% aus beiden Listen jeweils den linken Eintrag entfernen und speichern:
\popleft\@tmpb\currentvalueA
\popleft\@tmpc\currentvalueB
% den Eintrag der ersten Liste in ein Macro umwandeln und den Wert der zweiten
% Liste zuweisen, verwendet etoolbox's \csedef
\csedef{\currentvalueA}{\currentvalueB}%
% wenn die Liste jetzt leer ist, aufhören, ansonsten das ganze wiederholen,
% verwendet etoolbox's \ifdefempty:
\ifdefempty\@tmpb{}{\assignvalues\@tmpb\@tmpc}%
}
\makeatother
\begin{document}
\assignvalues{A|B|C|D|E}{1|2|3|foo|bar}
A: \A, B: \B, C: \C, D: \D, E: \E
\assignvalues{A|B|C|D|E}{1|2|3||}
A: \A, B: \B, C: \C, D: \D, E: \E
\assignvalues{A|B|C|D|E|F}{1|2|3||Messdaten/statistik/mfrout.dat}
A: \A, B: \B, C: \C, D: \D, E: \E, F: \F
\def\varA{w|x|y|z}
\def\varB{1|2|3|4}
\assignvalues{\varA}{\varB}
w: \w, x: \x, y: \y, z: \z
\end{document}

Zitat von
Goldnas
Da deine Funktion teil meiner Diagramme ist, die ich gern veröffentlichen würde, also die Makros, gebe ich deinen vollständigen Namen und die Quelle an, falls das ok für dich ist..
Wie Du möchtest. Wenn Dir wohler damit ist, würde ich den Code auch unter CC0 (d.h. public domain) stellen.
Grüße
Lesezeichen