如何通过 \pgfkeys 构造 key=value 的宏

如何通过 \pgfkeys 构造 key=value 的宏

我刚刚学习\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

在此处输入图片描述

相关内容