使用 tikz 的弧度时出现问题

使用 tikz 的弧度时出现问题

我最初的问题发生在此代码中:

\def\a{pi/2}
\pgfmathparse{\a r}\pgfmathresult
output : 89.99937

当我修改宏\a\def\a{pi}

我收到错误:Package PGF Math Error: Unknown function 'pir' (in 'pir')。在这种情况下,一个不令人满意的解决方案是 \def\a{pi/1}

也有可能

\edef\tp{\noexpand \pgfmathparse{pi r}}\tp%
\pgfmathresult

output: 179.99962

尝试修改此 Jake 代码时也会出现此问题如何计算弧度坐标

杰克给出了这样的答案:

\tikz \draw (1,0) -- ({cos(pi/4 r)}, {sin(pi/4 r)});

\def\a{pi}
 \tikz \draw (1,0) -- ({cos(\a r)}, {sin(\a r)});

也存在同样的问题。

第一个问题是:如何简单地避免这个问题?或者如何以安全的方式将弧度转换为度?

另一个问题是:是否可以使用xfp其他工具来进行转换?

答案1

使用\def\a{pi}\pgfmathparse{\a r}\draw (1,0) -- ({cos(\a r)}, {sin(\a r)})引发错误,因为 i)在解析表达式之前对其pgfmath进行了处理,并且 ii)跳过了 (控制字(反斜杠后跟一个或多个 catcode 为 11 的字符))后面的空格。因此,准备解析的表达式始终包含,而不是。\edef\apirpi r

在问题评论中,

  • 我的第一个建议\def\a{pi\space}是确保在和\edef之间留出一个空格(扩展为正常的空格字符)。在控制字后保留空格字符的常用技巧可能pir\space不行这里:
    • \def\a{pi\ }不起作用,因为\它不可扩展并且pgfmath解析器无法处理它。
    • \def\a{pi}with\pgfmathparse{\a{} r}也不起作用,因为{}之后不会消失\edef,并且花括号表示pgfmath表达式中的类似数组的结构。
  • r第二个建议是用函数形式替换后缀运算符degcos(\a r)-> cos(deg(pi))

这是第三个:您可以将伪常量定义为零参数pgfmath函数。

\documentclass{article}
\usepackage{tikz}

\makeatletter
% option 1
\tikzset{
  declare function={
    constA=pi;
  }
}

% option 2
\pgfmathdeclarefunction{constB}{0}{%
  \begingroup
    \pgfmathparse{pi}%
    \pgfmathreturn{\pgfmathresult pt}% assign to a length is the most robust way
  \endgroup%
}%
\makeatother

\begin{document}
\pgfmathprint{constA r},
\pgfmathprint{constB r}

\tikz \draw (1,0) -- ({cos(constA r)}, {sin(constB r)}) ;
\end{document}

注意,如果函数有一个字母的名称,a例如declare function={ a=pi; }那么您将遇到尚未解决的 pgf 问题https://github.com/pgf-tikz/pgf/issues/1077

顺便说一句,\pgfmathparse不是完全可扩展的,因此书写\edef\tp{\pgfmathparse{...}}是危险的,并且不能保证这个\edef和接下来的使用\tp在未来的版本中不会出现错误。


另一个问题是:是否可以使用xfp其他工具来进行转换?

xfp是的,这是可能的。\fpeval(或等效的 latex3 函数\fp_eval:n)是完全可扩展的(有时比更准确),因此在表达式中pgfmath使用它是有效的,只是有点奇怪。\fpevalpgfmath

LaTeX3 模块l3fp将其定义pi为正常的 3.1415... 常数,但deg作为另一个持续的表示每度弧度。因此\pgfmathprint{pi r}\fpeval{pi/deg}进行相同的弧度到度的转换。

\documentclass{article}
\usepackage{pgfmath}
\usepackage{xfp}

\begin{document}
\def\a{pi}

\pgfmathprint{sin(\fpeval{\a/deg})}, % =  0.0
\pgfmathprint{cos(\fpeval{\a/deg})}  % = -1.0
\end{document}

相关内容