我喜欢使用该double
选项来绘制一条下方带有更粗、不同颜色的线条。
然而,我经常让几条线汇聚在一点。它们都是独立的线,但线的较粗部分会与较细部分重叠,从而破坏效果。
理想情况下,我想要一个修改版本的效果/tikz/double
,它不会在(比如说)曲线长度的 5% 处绘制较粗的线。这可能吗?因此,较细的“内部”线将按规定绘制,但较粗的“下方”线不会在整个长度上绘制。
答案1
不完整的解决方案如下。它使用预作用。当曲线不是直线集合而是贝塞尔曲线时,就会出现问题。在这种情况下,绘制的两条线(预作用线和常规线)不会完全经过相同的点(仔细查看下图的曲线部分)。代码如下:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[red]
[preaction={draw,green,shorten >=2pt,shorten <=2pt,ultra thick}]
(0.5,0.5)--(0,1) -- (0,0) .. controls ++(1,0) and ++(0,-1) .. (1,1);
\end{tikzpicture}
\end{document}
输出为
答案2
这是另一种方法。它使用与 Frederic 相同的基本思想,即用预作用代替加倍(加倍实际上只是预作用,除了处理箭头的一些技巧)。但它不是缩短底层路径,而是将其绘制在背景层上。这样做的方法是将预作用路径包裹在三明治中\pgfonlayer ... \endpgfonlayer
。这需要一个新的键,我富有想象力地将其称为preaction on background layer
。它必须去后预操作已被定义,因为它将当前定义的预操作包含在适当的命令中 - 它不能自行执行。虽然我已将其放入其自己的样式选项中,但您希望能够以类似于语法的方式指定颜色和线宽double
。这并不难做到。
以下是代码(为了便于比较,将原始版本double
、Frederic 的版本和我的版本放在一起):
\documentclass{standalone}
\usepackage{tikz}
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}
\makeatletter
\def\pgf@on@bglayer{\pgfonlayer{background}}
\tikzset{
preaction on background layer/.code={
\expandafter\def\expandafter\tikz@preactions\expandafter{\expandafter\pgf@on@bglayer\tikz@preactions\endpgfonlayer}
},
double behind/.style={
preaction={
draw,
red,
line width=8pt
},
preaction on background layer
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\foreach \ang in {45,90,...,360} {
\draw[line width=2pt,red,double=black,double distance=4pt] (0,0) -- (\ang:2);
}
\foreach \ang in {45,90,...,360} {
\draw[black,line width=4pt,preaction={line width=8pt,red,draw,shorten >=2pt,shorten <=2pt}] (5,0) -- ++(\ang:2);
}
\foreach \ang in {45,90,...,360} {
\draw[double behind,line width=4pt] (10,0) -- ++(\ang:2);
}
\end{tikzpicture}
\end{document}
结果如下:
(顺便说一句,如果不是因为 Frederic 说曲线不对,他的解决方案也会是我的首选。)