TikZ/PGF-关闭阴影

TikZ/PGF-关闭阴影

有没有办法在节点被着色的范围内关闭一个节点的着色?换句话说,我想要类似的东西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}]childchildnode

还有一件事:我之所以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 样式?

相关内容