kvoptions - Declaration von Optionen schlägt fehl

78 Aufrufe
Direkt zur ersten ungelesenen Nachricht

Marco Daniel

ungelesen,
17.12.2011, 09:49:5517.12.11
an
Hi,

ich schaffe es nicht nachstehende Option "alignment" zum laufen zu
bekommen. Ich nutze das Paket kvoptions.
%=============================================================%
\RequirePackage{filecontents}
\begin{filecontents}{mytest.sty}
\ProvidesPackage{mytest}
\RequirePackage{kvoptions}
\SetupKeyvalOptions{%
family=ML,
prefix=ML@,
}

\DeclareStringOption{alignment}[\centering]
\ProcessKeyvalOptions*\relax

\def\testenv{%
\par\kern\topskip\noindent
\setbox\@tempboxa\vbox\bgroup
\hsize=11cm
\ML@alignment
}
\def\endtestenv{%
\egroup
\centerline{\fbox{\box\@tempboxa}}%
\par\kern\topskip\@endparenv
}


\end{filecontents}

\documentclass{article}
\usepackage{mytest}%work
%\usepackage[alignment=\raggedleft]{mytest}%doens't work
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\begin{testenv}
\lipsum[2]
\end{testenv}
\lipsum[3]
\end{document}
%=============================================================%

Wo liegt hier der Fehler?

Listfiles:
*File List*
filecontents.sty 2011/10/08 v1.3 Create an external file from within a
LaTeX document
article.cls 2007/10/19 v1.4h Standard LaTeX document class
size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option)
mytest.sty
kvoptions.sty 2010/12/23 v3.10 Keyval support for LaTeX options (HO)
keyval.sty 1999/03/16 v1.13 key=value parser (DPC)
ltxcmds.sty 2011/04/18 v1.20 LaTeX kernel commands for general use (HO)
kvsetkeys.sty 2011/04/07 v1.13 Key value parser (HO)
infwarerr.sty 2010/04/08 v1.3 Providing info/warning/message (HO)
etexcmds.sty 2011/02/16 v1.5 Prefix for e-TeX command names (HO)
ifluatex.sty 2010/03/01 v1.3 Provides the ifluatex switch (HO)
lipsum.sty 2011/04/14 v1.2 150 paragraphs of Lorem Ipsum dummy text
***********

Gruß
Marco

Philipp Stephani

ungelesen,
17.12.2011, 11:27:1517.12.11
an
Marco Daniel <marco....@mada-nada.de> writes:

> %\usepackage[alignment=\raggedleft]{mytest}%doens't work
> Wo liegt hier der Fehler?

LaTeX expandiert Befehle in Optionen mehrmals. Bei nicht-robusten
Befehlen kracht das in der Regel.

Mögliche Lösungen:

- Die Expansion manuell verhindern:
\usepackage[alignment=\noexpand\noexpand\noexpand\raggedleft]{mytest}
Nachteil: Hässlich und "hackish"

- Befehl robust machen:
\usepackage{etoolbox}
\robustify{\raggedleft}
Nachteil: muss für jeden Befehl erneut wiederholt werden, verändert
die Definition der Befehle

- Befehle in Optionen vermeiden:
\usepackage[alignment=raggedleft]{mytest}
und dann
\@nameuse{\ML@alignment}
Nachteil: Funktioniert nur für einzelne Befehle, nicht konsistent zur
üblichen Verwendung der Befehle

- Einen getrennten \setup…-Befehl für das Paket schreiben (so wie
\hypersetup, \KOMAoptions…)
Nachteil: Der Befehl muss vom Benutzer explizit verwendet werden; das
Paket muss so geschrieben sein, dass es Änderungen nach dem Laden
erlaubt

Ich tendiere in der Regel stark zu der vierten Lösung, die auch andere
Probleme mit Optionen (z.B. die automatische und oft überraschende
Übernahme von Klassenoptionen oder die Möglichkeit von Optionen-Clashes)
vermeidet. Es ist auch problemlos möglich, Schlüssel-Wert-Paare sowohl
im Setup-Makro als auch als Option zuzulassen.

--
Change “LookInSig” to “tcalveu” to answer by mail.

Heiko Oberdiek

ungelesen,
17.12.2011, 11:29:2717.12.11
an
Marco Daniel <marco....@mada-nada.de> wrote:

> %\usepackage[alignment=\raggedleft]{mytest}%doens't work

LaTeX expandiert die Optionen auf harte Art in \usepackage und
\documentclass, so dass das Makro \raggedleft hier zerbricht.

Mögliche Wege:
* Paket kvoptions-patch definiert die LaTeX-Interna um, so dass
die Optionswerte nicht mehr zerbrechen:
\usepackage{kvoptions-patch}
\usepackcage[alignment=\raggedleft]{mytest}
* Das Paket erlaubt eine spätere Setzung, etwa:
\usepackage{mytest}
\mytestsetup{alignment=\raggedleft}

--
Heiko Oberdiek

Marco Daniel

ungelesen,
17.12.2011, 11:45:3517.12.11
an
Hallo,

danke euch beiden für die Informationen. In meinem Paket funktionierte
die Definition mittels \mdfsetup, allerdings hätte ich gerne die obere
Variante ebenfalls zugelassen.
Am 17.12.2011 17:29, schrieb Heiko Oberdiek:
> * Das Paket erlaubt eine spätere Setzung, etwa:
> \usepackage{mytest}
> \mytestsetup{alignment=\raggedleft}
Dann werde ich diese Option wohl in die Doku entsprechend übernehmen.

Danke
Marco

Axel Berger

ungelesen,
18.12.2011, 05:57:0018.12.11
an
Philipp Stephani wrote on Sat, 11-12-17 17:27:
> Einen getrennten \setupGammǪ-Befehl f?Pilcr das Paket schreiben
> Nachteil:

Beim Auskommentieren des Paketes wird der gern vergessen und schmeißt
Fehler.

Ulrich Diez und Heiko Oberdiek haben mir dafür vor drei Jahren dies
gebaut:

\makeatletter
\newcommand{\PackageSetup}[3][]{\@ifpackageloaded{#2}{#3}{#1}}
\makeatother

Ich finde das so praktisch und benutze das so viel, daß ich empfehlen
möchte, es in eines der großen Standardpakete aufzunehmen.

Allen antworten
Dem Autor antworten
Weiterleiten
0 neue Nachrichten