修改了 /tikz/double,但未一直到行尾

修改了 /tikz/double,但未一直到行尾

我喜欢使用该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 说曲线不对,他的解决方案也会是我的首选。)

相关内容