我想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}