Benötige Hilfe zum Festlegen von Key-Val-Optionen für mein Paket

Benötige Hilfe zum Festlegen von Key-Val-Optionen für mein Paket

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 \MPspecialMakro verwendet das MP@uses@italicTeX-if, um zwischen Kursivschrift und Farbe zu wählen.
  • Der use italicSchlüssel setzt das MP@uses@italicTeX-if auf true oder false.
  • Der define current colorSchlüssel definiert die aktuelle Farbe (über xcolor) und speichert übrigens ihren aktuellen Namen in \MP@current@color.
  • Der colorsSchlüssel ist eine Auswahl mit drei Alternativen (schwarz, blau, rot) und definiert das MP current color. Die Farben Rot und Blau werden use italicauf „false“ und die Farbe Schwarz use italicauf „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}

Bildbeschreibung hier eingeben

verwandte Informationen