其中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 中,对齐是精确的。)