传递多个键列表

传递多个键列表

我想创建一个宏来绘制一个由几个部分组成的复杂形状(比如一个圆形和一个矩形):

\newcommand{\drawCircleAndRectangle}[1][]{%
    \draw[%my or default circle style props%] (0, 1) circle (1);
    \draw[%my or default rectangle style props%] (2, 0) rectangle (5, 2);
}

我想为每个部分分别指定键:

\begin{tikzpicture}
    \drawCircleAndRectangle[%
        circle style = {red, thick},
        rectangle style = {blue, dashed}
    ]
\end{tikzpicture}

这就是我所做的:

\newcommand{\drawCircleAndRectangle}[1][]{%
    \tikzset{#1}
    \draw[circle props] (0, 1) circle (1);
    \draw[rectangle props] (2, 0) rectangle (5, 2);
}

\begin{tikzpicture}
    \drawCircleAndRectangle[%
        circle props/.style = {red, thick},
        rectangle props/.style = {blue, dashed}
    ]
\end{tikzpicture}

但我不喜欢/.style到处都指定。我可以做不同的事吗?

答案1

改编

  • 使用样式circlerectangle设置使用的样式(circle propsrectangle props
  • 将这些样式最初设置为空,因此如果您不提供任何参数,它也可以工作
  • 使用自己的路径执行命令drawCircleAndRectangle/.cd

代码

\documentclass{article}

\usepackage{tikz}

\tikzset{
    drawCircleAndRectangle/.cd,
    circle/.style={circle props/.style={#1}},
    rectangle/.style={rectangle props/.style={#1}},
    circle props/.style={},
    rectangle props/.style={},
}

\newcommand{\drawCircleAndRectangle}[1][]{%
    \tikzset{drawCircleAndRectangle/.cd, #1}
    \draw[drawCircleAndRectangle/circle props] (0, 1) circle (1);
    \draw[drawCircleAndRectangle/rectangle props] (2, 0) rectangle (5, 2);
}

\begin{document}

\begin{tikzpicture}
    \drawCircleAndRectangle[%
        circle = {red, thick},
        rectangle = {blue, dashed}
    ]
\end{tikzpicture}

\end{document}

结果

在此处输入图片描述

答案2

免责声明:这个答案展示了一些可能的东西,expkv-cs我是它的作者。这里展示的任何东西都不是无法用实现的pgfkeys,但我认为aggregate键很方便,而等效的东西则需要一些额外的工作pgfkeys。对于这个“玩”问题,我可能会使用它来构建它,pgfkeys这样就不必混合不同的 key=value 实现。

以下用于expkv-cs定义您的前端宏。因此,您无法通过pgfkeys' 接口改变其基本行为。因此,这不能很好地集成到典型的pgf/Ti中Z 接口。我添加了\drawCircleAndRectangleSetup可以改变行为的宏。

为方便起见,这里定义了一些额外的键。这些是+=可以将内容添加到现有“样式”的变体,并且可以一次性both设置两者。我还更改了行为,在明确设置的键之前使用两种样式中的每个未知键。circlerectangle

(MWE 被盗自@dexteritas

\documentclass[]{article}

\usepackage{expkv-cs}
\usepackage{tikz}

\makeatletter
\ekvcSplit\drawCircleAndRectangle@
  {
    % set the default styles here
     circle = {}    % will be #1
    ,rectangle = {} % will be #2
    ,...            % will be #3, contains every unknown key
  }
  {%
    \draw[{#3,#1}] (0, 1) circle (1);%
    \draw[{#3,#2}] (2, 0) rectangle (5, 2);%
  }
% define extra keys
\ekvcSecondaryKeys\drawCircleAndRectangle@
  {
    % `circle +=' adds stuff to the `circle' key
     aggregate circle += {circle}{#1,#2}
    % accept both circle+=<stuff> and circle += <stuff>
    ,alias     circle+ = circle +
    % same for `rectangle'
    ,aggregate rectangle += {rectangle}{#1,#2}
    ,alias     rectangle+ = rectangle +
    % add `both' and `both +='
    ,meta      both  = {circle= {#1}, rectangle= {#1}}
    ,meta      both += {circle+={#1}, rectangle+={#1}}
    ,alias     both+ = both +
  }
% add a macro to change the defaults
\newcommand*\drawCircleAndRectangleSetup{\ekvcChange\drawCircleAndRectangle@}
% wrapper for the optional argument
\newcommand{\drawCircleAndRectangle}[1][]{\drawCircleAndRectangle@{#1}}
\makeatother

\begin{document}
\begin{tikzpicture}
  \drawCircleAndRectangle
  \drawCircleAndRectangle[
    circle={green, dotted},rectangle={yellow, thin},both+=xshift=1cm]
  \drawCircleAndRectangle[
    circle={red, thick},rectangle={blue, dashed},yshift=-4cm]
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容