tikz foreach 与 veclen 的问题

tikz foreach 与 veclen 的问题

我尝试根据坐标列表绘制一条折线,但使用下面的代码,线的每个段的起点都会向右移动,并且使用 veclen 计算的线段长度也会以某种方式增加,而实际距离保持不变。

在此处输入图片描述

\documentclass[tikz,border=1cm]{standalone}

\usepackage{printlen}
\uselengthunit{cm}
\newlength{\tmpdim}

\begin{document}     
\begin{tikzpicture}[x=1cm,y=1cm]
    \draw[line width=1pt] (0,0) grid (8,3);

    \def\lastx{(0,2)}
    \def\vertA{(1,2),(2,2),(3,2),(4,2),(5,2)}

    \foreach \x [count=\xi from 2,remember=\x as \lastx, evaluate=\x as \n1 using {veclen(\lastx,\x)}] in \vertA {
        \draw[blue, line width=2pt] \lastx -- \x node [midway,above] {\n1};
        \fill[red] \x circle (0.1);
        \node[red,below] at \x {\xi};
}
\end{tikzpicture}

\end{document}

当我移除该evaluate=\x as \n1 using {veclen(\lastx,\x)}部分时,图纸是正确的。

另外,如何摆脱语句的输出\def\vertA

答案1

有两个问题。首先,\n1是您可以在语法中使用的东西calc,但不能在 中使用,evaluate=因为这需要普通的宏,而普通的宏不能包含数字。然后,您尝试将其应用于veclen形式的坐标(x,y)。但是,veclen需要向量的分量。这就是您看到奇怪输出的原因。如果循环坐标,则需要提取它们的分量以应用veclen。以下实现了这一点。

\documentclass[tikz,border=1cm]{standalone}

\usepackage{printlen}
\uselengthunit{cm}
\newlength{\tmpdim}
\def\parsecoord(#1,#2)>(#3,#4){% 
\edef#3{#1}% 
\edef#4{#2}% 
} 
\begin{document}     
\begin{tikzpicture}[x=1cm,y=1cm]
    \draw[line width=1pt] (0,0) grid (8,3);

    \def\lastx{(0,2)}
    \def\vertA{(1,2),(2,2),(3,2),(4,2),(5,2)}

    \foreach \x [count=\xi from 2,remember=\x as \lastx] in \vertA {
        \edef\temp{\noexpand\parsecoord\lastx>(\noexpand\myoldx,\noexpand\myoldy)}\temp
        \edef\temp{\noexpand\parsecoord\x>(\noexpand\myx,\noexpand\myy)}\temp
        \pgfmathsetmacro{\vl}{veclen(\myx-\myoldx,\myy-\myoldy)}
        \draw[blue, line width=2pt] \lastx -- \x node [midway,above] {\vl};
        \fill[red] \x circle (0.1);
        \node[red,below] at \x {\xi};
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容