有没有办法在节点被着色的范围内关闭一个节点的着色?换句话说,我想要类似的东西shading=none
,但没有找到它。动机:
\documentclass{article}
\usepackage{tikz}
\tikzset{default/.style={}}
\tikzstyle{st1}=[circle, shading=ball, ball color=red, inner sep=1.5pt]
\tikzstyle{st2}=[default, rectangle, inner xsep=0pt, inner ysep=2pt, draw]
\begin{document}
\begin{tikzpicture}[grow=right, level distance=10pt, every node/.style={st1}]
\path node{} child {node{} child {node{} child {node[st2]{}}}};
\end{tikzpicture}
\end{document}
给出以下结果:
。问题是阴影在最后一个节点中继承,而我想要的是没有阴影的。我认为default
定义中的选项st2
可能会有帮助,但它没有任何效果。
实现我想要的唯一方法是将其添加到命令的[every node/.style={default}]
最后一个;这会重置/清除所有子项的样式。在写这个问题时,我意识到我可以在最后一个上定义和使用它。这使得它易于使用 - 但我仍然想知道为什么我必须将“样式重置”放在,而不是放在?child
\tikzstyle{st3}=[every node/.style={default, st2}]
child
child
node
还有一件事:我之所以inner ysep=0.0pt
在最后一个节点上这样做,是因为我实际上想要一条线,即一个宽度为零的框。有没有办法在我的设置中实现这一点,即在节点序列中?
谢谢。
答案1
目前,该shade
键只是一个单向开关:它只能打开阴影,但不能关闭阴影。不过,重新定义很容易:
\makeatletter
\def\tikz@falsetext{false}
\tikzset{
shade/.code={
\edef\tikz@temp{#1}%
\ifx\tikz@temp\tikz@falsetext%
\tikz@addmode{\tikz@mode@shadefalse}%
\else%
\tikz@addmode{\tikz@mode@shadetrue}%
\fi
}
}
\makeatother
现在你可以说shade=false
停用阴影:
\documentclass[a4paper]{article}
\usepackage{tikz}
\makeatletter
\def\tikz@falsetext{false}
\tikzset{
shade/.code={
\edef\tikz@temp{#1}%
\ifx\tikz@temp\tikz@falsetext%
\tikz@addmode{\tikz@mode@shadefalse}%
\else%
\tikz@addmode{\tikz@mode@shadetrue}%
\fi
}
}
\makeatother
\begin{document}
\tikzset{
st1/.style={circle, shading=ball, ball color=red, inner sep=1.5pt},
st2/.style={rectangle, shade=false, inner xsep=1.5pt, inner ysep=0.0pt, draw}
}
\begin{tikzpicture}[grow=right, level distance=10pt, every node/.style={st1}]
\path node{} child {
node{} child {
node{} child {
node[st2]{}
}
}
};
\end{tikzpicture}
\end{document}
答案2
这是一个……嗯……非常棒、非常奇妙的新着色,称为none
。它基本上填充节点,不做任何其他事情。人们可以以与着色相同的方式使用它ball
,因此通过shading=none
;来指定颜色,我不确定是否让此操作执行fill
,然后我更喜欢保持其他着色的相同行为,因此有一个none shade color
定义的键。
一个例子:
\documentclass[a4paper]{article}
\usepackage{tikz}
\makeatletter
\def\tikz@shading{none}
\def\tikz@shading{none}\def\tikz@shade@angle{0}\tikz@addmode{\tikz@mode@shadetrue}
\tikzoption{none shade color}{\pgfutil@colorlet{tikz@none@color}{#1}\def\tikz@shading{none}\tikz@addmode{\tikz@mode@shadetrue}}
\pgfdeclareverticalshading[tikz@none@color]{none}{100bp}{%
color(0bp)=(tikz@none@color);
color(25bp)=(tikz@none@color);
color(50bp)=(tikz@none@color);
color(75bp)=(tikz@none@color);
color(100bp)=(tikz@none@color)}
\pgfutil@colorlet{tikz@none@color}{white}
\makeatother
\begin{document}
\tikzset{st1/.style={circle, shading=ball, ball color=red, inner sep=1.5pt}}
\tikzset{st2/.style={rectangle, inner xsep=1.5pt, inner ysep=1.0pt, draw,shading=none, none shade color=red}}
\tikzset{st3/.style={circle,shading=ball, ball color=blue, inner sep=1.5pt}}
% one could also avoid saying shading=none and just specifying the color, as for the ball shading
\tikzset{st4/.style={circle, inner sep=1.5pt, none shade color=blue!50}}
\begin{tikzpicture}[grow=right, level distance=10pt, every node/.style={st1}]
\path node{} child {node[st2]{} child {node{} child {node[st2]{} child{node[st3]{} child{node[st4]{}}}}}};
\end{tikzpicture}
\end{document}
结果:
顺便说一句:在原始代码中我\tikzstyle
按照\tikzset
应该使用 \tikzset 还是 \tikzstyle 来定义 TikZ 样式?。