不要在 TikZ 中进行任何填充

不要在 TikZ 中进行任何填充

我有一个宏,它将使用我定义的一些样式在 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

相关内容