PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zerbrechlicher Befehl - Was muss robust sein?



Liberty
17-02-2011, 09:55
Moin,

ich bin mal wieder an meine Grenzen gestoßen. :confused: 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.



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



! 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.

u_fischer
17-02-2011, 10:34
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


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

Schweinebacke
17-02-2011, 10:51
\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).

Liberty
17-02-2011, 11:19
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:



\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