![在 tikz 图片中使用 let 的正确语法是什么?](https://linux22.com/image/312256/%E5%9C%A8%20tikz%20%E5%9B%BE%E7%89%87%E4%B8%AD%E4%BD%BF%E7%94%A8%20let%20%E7%9A%84%E6%AD%A3%E7%A1%AE%E8%AF%AD%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我正在看这个回答 但仍然无法正确理解语法。
我有这个例子来绘制一条长度为 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}
如果变量被命名为1
或r1
。\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
相关的宏。
let
x,y
为图形计算(如定义点和查找其坐标等)提供了良好的前端。
因此,它只理解两件事,数字和点,它通过起始字母p
或来理解它们n
。如果它偶然发现了,p
它就会开始解析点定义,就像它在路径上所做的那样,还会定义两个额外的宏x
和y
。
例如,你可以这样说
\p1=($(a)-(b)$), \p{aaaa} = (a|-b)
那么它已经自动提供给你\x1,\y1
第一个点坐标和\x{aaaa},\y{aaaa}
第二个点坐标,以便你可以在数字运算中使用它。
\n
宏是数字,它们用\pgfmath
引擎进行解析,并且可以稍后与其他宏一起使用。
这里的问题是r
不存在因此错误是正确的而且也不2
是一个点所以不能是的正确语法\p1
。