TikZ 的 `cycle` 和 `rectangle` 有 bug 吗?

TikZ 的 `cycle` 和 `rectangle` 有 bug 吗?

在下面的代码中,绘制矩形后cycle不会返回(-1,-1)路径的起始点。这是一个错误吗?

让我说清楚一点:首先我们的笔在(-1,-1)的初始点

\draw[red] (-1,-1) node{x};    

然后笔移动到(1,1)

\draw[red] (-1,-1) node{x} rectangle (1,1) node{y};

但笔没有移动到初始点

\draw[red] (-1,-1) node{x} rectangle (1,1) node{y}--cycle;

请注意,它可以与其他路径操作配合良好,例如parabola,,,...我在 Windows 10 上使用最新版本的 TikZ。arcto

在此处输入图片描述

\documentclass[tikz,border=1mm]{standalone}
\begin{document}
\begin{tikzpicture}
% cycle works well as usual
\draw[teal] (-1,1) node{a} parabola bend (0,0) (2,4) node{b}--cycle;
\draw[blue] (-1,0) node{m} arc(180:0:1) node{n}--cycle;
\draw[orange] (-2,0) node{p} to[out=80,in=120] (1,4) node{q}--cycle;

% cycle does not come back the initial point (-1,-1) of the path. Is it a bug?
\draw[red] (-1,-1) node{x} rectangle (1,1) node{y}--cycle;
%\draw[red] (-1,-1) node{x} rectangle (1,1) node{y}--(-1,-1);    %<<< work!
\end{tikzpicture}
\end{document}

附录1我在绘制汇丰银行的标志时遇到了这种情况。

在此处输入图片描述

附录 2。我发现decoration.markings改变了 TikZ 计算路径上位置的方式rectangle。加载此库后,(A) rectangle (B)意味着(A)--(A|-B)--(B)--(B|-A)--A,即:pos=0从 A 开始,然后逆时针前进,到达 B 处pos=0.5,然后继续逆时针前进,再回到 A 处。

在此处输入图片描述

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[gray!50] (-1,0) grid (5,5);
\draw (0,1) node{start} rectangle (4,4) node{end}
foreach \i in {.1,.2,...,.9} 
{node[pos=\i]{\pgfmathprintnumber{\i}}};
\end{tikzpicture}

\usetikzlibrary{decorations.markings}
\begin{tikzpicture}[markpos/.style={
decoration={markings,mark=at position #1
with {\node[red,scale=.7]{pos=\pgfmathprintnumber{#1}};}
          },
postaction={decorate}}]

\draw[gray!50] (-1,0) grid (5,5);
\foreach \i in {.1,.2,...,.9}{ 
\draw[markpos=\i] (0,1) node{start} rectangle (4,4) node{end};}
\end{tikzpicture}
\end{document}

使用时情况会更有趣(跳起来pos=0.7pos=0.8

\foreach \i in {.1,.2,...,.9}{ 
\draw[markpos=\i] (0,1) node{start} rectangle (4,4) node{end}--(0,1);}

在此处输入图片描述

答案1

我不一定同意这些评论,但我认为你说得有道理 (+1)。要了解原因,让我们看看

\draw[red] (-1,-3) node{x} rectangle (1,-1) node{y}
foreach \X in {0,0.2,...,1} {node[pos=\X]{\pgfmathprintnumber{\X}}};

生成:

在此处输入图片描述

也就是说,包含矩形pos=0第一角和第二角的路径。可以利用这一点,例如pos=1

\newcommand{\RectCycle}{ coordinate[pos=0] (aux) -- (aux)}    
\draw[red] (-1,-6) node{x} rectangle (1,-4) node{y} \RectCycle;

产量

在此处输入图片描述

这似乎就是您要找的。重新定义矩形路径构造tikz.code.tex可能太危险了。

这是一个完整的例子。

\documentclass[tikz,border=1mm]{standalone}
\begin{document}
\begin{tikzpicture}
% cycle works well as usual
\draw[teal] (-1,1) node{a} parabola bend (0,0) (2,4) node{b}--cycle;
\draw[blue] (-1,0) node{m} arc(180:0:1) node{n}--cycle;
\draw[orange] (-2,0) node{p} to[out=80,in=120] (1,4) node{q}--cycle;

% cycle does not come back the initial point (-1,-1) of the path. Is it a bug?
\draw[red] (-1,-3) node{x} rectangle (1,-1) node{y}
foreach \X in {0,0.2,...,1} {node[pos=\X]{\pgfmathprintnumber{\X}}};

\newcommand{\RectCycle}{ coordinate[pos=0] (aux) -- (aux)}

\draw[red] (-1,-6) node{x} rectangle (1,-4) node{y} \RectCycle;

\end{tikzpicture}
\end{document}

相关内容