PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie benutzt man xkeyval?



Dee
28-08-2009, 21:59
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):


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


! Undefined control sequence.
<recently read> \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

bobmalaria
28-08-2009, 22:30
verwendest du eine definition mit @ außerhalb einer sty oder cls datei, so musst du die anweisung wie folgt setzen


\makeatletter

..@...

\makeatother

gruss

Dee
29-08-2009, 07:10
Vielen Dank für die schnelle Antwort. Dann weiß ich endlich auch, wozu diese beiden Befehle dienen. :)

Viele Grüße
Dee

Dee
29-08-2009, 10:22
Noch eine Frage:


\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

rais
29-08-2009, 14:43
Moin moin,


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:


\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

u_fischer
30-08-2009, 12:29
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:



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


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

Dee
30-08-2009, 15:23
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