我想在两个节点之间创建一条直线,tikzpicture
中间用虚线部分打断。无论线的方向如何,这都应该有效。
预期输出如下:
最好的办法是为此定义一种线条样式,而不是每次使用时clip
都删除直线,然后调整虚线以适应孔。解决方案的最小代码如下
\documentclass[a4paper, 12pt]{report}
\usepackage{tikz}
\tikzset{
middle dotted line/.style={
thick,
% YOUR HELP HERE
}
}% end of tikzset
\begin{document}
\begin{tikzpicture}
\node (A) at (0, 3) {};
\node (B) at (5, 3) {};
\node (C) at (0, 2) {};
\node (D) at (5, 0) {};
\draw[middle dotted line] (A) -- (B);
\draw[middle dotted line] (C) -- (D);
\end{tikzpicture}
\end{document}
答案1
灵感来自马克·维布罗
\documentclass[tikz, border=5]{standalone}
\usetikzlibrary{decorations.pathreplacing,calc}
\tikzset{%
middle dotted line/.style={
decoration={show path construction,
lineto code={
\draw[#1] (\tikzinputsegmentfirst) --($(\tikzinputsegmentfirst)!.3333!(\tikzinputsegmentlast)$);,
\draw[dotted,#1] ($(\tikzinputsegmentfirst)!.3333!(\tikzinputsegmentlast)$)--($(\tikzinputsegmentfirst)!.6666!(\tikzinputsegmentlast)$);,
\draw[#1] ($(\tikzinputsegmentfirst)!.6666!(\tikzinputsegmentlast)$)--(\tikzinputsegmentlast);,
}
},
decorate
},
}
\begin{document}
\begin{tikzpicture}
\draw[middle dotted line] (0,0)--(4,1);
\draw[middle dotted line={line width=1.5pt}] (1,1)--(3,4);
\end{tikzpicture}
\end{document}
答案2
使用spath3
库(在撰写本文时,需要来自 github 的开发版本)。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/639726/86}
\usepackage{tikz}
\usetikzlibrary{spath3}
\begin{document}
\begin{tikzpicture}
\draw[spath/save=path,ultra thick, red] (0,0) -- +(3,0);
\draw[spath/split at keep start={path}{1/3},spath/use=path];
\draw[spath/split at keep end={path}{2/3},spath/use=path];
\draw[spath/split at keep middle={path}{1/3}{2/3},spath/use=path,dotted];
\draw[spath/save=path,ultra thick, red] (0,-1) .. controls +(6,-1) and +(-6,-1) .. +(3,0);
\draw[spath/split at keep start={path}{1/3},spath/use=path];
\draw[spath/split at keep end={path}{2/3},spath/use=path];
\draw[spath/split at keep middle={path}{1/3}{2/3},spath/use=path,dotted];
\end{tikzpicture}
\end{document}
它的工作原理是将路径分成三个部分,然后用不同的样式渲染每个部分。正如 Henri 在评论中提到的那样,要获得真正的实线和虚线,至少需要两个绘制命令 - 每种样式一个。我对每个段使用一个,因为将第一个段和最后一个段组合起来实际上会导致代码稍微复杂一些。
由于它使用该spath3
库,因此它可以在任意路径上运行。
结果如下:
答案3
不用大师的技巧,试试这个:
\documentclass[tikz, border=1cm]{standalone}
\begin{document}
\begin{tikzpicture}
\path (0,0) coordinate (A) (3,5) coordinate (B);
\path (A)--(B) node [inner sep=0pt,pos=.333] (C) {};
\path (A)--(B) node [inner sep=0pt,pos=.666] (D) {};
\draw (A)--(C);
\draw (D)--(B);
\draw[dotted] (C)--(D);
\end{tikzpicture}
\end{document}
输出:
答案4
Raffaele Santoro 的答案略有不同,使用calc
库来缩短代码。它产生相同的输出。
\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\path (0,0) coordinate (A) (3,5) coordinate (B);
\draw (A)--($(A)!1/3!(B)$) ($(A)!2/3!(B)$) -- (B);
\draw[dotted] ($(A)!1/3!(B)$) -- ($(A)!2/3!(B)$);
\end{tikzpicture}
\end{document}