我想创建一个宏来绘制一个由几个部分组成的复杂形状(比如一个圆形和一个矩形):
\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
改编
- 使用样式
circle
并rectangle
设置使用的样式(circle props
和rectangle 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
设置两者。我还更改了行为,在明确设置的键之前使用两种样式中的每个未知键。circle
rectangle
(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}