我刚刚学习\pgfkeys
,但不太明白如何使用它制作带有key=value
选项的宏。
我想举下面这个简单的例子作为练习来表达我的想法。
\documentclass{article}
\usepackage{tikz}
\newcommand{\mycolorbox}[1][]{
\pgfkeys{
color/.initial=red,
text/.initial=some text,
#1,
exe/.code=\colorbox{color}{text}
}
}
\begin{document}
\mycolorbox[color=blue, text=This is a practice.]
\end{document}
这不管用。有人能帮我解决吗?
答案1
您想为键定义自己的命名空间,并将键的定义与使用分开。
\documentclass{article}
\usepackage{tikz}
\pgfkeys{/lyl/mycolorbox/.cd, % define your own space
color/.store in=\mycolorboxcolor,
text/.store in=\mycolorboxtext,
color=red!40,
text=some text,
}
\newcommand{\mycolorbox}[1][]{%
\begingroup
\pgfkeys{/lyl/mycolorbox/.cd,#1}%
\colorbox{\mycolorboxcolor}{\mycolorboxtext}%
\endgroup
}
\begin{document}
\mycolorbox[color=blue!20]
\mycolorbox[text=This is a practice.]
\mycolorbox[color=blue!20, text=This is a practice.]
\end{document}
expl3版本:
\documentclass{article}
\usepackage{xcolor}
\ExplSyntaxOn
\keys_define:nn { lyl/mycolorbox }
{
color .tl_set:N = \l__lyl_mycolorbox_color_tl,
text .tl_set:N = \l__lyl_mycolorbox_text_tl,
color .initial:n = red!40,
text .initial:n = some~text,
}
\NewDocumentCommand{\mycolorbox}{O{}}
{
\group_begin:
\keys_set:nn { lyl/mycolorbox } { #1 }
\colorbox{\l__lyl_mycolorbox_color_tl}{\l__lyl_mycolorbox_text_tl}
\group_end:
}
\ExplSyntaxOff
\begin{document}
\mycolorbox[color=blue!20]
\mycolorbox[text=This is a practice.]
\mycolorbox[color=blue!20, text=This is a practice.]
\end{document}
答案2
存储值的另一种方法是在键路径本身内(这并不意味着您不使用那么多命令,因此这不会减轻命名空间的繁重程度)。
\documentclass[]{article}
\usepackage{xcolor}
\usepackage{pgfkeys}
\pgfkeys
{%
/mycolorbox/.is family
,/mycolorbox
,color/.initial=blue
,text/.initial=some text
}
\newcommand\mycolorbox[1][]
{%
\begingroup
\pgfqkeys{/mycolorbox}{#1}%
\colorbox
{\pgfkeysvalueof{/mycolorbox/color}}
{\pgfkeysvalueof{/mycolorbox/text}}%
\endgroup
}
\begin{document}
\mycolorbox
\mycolorbox[color=red]
\mycolorbox[text=foobar]
\end{document}
(注意:\pgfqkeys{/<path>}{<keys>}
相同\pgfkeys{/<path>/.cd,<keys>}
但速度更快)
答案3
如果您只是设置一个带有几个键的简单宏(并且这是访问和使用这些键的唯一界面),那么您也可以使用以下命令构建宏expkv-cs
:
\documentclass[]{article}
\usepackage{xcolor}
\usepackage{expkv-cs}
\ekvcSplit\mycolorbox
{
color=blue
,text=some text
}
{\colorbox{#1}{#2}}%
\begin{document}
\mycolorbox{}
\mycolorbox{color=red}
\mycolorbox{text=foobar}
\end{document}
(使用强制参数expkv-cs
定义宏,如果要使用可选参数,只需添加一个包装器,如:并将后面的宏名称更改为)。\mycolorbox
\newcommand\mycolorbox[1][]{\mycolorboxSplit{#1}}
\ekvcSplit
\mycolorboxSplit