我尝试根据坐标列表绘制一条折线,但使用下面的代码,线的每个段的起点都会向右移动,并且使用 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}