TikZ 的数学和计算与 PDFLaTeX 和 LuaLaTeX 中的错误:解决方法?

TikZ 的数学和计算与 PDFLaTeX 和 LuaLaTeX 中的错误:解决方法?

我们可以使用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%
  }%
}

相关内容