带剪辑的双线

带剪辑的双线

我想double在两个节点之间画一条线;两条线中的一条double应该是实线,一条是虚线。我不希望手动移动其中一条线,但这也许是唯一的方法?如果是这样,有没有一种简单的方法可以做到这一点,而不需要进行一些繁琐的角度计算?

答案1

带剪辑的双线

以下示例首先在节点之间绘制一条虚线双线。然后它剪切下部并绘制一条覆盖下部虚线的实线双线。由于我的 PDF 查看器在某些缩放级别显示了一些瑕疵,因此内部区域再次填充了白色。

\documentclass{article}
\usepackage{tikz}

\begin{document}
  \begin{tikzpicture}
    \node (A) at (0, 0) {A};
    \node (B) at (3, 1) {B};
    \draw[double, dashed] (A) -- (B);
    \begin{scope}
      \clip (current bounding box.south west) --
            (A.center) -- (B.center) --
            (current bounding box.south east) -- cycle;
      \draw[double] (A) -- (B);
    \end{scope}
    \draw[
      white,
      line width=0.6pt, % default double distance
      shorten <=-.1pt,
      shorten >=-.1pt,
    ] (A) -- (B);
    % removes some leftover artifacts in the middle
  \end{tikzpicture}
\end{document}

结果

装饰

以下示例通过接口实现了双线decoration。这是我的第一次尝试,因此有一些限制:

  • 仅支持不相连的直线段。
  • cycle不起作用。
  • 线段不宜太短。

但是还实现了虚线的功能,据我所知,TikZ 中缺少该功能:

  • 虚线以固相开始和结束。

示例文件:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations}

\pgfdeclaredecoration{dashsoliddouble}{initial}{
  \state{initial}[width=\pgfdecoratedinputsegmentlength]{
    \pgfmathsetlengthmacro\lw{.3pt+.5\pgflinewidth}
    \begin{pgfscope}
      \pgfpathmoveto{\pgfpoint{0pt}{\lw}}%
      \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentlength}{\lw}}%
      \pgfmathtruncatemacro\dashnum{%
        round((\pgfdecoratedinputsegmentlength-3pt)/6pt)
      }
      \pgfmathsetmacro\dashscale{%
        \pgfdecoratedinputsegmentlength/(\dashnum*6pt + 3pt)
      }
      \pgfmathsetlengthmacro\dashunit{3pt*\dashscale}
      \pgfsetdash{{\dashunit}{\dashunit}}{0pt}
      \pgfusepath{stroke}
      \pgfsetdash{}{0pt}
      \pgfpathmoveto{\pgfpoint{0pt}{-\lw}}%
      \pgfpathlineto{\pgfpoint{\pgfdecoratedinputsegmentlength}{-\lw}}%     
      \pgfusepath{stroke}
    \end{pgfscope}
  }
}

\begin{document}
  \begin{tikzpicture}
    \node (A) at (0, 0) {A};
    \node (B) at (3, 1) {B};
    \node (C) at (3, 2) {C};
    \node (D) at (1, 2) {D};
    \draw[decoration={dashsoliddouble}, decorate]
      (A) -- (B) -- (C) -- (D) -- (A)
    ;
  \end{tikzpicture}
\end{document}

结果

相关内容