如何修改 TikZ 中的节点以自动在其顶部添加一条线?

如何修改 TikZ 中的节点以自动在其顶部添加一条线?

其中TikZ有非常灵活的节点系统。作为初学者,我仍然对一些细节感到困惑。如何轻松修改节点或创建自己的节点?例如,我需要一个顶部有粗线的节点。目前,我按如下方式解决了这个问题:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}

    \node[bottom color=white,top color=black!20] (node) at (0,0) {node};

    % line on top but not well aligned 
    \draw [very thick] (node.north west) -- (node.north east);

\end{tikzpicture}

\end{document}

是否可以定义一个自动包含该线的新节点,或者这不是正确的方法?此外,该线似乎比节点本身长一点,但我不知道原因(黑线比框略宽):

节点

答案1

这是一个可能的实现:

\tikzset{mynode/.style={
        bottom color=white,top color=black!20,
        append after command={
            [very thick,shorten >=0.2bp, shorten <=0.2bp]
            (\tikzlastnode.north west)edge(\tikzlastnode.north east)
        }
    }
}

完整示例:

\documentclass{standalone}
\usepackage{tikz}

\tikzset{mynode/.style={
        bottom color=white,top color=black!20,
        append after command={
            [very thick,shorten >=0.2bp, shorten <=0.2bp]
            (\tikzlastnode.north west)edge(\tikzlastnode.north east)
        }
    }
}

\begin{document}
\begin{tikzpicture}    
    \node[mynode] at (0,0){texta};
\end{tikzpicture}

\end{document}

结果:

在此处输入图片描述

一些解释

在里面,tikzset您可以定义节点的样式,从而选择颜色bottom color=white,top color=black!20,。绘制节点后,还可以自动在上边框上绘制粗线,只需附加路径即可:这就是目的:

append after command={
            [very thick,shorten >=0.2bp, shorten <=0.2bp]
            (\tikzlastnode.north west)edge(\tikzlastnode.north east)
        }

请注意,为了正确设置线,它已通过 稍微缩短了一点shorten >=0.2bp, shorten <=0.2bp


在听取了 percusse 的评论后,我对其进行了一些调查,并且确实找到了解决问题的方法。

确实假设 用 代替\node[mynode] at (0,0){texta};.\draw[red,dotted] node[mynode]at (0,0){texta};你会得到:

在此处输入图片描述

但以下 MWE 表明可以避免这种情况(部分功劳应归功于 percusse 的评论):

\documentclass[border=1bp]{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\pgfdeclarelayer{foreground}
\pgfsetlayers{main,foreground}

\tikzset{
my safe node/.style={
        bottom color=white,top color=black!20,text=black,% <= that's for the text
        line width=0pt, %<= now it's absolutely needed to not have problems while scaling the picture
        append after command={% <= for the line
            \pgfextra{%                 
                \begin{pgfinterruptpath}
                \begin{pgfonlayer}{foreground}
                \draw[very thick,shorten >=0.05bp, shorten <=0.05bp] % <= this actually  is to remove a residual tiny exceeding border
                (\tikzlastnode.north west)--(\tikzlastnode.north east);         
                \end{pgfonlayer}
                \end{pgfinterruptpath}
            }   
        }      
    }
}

\begin{document}
\scalebox{6}{
\begin{tikzpicture}
     \draw[draw=red,dashed,ultra thick] (0,0) -- (1,1) node[my safe node]{texta} -- (2,2)
     node[my safe node] {textb} --(3,3);
\end{tikzpicture}
}
\end{document}

结果是:

在此处输入图片描述

答案2

悬垂的原因是原始节点上的线宽(我们对此有疑问,但快速搜索没有找到它)。节点上的锚点与外部线的宽度。因此,它们将实际节点延伸了描边线宽的一半。即使节点没有被描边(绘制),也会发生这种情况。因此,当您使用锚点时node.north east,您实际上(.5\pgflinewidth,.5\pgflinewidth)位于填充矩形的实际东北角上方。

由于原始节点未填充,因此最简单的解决方法是将线宽设置为0pt创建时。 以下代码执行此操作,并使用将两个命令合并为一个append after command(尽管 percusse 对 Claudio 的答案的推荐在这里是相关的),并创建一个样式别名来调用该批命令。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/76459/86}
\usepackage{tikz}

\tikzset{
  top down style/.style={
    bottom color=white,
    top color=black!20,
    line width=0pt,
    append after command={
      (\tikzlastnode.north west) edge [very thick]
(\tikzlastnode.north east)
    }
  }
}

\begin{document}
\begin{tikzpicture}

\node[top down style] (node) at (0,0) {node};

\end{tikzpicture}

\end{document}

结果如下:

节点样式

(明显的悬垂是由于转换为 PNG 造成的。在 PDF 中,对齐是精确的。)

相关内容