我在使用 Tikz 时遇到了问题。代码如下:
\begin{tikzpicture}[scale=0.6]
% Variables
\def\mu{0.1}
\def\R{10}
%Celestial bodies
\draw [thick, fill=yellow] (0,0) circle (1);
\draw [thick, fill=cyan] (\R,0) circle (0.25);
% Lagrangian points
\node at (\R*{1-{\mu/3}^{1/3}},0) {\color{orange}{\huge$\bullet$}}; %L1
\node at (\R*{1+{\mu/3}^{1/3}},0) {\color{orange}{\huge$\bullet$}}; %L2
\node at (-\R*{1+5/12*\mu},0) {\color{orange}{\huge$\bullet$}}; %L3
\node at (\R*{1/2*{1-2*\mu}},\R*sqrt(3)/2) {\color{orange}{\huge$\bullet$}}; %L4
\node at (\R*{1/2*{1-2*\mu}},-\R*sqrt(3)/2) {\color{orange}{\huge$\bullet$}}; %L5
\end{tikzpicture}
这是我收到的错误:
! Missing number, treated as zero.
<to be read again>
{
l.87 \node at (\R*{1-{\mu/3}^{1/3}},0)
{\color{orange}{\huge$\bullet$}}; %L1
A number should have been here; I inserted `0'.
我发现这是 Tikz 的一个常见错误,但我不明白为什么它不起作用。这可能是一个愚蠢的错误,有人能告诉我哪里出了问题吗?
答案1
存在三个问题:
如果您在坐标系中进行计算,则必须用括号将其括起来:
({\R*sqrt(3)},0)
在操作内部,使用圆括号而不是大括号进行分组。
固定代码:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=0.6]
% Variables
\newcommand{\muu}{0.1}
\newcommand{\R}{10}
%Celestial bodies
\draw [thick, fill=yellow] (0,0) circle (1);
\draw [thick, fill=cyan] (\R,0) circle (0.25);
\node at ({\R*(1-(\muu/3)^(1/3))},0) {\color{orange}{\huge$\bullet$}}; %L1
\node at ({\R*(1+(\muu/3)^(1/3))},0) {\color{orange}{\huge$\bullet$}}; %L2
\node at ({-\R*(1+5/12*\muu)},0) {\color{orange}{\huge$\bullet$}}; %L3
\node at ({\R*(1/2*(1-2*\muu))},{\R*sqrt(3)/2}) {\color{orange}{\huge$\bullet$}}; %L4
\node at ({\R*(1/2*(1-2*\muu))},{-\R*sqrt(3)/2}) {\color{orange}{\huge$\bullet$}}; %L5
\end{tikzpicture}
\end{document}
第三个问题:
正如 Jasper 所说,\def
除非你对自己所做的事情非常确定,否则请避免使用。\mu
你定义的已经存在(希腊字母 μ)。
如果您使用\newcommand
,LaTeX 会告诉您正在重新定义现有的宏。
1这还不是全部。当 Ti钾Z 发现一个(
它知道它正在读取一个坐标。它还期望下一个)
将结束该坐标。
因此当 Ti钾Z 发现(\R*sqrt(3),0)
,它将其理解\R*sqrt(3
为坐标,这很糟糕,而且它仍然得到了一个,0)
after,这更糟糕。但是当你将表达式分组在括号内时, 内的所有内容{...}
将被视为单个标记,它将被传递给数学解释器来执行其工作。
所以每当你有表情带括号,你必须把它们藏在里面{...}
。虽然不用括号括起表达式也没什么坏处。
感谢@hpekristiansen 指出这一点!