![TikZ 虚线图案与封闭路径](https://linux22.com/image/381319/TikZ%20%E8%99%9A%E7%BA%BF%E5%9B%BE%E6%A1%88%E4%B8%8E%E5%B0%81%E9%97%AD%E8%B7%AF%E5%BE%84.png)
我有一个简单的问题,希望得到一个简单的答案:如果虚线长度超过了路径的长度,为什么用虚线图案关闭路径不起作用?
\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[dash pattern=on 5cm off 16cm,blue,ultra thick]
(0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle;
\begin{scope}[xshift=2cm]
\draw[blue,ultra thick]
(0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}
如果仔细观察,您会发现左侧轮廓没有闭合,即左下角“扭曲”了。尽管虚线超出了5cm
路径的长度() ,但情况4cm
仍然如此。为什么会这样?如何修复?
请注意,我对这种手动修复不感兴趣\draw[blue,ultra thick] (0,0) -- (1,0) -- (1,1) -- (0,1) -- (0,-\pgflinewidth/2);
。不过,我也对使用装饰的解决方案感兴趣。这是因为当前的问题与这个问题很好以及下面的讨论。如果你想出一个基于装饰的解决方案,不同于这个帖子因为它不那么黑客化,更透明,而且不会把decoration
s 和meta decoration
s 以复杂的方式混合在一起,这会非常有趣,但也许更适合回答合作伙伴问题. (但是,我对纯粹的 s 解决方案不感兴趣,decoration
在该解决方案中,必须以重新绘制正方形的方式“量化”步骤。)也就是说,我更喜欢对这个问题不加修饰的答案。
答案1
一种解决方案是尝试复制封闭路径,以使末端只是中间的一个普通点:(灵感来自Qrrbrbirlbel 的使用路径 TikZ 键)
\documentclass[tikz,border=3.14mm]{standalone}
\makeatletter
% This assumes that every closed path starts and ends with these tokens.
% That would make sense, but I do not know if it is true
\def\helpdoublepath\pgfsyssoftpath@movetotoken#1#2#3\pgfsyssoftpath@closepathtoken#4#5{%
\unexpanded{\pgfsyssoftpath@movetotoken{#1}{#2}#3\pgfsyssoftpath@linetotoken{#1}{#2}#3\pgfsyssoftpath@closepathtoken{#4}{#5}}%
}
\def\doublepath#1{%
\edef#1{\expandafter\helpdoublepath#1}%
}
\tikzset{double path/.code=\tikz@addmode{\pgfsyssoftpath@getcurrentpath\temp\doublepath\temp\pgfsyssoftpath@setcurrentpath\temp}}
\makeatother
\begin{document}
\begin{tikzpicture}
\draw[double path,dash pattern=on 5cm off 100cm,blue,ultra thick]
(0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle;
\begin{scope}[xshift=2cm]
\draw[blue,ultra thick]
(0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}