在 TikZ 中绘制额外的平行路径

在 TikZ 中绘制额外的平行路径

如何优雅地将平行线添加到现有路径?我正在寻找解决方案或提示,如何制作适用于任何路径的通用样式。

示例路径:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \draw (0,0) -- (1,1) -| (2,2) -- (3,2) -- (3,1);
\end{tikzpicture}
\end{document}

原始路径

路径相同,但有可自定义的附加行:

带有额外平行线的路径

这里我画了两条额外的线,只是为了说明我的意思。理想情况下,解决方案应该只添加一条额外的线,但可以以某种方式扩展到任意数量的线。

问题:如何建立节点间的平行路径?,我的解决方案不够优雅,这启发我提出这个问题。

答案1

事实证明,部分工作已经完成,但一个重要的宏\pgfdecoratedangletonextinputsegment没有记录(并且定义不正确 - 这可能是它没有记录的原因)。这是一个没有经过充分测试的解决方案直线只是没有中间路径moveto命令。我认为处理curvetoclosepath段也会非常棘手。

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{decorations}

\def\pgfdecoratedcontourdistance{0pt}

\pgfkeys{/pgf/decoration/contour distance/.code={%
    \pgfmathparse{#1}%
    \let\pgfdecoratedcontourdistance=\pgfmathresult}%
}

\pgfdeclaredecoration{contour lineto}{start}
{
    \state{start}[next state=draw, width=0pt]{
        \pgfpathmoveto{\pgfpoint{0pt}{\pgfdecoratedcontourdistance}}%
    }
    \state{draw}[next state=draw, width=\pgfdecoratedinputsegmentlength]{       
        \pgfmathparse{-\pgfdecoratedcontourdistance*cot(-\pgfdecoratedangletonextinputsegment/2+90)}%
        \let\shorten=\pgfmathresult%
        \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentlength+\shorten}{\pgfdecoratedcontourdistance}}%  
    }
    \state{final}{
        \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentlength}{\pgfdecoratedcontourdistance}}%
    }   
}

\begin{document}

\begin{tikzpicture}

\draw [
    postaction={
        decoration={contour lineto, contour distance=-5pt},
        draw=red, dotted, decorate},
    postaction={
        decoration={contour lineto, contour distance=15pt}, 
        draw=blue, dashed, decorate},
    postaction={
        decoration={contour lineto, contour distance=10pt}, 
        draw=green, decorate}
    ] 
    (0, 0) -- (3, 1) -- (4, 4) -- (6, 4) -- 
    (8,-1) -- (2,-2) -- (5, 2) -- (6, 0);

\end{tikzpicture}


\end{document}

轮廓示例

答案2

我刚刚找到了nfoldJonathan Schulz 于 2023 年编写的库。它确实可以做到这一点 - 也适用于贝塞尔曲线和闭合曲线。

\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{nfold}
\begin{document}
\begin{tikzpicture}
\draw[save path=\savedpath] (0,0) -- (1,1) -| (2,2) -- (3,2) -- (3,1) to[bend left] (2,0) --cycle;
\pgfoffsetpath{\savedpath}{-4pt}
\pgfsetlinewidth{2pt} \color{red} \pgfusepathqstroke
\pgfoffsetpath{\savedpath}{10pt}
\pgfsetdash{{1pt}{1pt}}{0cm} \pgfsetlinewidth{1pt} \color{blue} \pgfusepathqstroke
\end{tikzpicture}
\end{document}

三条曲线相互嵌套

我不知道这是否可以做成高级别的 TikZ \draw

相关内容