我们可以使用calc
里面的库tikzmath
来做坐标计算。
如果我们想计算类似的东西\p3=(0,0)!.5!(2,0);
(内部和外部函数),一切都会顺利进行。但如果我们想要像这样的旋转,\p3=(0,0)!.5!90:(2,0);
就会发生以下情况:
- 如果我们在函数中使用这种计算,并使用 PDFLaTeX 或 LuaLaTeX 进行编译,那么之后所有的坐标都会放错位置。
- 如果我们在函数之外进行相同的计算或者使用 XeLaTex 进行编译,一切都正常。
以下是测试代码:
\documentclass[tikz,border=7pt,convert={density=3500}]{standalone}
\usetikzlibrary{calc,math}
\begin{document}
\begin{tikzpicture}
\draw (0,0) rectangle (1,1);
\tikzmath{
% function supposed to draw (0,0) -- (0,1) in red
function test(\n){ % useless \n parameter
coordinate \p;
\p1 = (0,0); \p2 = (2,0);
\p3 = (\p1)!.5!90:(\p2);
{\draw[red,thick] (\p1) -- (\p3);};
};
% same code outside function : draw (0,0) -- (0,1) in green
coordinate \p;
\p1 = (0,0); \p2 = (2,0);
\p3 = (\p1)!.5!90:(\p2);
{\draw[green,ultra thick] (\p1) -- (\p3);};
test(1);
}
\end{tikzpicture}
\end{document}
以下是使用 PDFLaTeX(与 LuaLaTeX 相同)编译的(糟糕)结果:
以下是使用 XeLaTeX 编译的(良好)结果:
问题是 :我们能解决这个错误吗?
一些评论:
- 这种行为与我们观察到的非常相似在这个问题中. 继Mark Wibrow 的回答,我们可以怀疑“没有
nullfont
问题”。例如,如果:
活动角色产生一些输出,则可能会发生这种情况。 - 如果我们
test(1)
在定义之后立即调用,那么两行都会放错位置。 - 我必须将
test
一个无用的参数放入函数中\n
,因为我们不能拥有没有参数的函数tikzmath
。对我来说,这是一种奇怪的行为。
答案1
本例中的错误是calc
库中的定义中\tikz@cc@scan@rot
缺少一行%
末尾的字符,这会影响坐标计算中角度的解析,例如解析90:(0,1)
。但(0,0)!.5!90:(0,1)
我不知道为什么这没有影响xelatex
。
更正后的定义应如下:
\def\tikz@cc@scan@rot#1{%
\pgfutil@ifnextchar({%)
\tikz@scan@one@point#1% normal
}%
{% <- this was missing
\def\tikz@cc@scan@rot@cmd{#1}%
\ifnum\the\catcode`\:=\active\relax%
\expandafter\tikz@cc@scan@one@rot@active%
\else%
\expandafter\tikz@cc@scan@one@rot@nonactive%
\fi%
}%
}