在 TikZ 中使用数学

在 TikZ 中使用数学

我知道之前已经有人问过并回答过这个问题,我需要把它{放在}周围,但是由于某种原因,这不起作用:

\draw (0,0) -- ({atan(1)}:{sqrt(2)});

知道为什么吗?

答案1

该问题已在 TikZ 官方版本(v.3.0.0 及更高版本)中修复。

这些信息之后答案还在继续……社区推广广告 - 2015



它需要更多的牛铃!!

对我来说,原因相当神秘,也许我们的巫师会解释的。最后你需要一个额外的空间:

\begin{tikzpicture}
\draw (0,0) -- ({atan(1)}:{sqrt(2)} );
\end{tikzpicture}

或者,值得注意的是,你在最后一次计算中没有放任何括号,并且跳过了右括号:

\begin{tikzpicture}
\draw (0,0) -- ({atan(1)}:sqrt(2);
\end{tikzpicture}

这简直就是黑魔法(或者是数学计算中多了一个括号)。所以我欢迎任何人编辑这个答案并启发我们。

我不知道这是否相关,但这里还有另一个更搞笑的(!?)

\usetikzlibrary{calc}
\begin{tikzpicture}
\draw (0,0) arc (0:45:({veclen(2,2)}););
\end{tikzpicture}

在这个例子中,你不能使用额外的空格。你需要省略最后一个括号。你也可以删除最后两个字符,);因为它们在分号后不起作用。

\begin{tikzpicture}
);
\end{tikzpicture}

答案2

更新下面的解决方法现在是pgf/tikz cvs 版本


正如我在评论中所说,这种行为与以下事实有关:TeX 删除分隔参数的括号举个例子来理解一下:

\documentclass{minimal}
\def\foo(#1){%
  \def\bar{#1}%
  \show\bar}
\def\test{{test}}
\show\test
\foo(\test)
\begin{document}
\end{document}

输出:

\test=macro:->{test}.

\bar=macro:->\test .

tikz使用分隔参数在连续的宏调用中解析极坐标\tikz@...@parse@polar。因此,一个简单的解决方法是保护“内部宏调用”中的所有分隔参数(即在第一个使用()分隔参数的宏和最后一个宏之间)。这样,由于每次调用这些“内部”宏时都会删除括号,因此不会有任何副作用(我在这里可能错了)。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\makeatletter
% Code from tikz.code.tex
\def\tikz@parse@polar#1(#2:#3){%
  % Braces surrounding #2 or #3 eventually disapeared
  \pgfutil@ifundefined{tikz@polar@dir@#2}
  % So we put them back
  {\tikz@@parse@polar#1({#2}:{#3})}
  {\tikz@@parse@polar#1(\csname tikz@polar@dir@#2\endcsname:#3)}%
}
\def\tikz@@parse@polar#1(#2:#3){%
  % Again braces surrounding #2 or #3 were stripped
  \pgfutil@in@{ and }{#3}%
  \ifpgfutil@in@%
  % So we put them back
    \edef\tikz@args{({#2}:#3)}%
  \else%
    \edef\tikz@args{({#2}:{#3} and {#3})}%
  \fi%
  \expandafter\tikz@@@parse@polar\expandafter#1\tikz@args%
}
\makeatother
\begin{document}
\begin{tikzpicture}
  \draw (0,0) -- ({atan(1)}:{sqrt(2)});
  \draw[semitransparent,thick,red] (0,0) -- (45:1.41);
\end{tikzpicture}
\end{document}

答案3

另一种选择是预先计算长度:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
   \pgfmathsetlengthmacro{\radius}{sqrt(5+2*sqrt(3))*1cm}
   \draw (0,0) -- ({atan(1)}:\radius);
\end{tikzpicture}

\end{document}

相关内容