亲爱的 LaTeX/TikZ 用户。我显然误解了 TikZ 如何处理坐标定义。我试图在预定义的点之间绘制一条贝塞尔曲线,但 TikZ 抱怨只要目标点是定义的坐标(此处(B)
)而不是文字坐标(此处(10,10)
),编译就会失败并出现以下错误:
! Package PGF Math Error: Unknown function `up' (in 'up').
See the PGF Math package documentation for explanation.
Type H <return> for immediate help.
...
l.16 \draw (A) to [out=down,in=up] (B)
;
?
我尝试用 Google 搜索,但似乎找不到这个特定的错误。我做错了什么?
这是一个最小的工作示例:
\documentclass[]{article}
\usepackage{tikz}
% EDIT: This is for workaround
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0,1);
\coordinate (B) at (10,10);
% This will work
\draw (0,1) to [out=down,in=up] (10,10);
% So will this
\draw (A) to [out=down,in=up] (10,10);
% And this
\draw (A) -- (B);
% But these wont
% \draw (A) to [out=down,in=up] (B);
% \draw (0,1) to [out=down,in=up] (B);
% EDIT: Added the following workaround:
\draw ($(A)$) to [out=down,in=up] ($(B)$);
\end{tikzpicture}
\end{document}
编辑
我找到了一个解决方法,但它让我更加困惑。使用\tikzlibrary{calc}
和替换(B)
可以($(B)$)
解决问题,但我不明白为什么。($...$)
的环境calc
允许计算点,但($(B)$)
与有何不同/为什么不同(B)
?
答案1
问题是,如果您使用命名坐标(或节点)作为目标,tikz 将使用该值作为锚点。但节点中in
没有锚点。这意味着(将设置目标)或(将设置目标)将起作用,但不会起作用,因为不存在。up
in=90
B.90
in=north
B.north
in=up
B.up
您的解决方法是,在这种情况下,目标转换为绝对坐标(0.0pt,28.45274pt)并且 tikz 不会尝试使用该in
值作为锚点。
\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0,1);
\coordinate (B) at (10,10);
\draw (A) to [out=down,in=90] (B);
\draw (A) to [out=down,in=north] (B);
%won't work
% \draw (A) to [out=down,in=up] (B);
\draw (A) to [out=down,in=up] ($(B)$);
\end{tikzpicture}
\end{document}