Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Problem mit Keyval und loop

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.06.2007
    Beiträge
    338

    Problem mit Keyval und loop

    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
    Code:
    \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

  2. #2
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von Spindoctor Beitrag anzeigen
    Code:
    \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
    Code:
    \@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...ies/trace.html) an.
    Geändert von sommerfee (10-09-2010 um 20:16 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.06.2007
    Beiträge
    338
    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!

  4. #4
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    Zitat Zitat von Spindoctor Beitrag anzeigen
    aber was macht \@expandtwoargs was \expandafter nicht macht?
    meist hilft schon ein Blick in die latex.ltx

    Code:
    \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

  5. #5
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von Spindoctor Beitrag anzeigen
    aber was macht \@expandtwoargs was \expandafter nicht macht?
    \edef expandiert komplett, \expandafter quasi nur einmal:

    Code:
    \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
    Geändert von sommerfee (11-09-2010 um 08:20 Uhr) Grund: Links auf TbT hinzugefügt

  6. #6
    Registrierter Benutzer
    Registriert seit
    09.06.2007
    Beiträge
    338
    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 )

  7. #7
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Zitat Zitat von Spindoctor Beitrag anzeigen
    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

    Gruß
    Marco

  8. #8
    Registrierter Benutzer
    Registriert seit
    09.06.2007
    Beiträge
    338
    ... wobei TeX programmieren durchaus nochmal eine Herausforderung für sich ist

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •