Seite 1 von 1

Wie optionalen Parameter zur Steuerung nutzen?

Verfasst: Mi 16. Okt 2013, 11:24
von hezo
Hallo,

ich versuche einen Befehl zu schreiben, der im Wesentlichen nur den todo Befehl aus dem Paket todonotes mit unterschiedlichen Parametern aufruft. Zur Steuerung möchte ich einen optionalen Parameter benutzen, und in Abhängigkeit von diesem den optionalen Parameter für den todo Befehl setzen. Mein Befehl soll wie folgt funktionieren:

\mytodo{irgendwas} erzeugt normalen \todo{irgendwas}
\mytodo[done]{irgendwas} soll (z.B.) \todo[color=green!10, nolist]{irgendwas} erzeugen

Ich verstehe nicht warum der erste Block im folgenden Code funktioniert, und die beiden auskommentierten nicht. Mir geht es bei diesem Post nicht darum die gewünschte Funktion mit einer ganz anderen Herangehensweise hinzubekommen, sondern darum zu verstehen warum mein Ansatz nicht funktioniert, um für die Zukunft dazuzulernen.

Vielen Dank schonmal für jede Hilfe.
\documentclass{article}

\usepackage{todonotes}
\usepackage{ifthen}

\newcommand{\mytodo}[2][]% works fine
	{\ifthenelse%
		{\equal{#1}{done}}%
		{\def\color{green!10}}%
		{\def\color{green!70}}%
		\todo[color=\color]{#2}%
	}

%\newcommand{\mytodo}[2][]% does not work
%	{\ifthenelse%
%		{\equal{#1}{done}}%
%		{\def\color{green!10}\def\in_list{, nolist}}%
%		{\def\color{green!70}\def\in_list{ }}%
%		\todo[color=\color \in_list]{#2}%
%	}

%\newcommand{\mytodo}[2][]% does not work
%	{\ifthenelse%
%		{\equal{#1}{done}}%
%		{\def\set_color{color=green!10}}%
%		{\def\set_color{color=green!70}}%
%		\todo[\set_color]{#2}%
%	}

\begin{document}

	Just some useless \todo[color=green!70]{this is in todolist} text,\newline and some more \todo[color=green!10, nolist]{this is not in todolist} text.

	Just some useless \mytodo{this is in todolist} text,\newline and some more \mytodo[done]{should not be in todolist} text.
	
	\listoftodos

\end{document}

Verfasst: Mi 16. Okt 2013, 11:37
von u_fischer
Hm. Also den \color-Befehl umzudefinieren, führt bestimmt in die Hölle.

Setze die Farben besser so:
\newcommand{\mytodo}[2][]% works fine
    {\ifthenelse%
       {\equal{#1}{done}}%
       {\colorlet{mycolor}{green!10}}%
       {\colorlet{mycolor}{green!70}}%
       \todo[color=mycolor]{#2}%
    }
Du kannst keine Befehle mit Unterstrichen definieren (außer du änderst vorher den \catcode. Ändere die Namen zu \mynolist oder ähnliches.

Und verstecke die Kommas (und auch Gleichheitszeichen) nicht in Befehlen. Das bringt das keyval-System durcheinander.
D.h. weder \def\mysetcolor{color=green} noch \def\mynolist{, nolist} wird funktionien.

Falls du planst ganze Listen in Befehlen zu speichern, müsste sowas gehen:

\def\mykeylist{color=green, nolist, ...}
\expandafter\todo\expandafter[\mylist]{#2}

Verfasst: Mi 16. Okt 2013, 12:14
von hezo
Vielen Dank, das funktioniert ganz prima. Ich werde dann mal versuchen was es mit dem \exandafter und dem keyval auf sich hat.