PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Keyval und loop



Spindoctor
10-09-2010, 19:59
Hallo!
Sitz immer noch an meinem Paket und bin auf ein Problem gestoßen, dass ich selbst nicht lösen kann.
Vielleicht liegts daran, dass ich noch nicht alle Spielarten der Expansion verstehe oder kenne?

Hier ein Minimalbeispiel:

Minimalbeispiel

\documentclass{minimal}

\usepackage{kvsetkeys}
\usepackage{kvoptions}

\makeatletter
\def\testlist{Apfel,Birne,Cirsche}
\def\kommando@Apfel{Affe}
\def\kommando@Birne{Biene}
\def\kommando@Cirsche{Chimpanse}
\SetupKeyvalOptions{family=test,prefix=test@}
\DeclareStringOption[vorher]{Apfel}
\DeclareStringOption[vorher]{Birne}
\DeclareStringOption[vorher]{Cirsche}
\makeatother

\begin{document}
\makeatletter
\test@Apfel % vorher
\test@Birne % vorher
\test@Cirsche % vorher

\@for\frucht:=\testlist\do{%
\frucht --% 1. Apfel 2. Birne 3. Cirsche
\csname kommando@\frucht\endcsname% 1. Affe 2. Biene 3. Chimpanse
\kvsetkeys{test}{\frucht=\expandafter\csname kommando@\frucht\endcsname}% In der Zeile gibts ein Problem
}
\test@Apfel % Undefined
\test@Birne % Undefined
\test@Cirsche % Undefined
\makeatother
\end{document}

Danke schonmal für die Hilfe

sommerfee
10-09-2010, 21:13
\kvsetkeys{test}{\frucht=\expandafter\csname kommando@\frucht\endcsname}

Das erste \frucht muß ja auch expandiert werden und vor \csname einfach \expandafter zu schreiben klappt hier nicht so einfach. Am besten expandiert man die Argumente von \kvsetkeys komplett, bevor man \kvsetkeys aufruft.

Probiere mal


\@expandtwoargs\kvsetkeys{test}{\frucht=\csname kommando@\frucht\endcsname}

stattdessen. (\@expandtwoargs ist ein Hilfsmakro des LaTeX Kerns.)

(Ungetestet, da z.Z. kein LaTeX zur Hand.)

Liebe Grüße,
Axel

P.S.: Schaue dir mal die Tracing-Möglichkeiten von TeX und das trace-Paket (http://www.ctan.org/tex-archive/help/Catalogue/entries/trace.html) an.

Spindoctor
10-09-2010, 22:46
das funktioniert!
aber was macht \@expandtwoargs was \expandafter nicht macht?
Glaub ich versteh das immer noch nicht ganz... :(

Das tracing-tool muss ich mir mal anschaun! Danke!

mechanicus
10-09-2010, 22:51
Hi,


aber was macht \@expandtwoargs was \expandafter nicht macht?

meist hilft schon ein Blick in die latex.ltx


\def\@expandtwoargs#1#2#3{%
\edef\reserved@a{\noexpand#1{#2}{#3}}\reserved@a}

In source2e findest du folgende Erklärung:

A macro to totally expand two arguments to another macro


Gruß
Marco

sommerfee
11-09-2010, 08:46
aber was macht \@expandtwoargs was \expandafter nicht macht?

\edef expandiert komplett, \expandafter quasi nur einmal:



\def\a{a}
\def\aa{\a}
\expandafter\def\expandafter\ab\expandafter{\aa}
\show\ab
\edef\ab{\aa}
\show\ab


Weißt du das Ergebis vorab? ;)



Glaub ich versteh das immer noch nicht ganz... :(


http://www.eijkhout.net/tbt/
http://www.cs.utk.edu/~eijkhout/texbytopic-a4.pdf

Liebe Grüße,
Axel

Spindoctor
11-09-2010, 21:27
ehrlich gesagt wusste ichs nicht :)

aber danke für die links, damit sollt das zu lernen sein (nur ob ich wirklich dazu komm soviel zu lesen ;) )

mechanicus
11-09-2010, 21:34
aber danke für die links, damit sollt das zu lernen sein
Ich bin der Meinung, dass man Programmieren nicht durchs lesen erlernen kann. Ich denke eher, dass Spielereien dazugehören. Ich würde dir also empfehlen, etwas zu spielen :D

Gruß
Marco

Spindoctor
12-09-2010, 03:35
... wobei TeX programmieren durchaus nochmal eine Herausforderung für sich ist :)