
Ich möchte Key-SValue-Optionen für mein Paket verwenden und habe eine Lösung mit pgfopts ausprobiert. Es muss möglich sein, 1) das Paket zu laden mit z. B.
\usepackage[colors=1]{mypack}
2) die Farbe irgendwo im Benutzercode zu ändern, nicht nur in der Präambel, mit etwas wie
\MPset{colors=2}
und 3) um zu testen, welche Farbe aktiv ist.
In meinem echten Paket gibt es zwei weitere Optionen für Sprache und Nachrichten, daher ist pgfopts vielleicht übertrieben. Ich würde jede funktionierende Lösung mit jedem Key-Val-Paket gerne akzeptieren.
\ProvidesPackage{mypack}
\RequirePackage{%
xcolor,
pgfopts
}
\def\MPset#1{\pgfqkeys{/MP}{ /#1}}
\MPset{colors/.initial=2}
\MPset{colors/.is choice}
\MPset{colors/1/.code={\def\test{\textcolor{black}{TEST}}}}
\MPset{colors/2/.code={\def\test{\textcolor{red}{TEST}}}}
\MPset{colors/3/.code={\def\test{\textcolor{blue}{TEST}}}}
\ProcessPgfPackageOptions{/MP}
\endinput% mypack.sty
Ich verwende mypack in diesem Testdokument
\documentclass{article}
%\usepackage[colors=1]{mypack}
\usepackage{mypack}
\MPset{colors=2}
\begin{document}
:\pgfkeysvalueof{colors}:
\test
\end{document}
\endinput
Wenn ich mein Paket lade mit
\usepackage[colors=1]{mypack}
Ich erhalte diesen Fehler
! Package pgfkeys Error: I do not know the key '/MP/colors', to which you
passed '1', and I am going to ignore it. Perhaps you misspelled it.
See the pgfkeys package documentation for explanation.
Type H <return> for immediate help.
...
l.16 \ProcessPgfPackageOptions{/MP}
Wenn ich mypack ohne eine Option lade, wird es kompiliert, aber
\pgfkeysvalueof{colors}
ist leer. Wenn ich das Kommentarfeld entferne
\test
Ich erhalte den gewünschten farbigen Text, kann aber immer noch nicht testen, welche Farbe aktiv ist
Antwort1
Hier ist eine korrigierte Version Ihres Codes:
\documentclass{article}
%------------------------------
\usepackage{filecontents}
\begin{filecontents*}{mypack.sty}
\ProvidesPackage{mypack}
\RequirePackage{%
xcolor,
pgfopts
}
\pgfkeys{/MP/.is family}
\def\MPset#1{\pgfkeys{/MP,#1}}
\MPset{
colors/.is choice,
colors/1/.code={\def\test{\textcolor{black}{TEST}}},
colors/2/.code={\def\test{\textcolor{red}{TEST}}},
colors/3/.code={\def\test{\textcolor{blue}{TEST}}},
% default value
colors=2,
}
\ProcessPgfPackageOptions{/MP}
\endinput% mypack.sty
\end{filecontents*}
%------------------------------
\usepackage[colors=3]{mypack}
%\MPset{colors=2}
\begin{document}
\test
\end{document}
Hier ist eine modifizierte Version zu (versuchen zu) Ihren Anforderungen entsprechen.
- Das
\MPspecial
Makro verwendet dasMP@uses@italic
TeX-if, um zwischen Kursivschrift und Farbe zu wählen. - Der
use italic
Schlüssel setzt dasMP@uses@italic
TeX-if auf true oder false. - Der
define current color
Schlüssel definiert die aktuelle Farbe (über xcolor) und speichert übrigens ihren aktuellen Namen in\MP@current@color
. - Der
colors
Schlüssel ist eine Auswahl mit drei Alternativen (schwarz, blau, rot) und definiert dasMP current color
. Die Farben Rot und Blau werdenuse italic
auf „false“ und die Farbe Schwarzuse italic
auf „true“ gesetzt.
\documentclass{article}
%------------------------------
\usepackage{filecontents}
\begin{filecontents*}{mypack.sty}
\ProvidesPackage{mypack}
\RequirePackage{xcolor}
\RequirePackage{pgfopts}
\newif\ifMP@uses@italic
\pgfkeys{/MP/.is family}
\def\MPset#1{\pgfkeys{/MP,#1}}
\MPset{
% some special macros use italic istead of black
use italic/.is if=MP@uses@italic,
use italic=false, % default value
% define the current color
define current color/.code={\def\MPcurrent@color@name{#1}\colorlet{current MP color}{#1}},
%
colors/.is choice,
colors/black/.style={use italic=true,define current color=black},
colors/red/.style={use italic=false,define current color=red},
colors/blue/.style={use italic=false,define current color=blue},
% default value
colors=red,
}
\def\MPspecial#1{\ifMP@uses@italic\textit{#1}\else\textcolor{current MP color}{#1}\fi}
\def\test{\textcolor{current MP color}{TEST (in \MPcurrent@color@name)}}
\ProcessPgfPackageOptions{/MP}
\endinput% mypack.sty
\end{filecontents*}
%------------------------------
\pagestyle{empty}
\usepackage[colors=red]{mypack}
\begin{document}
\test{} \MPspecial{My text}
\MPset{colors=black}
\test{} \MPspecial{My text}
\MPset{colors=blue}
\test{} \MPspecial{My text}
\end{document}