Anzeige:
Ergebnis 1 bis 10 von 10

Thema: (Fortschrittsbalken) Testen, ob Keyval-Option von User gesetzt wurde

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

    (Fortschrittsbalken) Testen, ob Keyval-Option von User gesetzt wurde

    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!

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Und was soll passieren, wenn der User den Key explixit auf den Defaultwert gesetzt hat?

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

  4. #4
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Spindoctor Beitrag anzeigen
    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.
    Code:
    \def\Key@Heighta{}% oder wie sie bei dir heißt
    ... 
    \ifx\relax\Key@Heighta\relax\else ... \fi

    Herbert

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    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.

  6. #6
    Registrierter Benutzer
    Registriert seit
    09.06.2007
    Beiträge
    338
    danke fürs erste für die ratschläge. muss noch überlegen, wie ich das umsetz...

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

  8. #8
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Spindoctor Beitrag anzeigen
    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

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

  10. #10
    Registrierter Benutzer
    Registriert seit
    09.06.2007
    Beiträge
    338
    Code:
    %
    % 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,heightr,roundnessr,width,linecolor,emptycolor,filledcolor,borderwidth,tickswidth,ticksheight,tickscolor,subdivisions}
    % 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@defaultvaluelist\do{%
        \stepcounter{progressbar@counter}%
        \expandafter\edef\csname progressbar@value\the\value{progressbar@counter}\endcsname{\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}\endcsname]{\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@roundnessr}{\BarHeightNU}%
        \kvsetkeys{progressbarlocal}{roundnessa=\BarRoundedCornersNU 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}{\progressbar@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=\progressbar@roundnessa}%
        \else%
            \kvsetkeys{progressbarlocal}{roundnessr=\progressbar@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@roundnessa}%
        % Will be important later for calculations
        \def\BarHeightNU{\strip@pt\BarHeight}%
        \def\BarWidthNU{\strip@pt \BarWidth}%
        % BarSubDivision
        \FPdiv{\BarSubDivisionsWidthANU}{\BarWidthNU}{\progressbarlocal@subdivisions}%
        \FPmul{\BarSubDivisionsWidthBNU}{\BarSubDivisionsWidthANU}{2}%
        \FPsub{\BarSubDivisionsWidthCNU}{\BarWidthNU}{\BarSubDivisionsWidthANU}%
        % 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=\progressbarlocal@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=\progressbarlocal@linecolor] (Begin) rectangle (End);%
        \end{tikzpicture}%
    }

Stichworte

Lesezeichen

Berechtigungen

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