Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Wie benutzt man xkeyval?

  1. #1
    Registrierter Benutzer
    Registriert seit
    03.03.2008
    Beiträge
    82

    Wie benutzt man xkeyval?

    Hallo,

    die Frage mag seltsam erscheinen, aber wie verwende ich xkeyval, um neue Keys zu definieren und vor allem zu benutzen?

    Ich habe folgendes Minimalbeispiel (mit der Zeile aus der xkeyval-Dokumentation):

    Code:
    \documentclass{scrreprt}
    \usepackage{xkeyval}
    \define@key{family}{key}{The input is: #1}
    \begin{document}
    Hallo Welt
    \end{document}
    Wenn ich dies mit pdflatex kompilieren will, erhalte ich:

    Code:
    ! Undefined control sequence.
     \define 
    l.3 \define
               @key{family}{key}{The input is: #1}
    Was habe ich denn vergessen, damit ich überhaupt Keys definieren kann? Klappt dieses Minimalbeispiel bei irgendwem?

    Meine xkeyval-Version: "2006/11/18 v2.5f" Mit "2008/08/13 v2.6a" ist es das gleiche.
    System: Ubuntu 8.10, TeX Live 2007

    Auch wenn ich ein Paket lade, was intern \define@key nutzt, wie pgfpages, klappt das \define in meiner tex-Datei noch nicht. Kann es sein, dass das nur in einer sty-Datei funktioniert?

    Edit: Hab es grad mit einer eigene sty-Datei versucht, da klappt die Definition. Heißt das, ich muss mir ein eigenes "Paket" stricken, um die Key-Values für einen Befehl nutzen zu können?

    Viele Grüße
    Dee

  2. #2
    Registrierter Benutzer Avatar von bobmalaria
    Registriert seit
    28.11.2006
    Ort
    Düsseldorf
    Beiträge
    4.174
    verwendest du eine definition mit @ außerhalb einer sty oder cls datei, so musst du die anweisung wie folgt setzen

    Code:
    \makeatletter
    
    ..@...
    
    \makeatother
    gruss
    Mein Ball ist umgefallen

  3. #3
    Registrierter Benutzer
    Registriert seit
    03.03.2008
    Beiträge
    82
    Vielen Dank für die schnelle Antwort. Dann weiß ich endlich auch, wozu diese beiden Befehle dienen.

    Viele Grüße
    Dee

  4. #4
    Registrierter Benutzer
    Registriert seit
    03.03.2008
    Beiträge
    82
    Noch eine Frage:

    Code:
    \documentclass{scrreprt}
    \usepackage{xkeyval}
    \usepackage{graphicx}
    
    \makeatletter
    \newlength{\@imagewidth}
    \define@key{Bild}{width}{\setlength{\@imagewidth}{#1}}
    \newcommand{\Bild}[2][]{%
        \setkeys{Bild}{#1}%
        \includegraphics[width=\@imagewidth]{#2}%
    }
    \makeatother
    
    \begin{document}
    \Bild{Ubucon/LaTeX-Magazinerstellung/Magazin/gui.png}
    \end{document}
    Das geht ja schief, weil "\@imagewidth" nicht definiert ist. Ich möchte natürlich auch keinen vordefinierten Wert bei "\define@key" angeben, sondern das Bild soll so breit sein, wie es eben ist, wenn nichts angegeben wird.

    Ich habe in der Doku nichts gefunden, wie ich das "width=\@imagewidth" einfach ignorieren kann, wenn "width=" nicht als Argument angegeben wurde. Ich hab schon versucht mit \ifthenelse zu arbeiten, aber das scheint er innerhalb der eckigen Klammern nicht zu mögen.

    Gleiches Problem habe ich bei einer zusätzlichen Box, die unter das Bild gesetzt wird. Wenn "width=" fehlt, habe ich keine Ahnung, wie breit die Box sein soll. Wir kriege ich denn den Standardwert für das Bild raus. Kann ich direkt auf den internen width-Key des graphics-Paketes zugreifen (wenn ich rauskriege, wie der Key genau heißt)?

    Viele Grüße
    Dee

  5. #5
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Moin moin,
    Zitat Zitat von Dee Beitrag anzeigen
    Gleiches Problem habe ich bei einer zusätzlichen Box, die unter das Bild gesetzt wird. Wenn "width=" fehlt, habe ich keine Ahnung, wie breit die Box sein soll. Wir kriege ich denn den Standardwert für das Bild raus. Kann ich direkt auf den internen width-Key des graphics-Paketes zugreifen (wenn ich rauskriege, wie der Key genau heißt)?
    eine Möglichkeit wäre \settowidth:
    Code:
    \documentclass{scrreprt}
    \usepackage{xkeyval}
    \usepackage{graphicx}
    
    \makeatletter
    \newlength{\@imagewidth}
    \define@key{Bild}{width}{\setlength{\@imagewidth}{#1}}
    \newcommand{\Bild}[2][width=0pt]{%
      \setkeys{Bild}{#1}%
      \ifdim\@imagewidth=0pt%keine Bildbreite angegeben
        \settowidth\@imagewidth{\includegraphics{#2}}%nat. Bildbreite
      \fi
      \includegraphics[width=\@imagewidth]{#2}%
    }
    \makeatother
    
    \begin{document}
    %\Bild{Ubucon/LaTeX-Magazinerstellung/Magazin/gui.png}
    \Bild{test}
    \Bild[width=6cm]{test}
    \end{document}
    MfG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  6. #6
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Wenn dein \Bild-Befehl nur Schlüssel von \includegraphics benutzt, kannst du sie ja einfach durchreichen, entweder in das optionale Argument von \includegraphics oder mit \setkeys{Gin}{#1}. Wenn du noch weitere Schlüssel definieren willst, kannst du z.B. zuerst die Schlüssel aus der Bild-Familie setzen, und dann \setrmkeys benutzen:

    Code:
    \makeatletter
    \define@key{Bild}{color}{ein Schlüssel Farbe: #1}
    \newcommand{\Bild}[2][]{%
       \begingroup
        \setkeys*{Bild}{#1}%
        \setrmkeys{Gin}%
        \includegraphics{#2}%
       \endgroup 
    }
    \makeatother
    Es ist auch möglich define@keys/setkeys-Befehle zu schachteln:

    Code:
    \define@key{Bild}{width}{\setkeys{Gin}{width=#1}}
    \newcommand{\Bild}[2][]{%
       \begingroup
        \setkeys{Bild}{#1}%
        \includegraphics{#2}%
       \endgroup 
    }
    \makeatother

  7. #7
    Registrierter Benutzer
    Registriert seit
    03.03.2008
    Beiträge
    82
    Hallo Ulrike,

    da ich leider nicht nur "width" und "heigth" habe, gibt es auch Argumente, mit denen Gin nichts anfangen kann, eine Direktübergabe ist also nicht möglich. Eine Einzelangabe wie in Vorschlag 2 ist aber sicherlich auch sinnvoll.

    Ich bin noch unsicher, welche Lösung schöner ist, Deine oder die von rais. Ggf. werde ich mischen, denn rais' Vorschlag mit dem Auslesen der Breite des Bildes benötige ich ja dennoch für die Box, die unter das Bild soll.

    Danke auf alle Fälle für beide Vorschläge, damit lässt sich mein Problem sicherlich lösen.

    Viele Grüße
    Dee

Lesezeichen

Berechtigungen

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