Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Zerbrechlicher Befehl - Was muss robust sein?

  1. #1
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154

    Zerbrechlicher Befehl - Was muss robust sein?

    Moin,

    ich bin mal wieder an meine Grenzen gestoßen. Ich versuche gerade, mir die \label \ref und \pageref Befehle in erweiterten Fassungen zusammenzubasteln, aber ich scheine ein Problem mit nicht ausreichend robusten Befehlen zu haben.

    Ich hab mal ein MinBsp gebastelt, dass jetzt zwar nicht direkt aus meinem Projekt stammt, aber den Fehler reproduziert.

    Code:
    \documentclass[a4paper,12pt]{scrartcl}
    
    \usepackage{ifthen}
    \usepackage{hyperref}
    
    % Konstanten
    \newcommand{\labelcatA}{A}
    \newcommand{\labelprefA}{TypA}
    \newcommand{\labelcatB}{B}
    \newcommand{\labelprefB}{TypB}
    \newcommand{\labelcat}{CAT}
    \newcommand{\labelcatsep}{:}
    \newcommand{\defaultcat}{\labelcatA}
    
    % Hilfsmakro, das das Label zusammenbaut
    \newcommand{\makemylabel}[2]{%
    \ifthenelse{\equal{#1}{\labelcatA}}{%
    \def\catlabel{\labelprefA}%
    }{%
    \def\catlabel{\labelprefB}%
    }
    \labelprefA\labelcatsep#2%
    }
    
    % Erweiterte Label/Ref Befehle
    \newcommand{\mylabel}[2][\defaultcat]{\label{\makemylabel{#1}{#2}}}
    \newcommand{\myref}[2][\defaultcat]{\ref{\makemylabel{#1}{#2}}}
    
    \begin{document}
    
    \section{Test}\mylabel{Test}
    
    Direct Printout: \makemylabel{T}{Test}
    
    Reference: \myref{Test}
    
    \end{document}
    Die erste der 100 Fehlermeldungen ist:

    Code:
    ! Illegal parameter number in definition of \reserved@a.
    Der Rest dürften Folgefehler sein, aber ihr seht's ja selbst bei testen.

    Ich hatte es auch schon mal geschafft, dass die *.aux - Datei die Labels enthält, allerdings waren das wilde Folgen von \par's, leeren Blöcken und so weiter.

    Soweit ich das Problem bereits verstehe, gibt's irgendwo Ärger mit einem zerbrechlichen Befehl, aber meine Versuch-Irrtum Tests mit \DeclareRobustCommand haben mir bis jetzt nicht weitergeholfen.

    Was genau muss ich also robust deklarieren, damit das gewünschte Ergebnis erzielt wird?

    MfG,

    Liberty

    P.S.: Als ich nach der Fehlermeldung gesucht habe, kamen hauptsächlich Fragen zum captions-Paket, aber in diesem Fall möchte ich ja selbst en Befehl basteln, also hat mir die Suche bis jetzt nicht geholfen.
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Was willst du eigentlich erreichen? Wieso enthält dein \makemylabel ein "\def\catlabel{\labelprefA}", wo \catlabel überhaupt nicht benutzt wird?

    Was passt dir nicht, an so etwas einfachen wie

    Code:
    \newcommand{\mylabel}[2][\defaultcat]{\label{#1\labelcatsep#2}}
    \newcommand{\myref}[2][\defaultcat]{\ref{#1\labelcatsep#2}}
    Abgesehen davon: Stecke in \label keine komplizierten Befehle. Baue den String ggfs vorher zusammen.

  3. #3
    Registrierter Benutzer
    Registriert seit
    31.03.2010
    Beiträge
    1.039
    \ifthenelse bzw, die Vergleiche darin sind nicht voll expandierbar. Deshalb sollte man es nicht in Befehlen wie \label verwenden. Besser ist es die Unterscheidung ggf. vorher zu treffen (oder Vergleiche ohne \ifthenelse zu realisieren).

  4. #4
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154
    Moin,

    @Ulrike: Das Beispiel ist nicht realistisch, deshalb fliegen da ungenutzte Befehle rum. Im eigentlichen Projekt soll ein Label aus den Bestandteilen

    [CAT][CATSEP][PREF][PREFSEP][LABEL]

    zusammengesezt, die an verschiedenen Stellen im Projekt definiert werden.

    @Schweinebacke:
    Danke für die Hinweise, ich hatte schon befürchtet, dass das Problem in den Verzweigungen liegt (ohne lief's nämlich wie gewünscht).

    Ich hab's jetzt so gelöst, dass ich das jeweils letzte Label separat definiere und dann nur noch diese einfache Definition als Parameter übergebe:

    Code:
    \documentclass[a4paper,12pt]{scrartcl}
    
    \usepackage{ifthen}
    \usepackage{hyperref}
    
    % Konstanten
    \newcommand{\labelcatA}{A}
    \newcommand{\labelprefA}{TypA}
    \newcommand{\labelcatB}{B}
    \newcommand{\labelprefB}{TypB}
    \newcommand{\labelcat}{CAT}
    \newcommand{\labelcatsep}{:}
    \newcommand{\defaultcat}{\labelcatA}
    
    % Hilfsmakro, das das Label zusammenbaut
    \newcommand{\makemylabel}[2]{%
    \ifthenelse{\equal{#1}{\labelcatA}}{%
    \def\catlabel{\labelprefA}%
    }{%
    \def\catlabel{\labelprefB}%
    }
    \labelprefA\labelcatsep#2%
    \def\currentlabel{\catlabel\labelcatsep#2}
    }
    
    % Erweiterte Label/Ref Befehle
    \newcommand{\mylabel}[2][\defaultcat]{%
    \makemylabel{#1}{#2}%
    \label{\currentlabel}%
    }
    \newcommand{\myref}[2][\defaultcat]{%
    \makemylabel{#1}{#2}%
    \ref{\currentlabel}%
    }
    
    \begin{document}
    
    \section{Test}\mylabel{Test}
    
    Direct Printout: \makemylabel{T}{Test}
    
    Reference: \myref{Test}
    
    \end{document}
    Ich denke, damit sollte mein Problem gelöst sein.

    Viele Dank für die Hilfe!

    MfG,

    Liberty
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

Lesezeichen

Berechtigungen

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