如何优雅地将平行线添加到现有路径?我正在寻找解决方案或提示,如何制作适用于任何路径的通用样式。
示例路径:
\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
命令。我认为处理curveto
和closepath
段也会非常棘手。
\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
我刚刚找到了nfold
Jonathan 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
。