PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (Fortschrittsbalken) Testen, ob Keyval-Option von User gesetzt wurde



Spindoctor
08-09-2010, 22:32
Hallo!

Bin in meinem Paket auf ein eher kleines Problem draufgekommen, das ich jetzt lösen will. Dazu muss ich aber eine if-Abfrage schreiben um zu testen, ob vom User eine keyval-Option gesetzt wurde.

Ich hab mir gedacht, ich mach das, indem ich überprüfe ob die Keyval-Option noch den default-Wert hat oder nicht. Aber vielleicht geht das ja auch eleganter!?

Bin für Tipps dankbar!

u_fischer
09-09-2010, 11:39
Und was soll passieren, wenn der User den Key explixit auf den Defaultwert gesetzt hat?

Spindoctor
09-09-2010, 12:11
naja, der Fall wär eher egal, weil mein Package dann eh mit den Default-Werten weiterarbeitet.

Ums zu konkretisieren: ich stelle 2 Möglichkeiten zur Verfügung, um die Höhe anzugeben. Entweder man spezifiziert "heightp", dann wird die Höhe in Relation zur Zeilenhöhe gesetzt, oder man spezifiziert "heighta", dann wird die Höhe absolut gesetzt.

Mein Paket soll nur dann Höhenberechnungnen (also heightp * Zeilenhöhe) anstellen, wenn "heighta" nicht gesetzt wurde.

voss
09-09-2010, 13:47
naja, der Fall wär eher egal, weil mein Package dann eh mit den Default-Werten weiterarbeitet.

Ums zu konkretisieren: ich stelle 2 Möglichkeiten zur Verfügung, um die Höhe anzugeben. Entweder man spezifiziert "heightp", dann wird die Höhe in Relation zur Zeilenhöhe gesetzt, oder man spezifiziert "heighta", dann wird die Höhe absolut gesetzt.

Mein Paket soll nur dann Höhenberechnungnen (also heightp * Zeilenhöhe) anstellen, wenn "heighta" nicht gesetzt wurde.


\def\Key@Heighta{}% oder wie sie bei dir heißt
...
\ifx\relax\Key@Heighta\relax\else ... \fi


Herbert

u_fischer
09-09-2010, 14:15
Mein Paket soll nur dann Höhenberechnungnen (also heightp * Zeilenhöhe) anstellen, wenn "heighta" nicht gesetzt wurde.

Und dann wird irgendein Benutzer heighta= ..., heightp= ... benutzen und dich fragen, warum das hintere heightp den heighta-Wert nicht überschreibt.

Mein Rat: Schreibe den Code von heighta und heightp so, dass sie einfach ihre Berechnungen durchführen und die Werte setzen. Dann schreib in deinem Hauptbefehl:

\setkeys{...}{heightp=default, #1}, wobei #1 die user keys sind.

Dann kann der Benutzer 0 bis x heighta/heightp-Schlüssel benutzen und der letzte gewinnt einfach.

Spindoctor
10-09-2010, 02:01
danke fürs erste für die ratschläge. muss noch überlegen, wie ich das umsetz...

Spindoctor
11-09-2010, 02:36
hm, die Lösung, die Du vorschlägst klingt sehr elegant, u_fischer. Allerdings ist mein Problem ziemlich komplex - es geht um insgesamt 4 Optionen, die sowohl "global" als auch "lokal" (nicht im Sinne der kvoptions-Verwendung der Begriffe global und lokal) vorliegen können, und die aufeinander auf verschiedene Art und Weise Bezug nehmen.

Ich hätte es gern so, dass immer die zuletzt gesetzten Optionen die anderen overrulen, aber ich fürchte, das ist mit sehr viel Denk- und Schreibaufwand verbunden.

Ich werde meinen fertigen Code ohnehin noch posten, vielleicht fällt Dir dann eine gute Lösung ein. Bis dahin müssen die User, die mein Paket nutzen wohl akzeptieren, dass absolute Definitionen relative Definitionen overrulen...

voss
11-09-2010, 09:34
Ich hätte es gern so, dass immer die zuletzt gesetzten Optionen die anderen overrulen, aber ich fürchte, das ist mit sehr viel Denk- und Schreibaufwand verbunden.


das hat Ulrike dir doch schon gezeigt ...

\setkeys{}{....,#1}

damit überschreibt #1 alles, was du vorher gesetzt hast.

Herbert

Spindoctor
11-09-2010, 13:13
hm, glaub es ist schwieriger, weil sich da viele variablen gegenseitig beeinflussen... konkret gibt es \heighta, \heightr (hab p in r umgetauft), \roundnessa und \roundnessr. Und alle Variablen gibts sowohl lokal und global (wobei ich lokal hier auf das Makro bezogen meine, nicht auf das Paket)

Hab aber jetzt einen Weg gefunden, dass das zumindest mal mit der Höhe hinzukriegen... Obs mit der Rundung auch schon funktioniert weiß ich nicht - glaub eher noch nicht.

Für vorschläge die meinen Gehirnknoten, den ich mittlerweile davon hab aufzulösen, bin ich dankbar - werd die neue Version gleich mal wieder posten. Versteh aber auch, wenn sich das niemand antun will :)

Spindoctor
11-09-2010, 13:16
%
% ProgressBar
% by Marcel Jira
% kindly supported by mrunix-forum: http://www.mrunix.de/
%

\NeedsTeXFormat{LaTeX2e}

\ProvidesPackage{progressbar}[2010/09/06 v0.1: progressbar]

\newcommand{\progressbarpackagename}{progressbar}
\newcommand{\progressbar@PackageWarning}[1]{\PackageWarning{\progressbarpackagename}{#1}}
\newcommand{\progressbar@LoadFile@IfExist}[1]{%
\IfFileExists{#1.sty}{%
\RequirePackage{#1}%
}{%
\progressbar@PackageWarning{The package #1 does not exist\MessageBreak
but it is required by \progressbarname}%
}
}

\progressbar@LoadFile@IfExist{fp}
\progressbar@LoadFile@IfExist{tikz}
\progressbar@LoadFile@IfExist{kvoptions}
\progressbar@LoadFile@IfExist{kvsetkeys}

% Define lengths for later use
\newlength{\BarWidth}
\newlength{\BarHeight}
\newlength{\BarRoundedCorners}
% This length will be used for the realisation of the progressbars
\newlength{\BarPartWidth}
%
% All user-variables
\def\progressbar@keylist{heighta,roundnessa,height r,roundnessr,width,linecolor,emptycolor,filledcolo r,borderwidth,tickswidth,ticksheight,tickscolor,su bdivisions}
% Keys corresponding to the user-variables
\def\progressbar@defaultvaluelist{,,0.75,0.15,6em, black,black!10,black!60,0.8pt,0.4pt,0.33,black,10}
\newcounter{progressbar@counter}

% KeyVal-Options
% Define default-Keyval-Options for this package
\setcounter{progressbar@counter}{0}
\@for\progressbar@value:=\progressbar@defaultvalue list\do{%
\stepcounter{progressbar@counter}%
\expandafter\edef\csname progressbar@value\the\value{progressbar@counter}\e ndcsname{\progressbar@value}%
}%
\setcounter{progressbar@counter}{0}
\@for\progressbar@key:=\progressbar@keylist\do{%
\stepcounter{progressbar@counter}%
\expandafter\DeclareStringOption\expandafter[\csname progressbar@value\the\value{progressbar@counter}\e ndcsname]{\progressbar@key}%
}
\ProcessKeyvalOptions*
% Change Keyval family and prefix
\SetupKeyvalOptions{family=progressbarlocal,prefix =progressbarlocal@}
% Define Keyval-Options that are used in the macro
\@for\progressbar@key:=\progressbar@keylist\do{%
\DeclareStringOption{\progressbar@key}%
}
\def\progressbar@lastheighta{false}
\def\progressbar@lastroundnessa{false}
\def\progressbar@true{true}
\AddToKeyvalOption{progressbar}{heightr}{%
\def\progressbar@lastheighta{false}%
}
\AddToKeyvalOption{progressbar}{heighta}{%
\def\progressbar@lastheighta{true}%
}
\AddToKeyvalOption{progressbar}{roundnessr}{%
\def\progressbar@lastroundnessa{false}%
}
\AddToKeyvalOption{progressbar}{roundnessa}{%
\def\progressbar@lastroundnessa{true}%
}
\AddToKeyvalOption{progressbarlocal}{heightr}{%
\FPmul{\BarHeightNU}{\progressbarlocal@heightr}{\f @size}%
\kvsetkeys{progressbarlocal}{heighta=\BarHeightNU pt}%
}
\AddToKeyvalOption{progressbarlocal}{roundnessr}{%
\FPmul{\BarRoundedCornersNU}{\progressbarlocal@rou ndnessr}{\BarHeightNU}%
\kvsetkeys{progressbarlocal}{roundnessa=\BarRounde dCornersNU pt}%
}
% Macor to change Options
\newcommand{\progressbarchange}[1]{%
\kvsetkeys{progressbar}{#1}%
}
%
% The actual realisation of the progressbar
\newcommand{\progressbar}[2][]{%
% Get the global keys in the local keys
\@for\progressbar@key:=\progressbar@keylist\do{%
\@expandtwoargs\kvsetkeys{progressbarlocal}{\progr essbar@key=\csname progressbar@\progressbar@key\endcsname}%
}%
\ifx\progressbar@lastheighta\progressbar@true%
\kvsetkeys{progressbarlocal}{heighta=\progressbar@ heighta}%
\else%
\kvsetkeys{progressbarlocal}{heightr=\progressbar@ heightr}%
\fi%
\ifx\progressbar@lastroundnessa\progressbar@true%
\kvsetkeys{progressbarlocal}{roundnessa=\progressb ar@roundnessa}%
\else%
\kvsetkeys{progressbarlocal}{roundnessr=\progressb ar@roundnessr}%
\fi%
%Now get the optional user input keys
\kvsetkeys{progressbarlocal}{#1}%
% Convert KeyVal-Options to lengths
\setlength{\BarHeight}{\progressbarlocal@heighta}%
\setlength{\BarWidth}{\progressbarlocal@width}%
\setlength{\BarRoundedCorners}{\progressbarlocal@r oundnessa}%
% Will be important later for calculations
\def\BarHeightNU{\strip@pt\BarHeight}%
\def\BarWidthNU{\strip@pt \BarWidth}%
% BarSubDivision
\FPdiv{\BarSubDivisionsWidthANU}{\BarWidthNU}{\pro gressbarlocal@subdivisions}%
\FPmul{\BarSubDivisionsWidthBNU}{\BarSubDivisionsW idthANU}{2}%
\FPsub{\BarSubDivisionsWidthCNU}{\BarWidthNU}{\Bar SubDivisionsWidthANU}%
% The filled part of the bar is calculated and set
\FPmul{\BarPartWidthNU}{#2}{\BarWidthNU}%
\setlength{\BarPartWidth}{\BarPartWidthNU pt}%
%
\begin{tikzpicture}%
\coordinate (Begin) at (0,0);%
\coordinate (End) at (\BarWidth,\BarHeight);%
\coordinate (Part) at (\BarPartWidth,\BarHeight);%
% Rounded Corners
\draw[rounded corners=\BarRoundedCorners,line width=\progressbarlocal@borderwidth,color=\progres sbarlocal@linecolor] (Begin) rectangle (End);%
\clip[rounded corners=\BarRoundedCorners] (Begin) rectangle (End);%
% Fill the bar
\fill[fill=\progressbarlocal@emptycolor] (Begin) rectangle (End);%
% the full part
\fill[fill=\progressbarlocal@filledcolor] (Begin) rectangle (Part);%
% Ticks
\foreach \x in {\BarSubDivisionsWidthANU,\BarSubDivisionsWidthBNU ,...,\BarSubDivisionsWidthCNU}%
\draw[draw=\progressbarlocal@tickscolor,line width=\progressbarlocal@tickswidth] (\x pt,0) -- (\x pt,\BarHeight*\progressbar@ticksheight);%
% Rounded Corners again
\draw[rounded corners=\BarRoundedCorners,line width=\progressbarlocal@borderwidth,color=\progres sbarlocal@linecolor] (Begin) rectangle (End);%
\end{tikzpicture}%
}