我有一个宏,它将使用我定义的一些样式在 TikZ 图片中绘制几样东西,其中包括填充:
\documentclass{article}
\usepackage{tikz}
\tikzset{%
mystyle1/.style={fill=red,font={\bfseries}},
mystyle2/.style={fill=yellow,draw=blue}
}
\newcommand{\doit}{%
\begin{tikzpicture}
\node[mystyle1,circle]at(0,0){Text1};
\node[mystyle2,rectangle] at (3,0){Text2};
\end{tikzpicture}
}
\begin{document}
Foo
\doit
bar
\end{document}
看起来像
我怎样才能告诉 TikZ 在 之前或\tikzset
之后
不要做填充,但其他一切都要做
而无需重新定义所有样式?(这里只有两种,但在我的实际应用中有很多,而且它们可能会改变。)
因此,结果应该是这样的:
我认为,
\tikzset{every node/.append style={fill=none}}
应该可以工作,但是却不行。
答案1
一个解决方案可能是定义一种myfill
可以打开和关闭的样式。
\documentclass{article}
\usepackage{tikz}
\tikzset{myfill/.style={fill=#1}}
\tikzset{%
mystyle1/.style={myfill=red,font={\bfseries}},
mystyle2/.style={myfill=yellow,draw=blue}
}
\newcommand{\doit}{%
\begin{tikzpicture}
\node[mystyle1,circle]at(0,0){Text1};
\node[mystyle2,rectangle] at (3,0){Text2};
\end{tikzpicture}
}
\begin{document}
Foo
\doit
bar
\tikzset{myfill/.style=}
\doit
off
\end{document}
答案2
我建议您允许宏使用可选参数\doit
,您可以使用该参数指定其他选项。因此\doit
生成第一张图像并\doit[fill=none]
生成第二张图像:
如果您想要更大的灵活性,可以使用两个可选参数分别控制圆形和矩形的选项。因此,下面的第三个选项是使用以下方法生成的:
\doit[fill=orange, draw=blue, ultra thick][fill=green!50, draw=magenta, ultra thick]
笔记:
- 我用了包裹
xparse
提供允许两个可选参数的宏。如果您不想包含额外的包,可能还有其他方法可以实现这一点。
代码:一个可选参数
\documentclass{article}
\usepackage{tikz}
\tikzset{%
mystyle1/.style={fill=red,font={\bfseries}},
mystyle2/.style={fill=yellow,draw=blue}
}
\newcommand{\doit}[1][]{%
\begin{tikzpicture}
\node[mystyle1, circle, #1] at (0,0){Text1};
\node[mystyle2, rectangle, #1] at (3,0){Text2};
\end{tikzpicture}
}
\begin{document}
Foo
\doit
\doit[fill=none]
bar
\end{document}
代码:两个可选参数
\documentclass{article}
\usepackage{xparse}
\usepackage{tikz}
\tikzset{%
mystyle1/.style={fill=red,font={\bfseries}},
mystyle2/.style={fill=yellow,draw=blue}
}
\NewDocumentCommand{\doit}{O{} O{}}{%
\begin{tikzpicture}
\node[mystyle1, circle, #1] at (0,0){Text1};
\node[mystyle2, rectangle, #2] at (3,0){Text2};
\end{tikzpicture}
}
\begin{document}
Foo
\doit
\doit[fill=none][fill=none]
\doit[fill=orange, draw=blue, ultra thick][fill=green!50, draw=magenta, ultra thick]
bar
\end{document}
答案3
感谢 Thomas F. Sturm 和 Peter Grill 的启发,我找到了一个很好的解决方案:
只需重新定义fill
-style:
\tikzset{fill/.style={}}
请评论,这是否是可接受的方式或是否应该纳入l2tabu
。