Нужна помощь в настройке параметров key-val для моего пакета

Нужна помощь в настройке параметров key-val для моего пакета

Я хочу использовать параметры key-svalue для своего пакета и попробовал решение с pgfopts. Должно быть возможно 1) загрузить пакет с помощью eg

\usepackage[colors=1]{mypack}

2) изменить цвет где-то в пользовательском коде, не только в преамбуле, с помощью чего-то вроде

\MPset{colors=2}

и 3) проверить, какой цвет активен.

В моем пакете реального мира есть еще 2 опции, касающиеся языка и сообщений, так что, возможно, pgfopts — это излишество. Я бы с радостью принял любое рабочее решение с любым пакетом key-val.

\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

Я использую mypack в этом тестовом документе

\documentclass{article}
%\usepackage[colors=1]{mypack}
\usepackage{mypack}
\MPset{colors=2}
\begin{document}
  :\pgfkeysvalueof{colors}:
  \test
\end{document}
\endinput

Если я загружу свой рюкзак

\usepackage[colors=1]{mypack}

Я получаю эту ошибку

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

Если я загружаю mypack без опции, он компилируется, но

\pgfkeysvalueof{colors}

пусто. Когда я раскомментирую

\test

Я получаю нужный цветной текст, но все еще не могу проверить, какой цвет активен

решение1

Вот исправленная версия вашего кода:

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

Вот измененная версия (попробуй) соответствуют вашим требованиям.

  • Макрос \MPspecialиспользует MP@uses@italicTeX-if для выбора курсива или цвета.
  • Ключ use italicустанавливает MP@uses@italicзначение TeX-if как true или false.
  • Ключ define current colorопределяет текущий цвет (через xcolor) и попутно сохраняет его текущее имя в \MP@current@color.
  • Ключ colorsпредставляет собой выбор из трех альтернатив (черный, синий, красный) и определяет MP current color. Красный и синий цвета устанавливаются use italicв значение false, а черный цвет устанавливается use italicв значение true.
\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}

введите описание изображения здесь

Связанный контент