在 tikz 图片中使用 let 的正确语法是什么?

在 tikz 图片中使用 let 的正确语法是什么?

我正在看这个回答 但仍然无法正确理解语法。

我有这个例子来绘制一条长度为 2 个单位的线,效果很好:

\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,calc,decorations.markings}
\begin{document}
\begin{tikzpicture}
\draw  (0,0) -- ({2*cos(30)},{2*sin(30)});
\end{tikzpicture}
\end{document}

我想将长度设为变量。所以我写道(按照上面链接中的答案)

\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,calc,decorations.markings}
\begin{tikzpicture}
\draw let \r1={2} in 
        (0,0) -- ({\r1*cos(30)},{\r1*sin(30)});
\end{tikzpicture}
\end{document}

但这会出现语法错误

    Package tikz Error: ``\p'' or ``\n'' expected. \draw let \r

我觉得可能{会让人困惑。所以我把它改成了

\begin{tikzpicture}
\draw let \r1={2} in (0,0) -- (\r1*{cos(30)},\r1*{sin(30)});
\end{tikzpicture}

仍然是错误。我不断尝试不同的方法,但都失败了。所以我放弃了。我知道在进行计算时需要在 tickz 中使用 {}。所以我不明白问题所在。

关于正确的语法有什么帮助吗?

更新

我也尝试过p1但是它给出了这个错误

\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,calc,decorations.markings}

\begin{tikzpicture}
\draw let \p1={2} in (0,0) -- ({\p1*cos(30)},{\p1*sin(30)});
\end{tikzpicture}
\end{document}

 Extra }, or forgotten \endgroup. \draw let \p1={2}

然后我尝试删除{}

 \draw let \p1={2} in (0,0) -- (\p1*cos(30),\p1*sin(30));

错误。我尝试{}只保持三角函数的周围

  \draw let \p1={2} in (0,0) -- (\p1*{cos(30)},\p1*{sin(30)});

错误。我也试过了

   \draw let \p1={2} in (0,0) -- ({\p1}*{cos(30)},{\p1}*{sin(30)});

错误。

Tikz 语法对我来说很神秘。

答案1

2是一个数字,因此let赋值将是\n1\n{r1}如果变量被命名为1r1\p需要一个点,例如\p{1} = (3, 4)\x1然后\y1选择X\p1.的分量\r未定义。

\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,calc,decorations.markings}

\begin{document}
\begin{tikzpicture}
\draw let \n1={2} in
        (0,0) -- ({\n1*cos(30)},{\n1*sin(30)});
\end{tikzpicture}
\end{document}

使用新math库,\r1可以定义为数组变量\r

\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,calc,decorations.markings,math}

\begin{document}
\begin{tikzpicture}
\draw[evaluate={
  \r1=2;
}]
  (0,0) -- ({\r1*cos(30)},{\r1*sin(30)});
\end{tikzpicture}
\end{document}

答案2

我对 let 的功能感到困惑,而不是对语法感到困惑。

let语法(以及一般的库)的主要思想calc不是进行任意计算或数值分配。有pgfmath相关的宏。

letx,y为图形计算(如定义点和查找其坐标等)提供了良好的前端。

因此,它只理解两件事,数字和点,它通过起始字母p或来理解它们n。如果它偶然发现了,p它就会开始解析点定义,就像它在路径上所做的那样,还会定义两个额外的宏xy

例如,你可以这样说

\p1=($(a)-(b)$), \p{aaaa} = (a|-b)

那么它已经自动提供给你\x1,\y1第一个点坐标和\x{aaaa},\y{aaaa}第二个点坐标,以便你可以在数字运算中使用它。

\n宏是数字,它们用\pgfmath引擎进行解析,并且可以稍后与其他宏一起使用。

这里的问题是r不存在因此错误是正确的而且也不2是一个点所以不能是的正确语法\p1

相关内容