
我想為我的包使用鍵值選項,並且我嘗試了 pgfopts 的解決方案。必須可以 1) 載入包,例如
\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@italic
TeX-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}